HashMap<long, SourceRange> InspectorCSSStore::getRuleRangesForStyleSheet(CSSStyleSheet* styleSheet) { if (!styleSheet) return HashMap<long, SourceRange>(); RefPtr<CSSRuleList> originalRuleList = CSSRuleList::create(styleSheet, false); StyleSheetToOffsetsMap::iterator it = m_styleSheetToOffsets.find(styleSheet); HashMap<long, SourceRange> result; Vector<SourceRange>* offsetVector = 0; if (it == m_styleSheetToOffsets.end()) { InspectorResource* resource = m_inspectorController->resourceForURL(styleSheet->finalURL().string()); if (resource) { offsetVector = new Vector<SourceRange>; RefPtr<CSSStyleSheet> newStyleSheet = CSSStyleSheet::create(styleSheet->ownerNode()); CSSParser p; CSSParser::StyleRuleRanges ruleRangeMap; p.parseSheet(newStyleSheet.get(), resource->sourceString(), &ruleRangeMap); for (unsigned i = 0, length = newStyleSheet->length(); i < length; ++i) { CSSStyleRule* rule = asCSSStyleRule(newStyleSheet->item(i)); if (!rule) continue; HashMap<CSSStyleRule*, std::pair<unsigned, unsigned> >::iterator it = ruleRangeMap.find(rule); if (it != ruleRangeMap.end()) offsetVector->append(it->second); } m_styleSheetToOffsets.set(styleSheet, offsetVector); } } else offsetVector = it->second; if (!offsetVector) return HashMap<long, SourceRange>(); unsigned ruleIndex = 0; for (unsigned i = 0, length = styleSheet->length(); i < length; ++i) { ASSERT(ruleIndex < offsetVector->size()); CSSStyleRule* rule = asCSSStyleRule(styleSheet->item(i)); if (!rule) continue; result.set(bindRule(rule), offsetVector->at(ruleIndex)); ruleIndex++; } return result; }
PassRefPtr<InspectorArray> InspectorCSSAgent::buildArrayForRuleList(CSSRuleList* ruleList) { RefPtr<InspectorArray> result = InspectorArray::create(); if (!ruleList) return result.release(); for (unsigned i = 0, size = ruleList->length(); i < size; ++i) { CSSStyleRule* rule = asCSSStyleRule(ruleList->item(i)); if (!rule) continue; InspectorStyleSheet* styleSheet = bindStyleSheet(parentStyleSheet(rule)); if (styleSheet) result->pushObject(styleSheet->buildObjectForRule(rule)); } return result.release(); }