QString QWebElement::styleProperty(const QString &name, StyleResolveStrategy strategy) const { if (!m_element || !m_element->isStyledElement()) return QString(); int propID = cssPropertyID(name); if (!propID) return QString(); CSSStyleDeclaration* style = static_cast<StyledElement*>(m_element)->style(); if (strategy == InlineStyle) return style->getPropertyValue(propID); if (strategy == CascadedStyle) { if (style->getPropertyPriority(propID)) return style->getPropertyValue(propID); // We are going to resolve the style property by walking through the // list of non-inline matched CSS rules for the element, looking for // the highest priority definition. // Get an array of matched CSS rules for the given element sorted // by importance and inheritance order. This include external CSS // declarations, as well as embedded and inline style declarations. DOMWindow* domWindow = m_element->document()->frame()->domWindow(); if (RefPtr<CSSRuleList> rules = domWindow->getMatchedCSSRules(m_element, "")) { for (int i = rules->length(); i > 0; --i) { CSSStyleRule* rule = static_cast<CSSStyleRule*>(rules->item(i - 1)); if (rule->style()->getPropertyPriority(propID)) return rule->style()->getPropertyValue(propID); if (style->getPropertyValue(propID).isEmpty()) style = rule->style(); } } return style->getPropertyValue(propID); } if (strategy == ComputedStyle) { if (!m_element || !m_element->isStyledElement()) return QString(); int propID = cssPropertyID(name); RefPtr<CSSComputedStyleDeclaration> style = computedStyle(m_element); if (!propID || !style) return QString(); return style->getPropertyValue(propID); } return QString(); }
CSSStyleDeclaration* InspectorStyleSheet::styleForId(const String& id) const { CSSStyleRule* rule = ruleForId(id); if (!rule) return 0; return rule->style(); }
void InspectorStyleSheet::revalidateStyle(CSSStyleDeclaration* pageStyle) { if (m_isRevalidating) return; m_isRevalidating = true; CSSStyleSheet* parsedSheet = m_parsedStyleSheet->cssStyleSheet(); for (unsigned i = 0, size = parsedSheet->length(); i < size; ++i) { StyleBase* styleBase = parsedSheet->item(i); CSSStyleRule* parsedRule = InspectorCSSAgent::asCSSStyleRule(styleBase); if (!parsedRule) continue; if (parsedRule->style() == pageStyle) { if (parsedRule->style()->cssText() != pageStyle->cssText()) innerSetStyleText(pageStyle, pageStyle->cssText()); break; } } m_isRevalidating = false; }
CSSStyleRule* InspectorStyleSheet::findPageRuleWithStyle(CSSStyleDeclaration* style) { for (unsigned i = 0, size = m_pageStyleSheet->length(); i < size; ++i) { CSSStyleRule* rule = InspectorCSSAgent::asCSSStyleRule(m_pageStyleSheet->item(i)); if (!rule) continue; if (rule->style() == style) return rule; } return 0; }
unsigned InspectorStyleSheet::ruleIndexByStyle(CSSStyleDeclaration* pageStyle) const { unsigned index = 0; for (unsigned i = 0, size = m_pageStyleSheet->length(); i < size; ++i) { CSSStyleRule* rule = InspectorCSSAgent::asCSSStyleRule(m_pageStyleSheet->item(i)); if (!rule) continue; if (rule->style() == pageStyle) return index; ++index; } return UINT_MAX; }
bool InspectorStyleSheet::setRuleSelector(const String& ruleId, const String& selector) { CSSStyleRule* rule = ruleForId(ruleId); if (!rule) return false; CSSStyleSheet* styleSheet = InspectorCSSAgent::parentStyleSheet(rule); if (!styleSheet || !ensureParsedDataReady()) return false; rule->setSelectorText(selector); RefPtr<CSSRuleSourceData> sourceData = ruleSourceDataFor(rule->style()); if (!sourceData) return false; const String& sheetText = m_parsedStyleSheet->text(); String newStyleSheetText = sheetText.substring(0, sourceData->selectorListRange.start); newStyleSheetText += selector; newStyleSheetText += sheetText.right(sheetText.length() - sourceData->selectorListRange.end); m_parsedStyleSheet->setText(newStyleSheetText); return true; }