#include "Document.h"
#include "Element.h"
#include "HTMLHeadElement.h"
+#include "HTMLNames.h"
#include "HTMLParserIdioms.h"
#include "InspectorCSSAgent.h"
#include "InspectorPageAgent.h"
#include "InspectorValues.h"
#include "Node.h"
+#include "SVGNames.h"
#include "StyleSheetList.h"
#include "WebKitCSSKeyframesRule.h"
namespace WebCore {
+enum MediaListSource {
+ MediaListSourceLinkedSheet,
+ MediaListSourceInlineSheet,
+ MediaListSourceMediaRule,
+ MediaListSourceImportRule
+};
+
static PassRefPtr<InspectorObject> buildSourceRangeObject(const SourceRange& range)
{
RefPtr<InspectorObject> result = InspectorObject::create();
return result.release();
}
+static PassRefPtr<InspectorObject> buildMediaObject(const MediaList* media, MediaListSource mediaListSource, const String& sourceURL)
+{
+ RefPtr<InspectorObject> mediaObject = InspectorObject::create();
+ switch (mediaListSource) {
+ case MediaListSourceMediaRule:
+ mediaObject->setString("source", "mediaRule");
+ break;
+ case MediaListSourceImportRule:
+ mediaObject->setString("source", "importRule");
+ break;
+ case MediaListSourceLinkedSheet:
+ mediaObject->setString("source", "linkedSheet");
+ break;
+ case MediaListSourceInlineSheet:
+ mediaObject->setString("source", "inlineSheet");
+ break;
+ }
+ if (!sourceURL.isEmpty()) {
+ mediaObject->setString("sourceURL", sourceURL);
+ mediaObject->setNumber("sourceLine", media->lastLine());
+ }
+ mediaObject->setString("text", media->mediaText());
+ return mediaObject.release();
+}
+
static PassRefPtr<CSSRuleList> asCSSRuleList(CSSStyleSheet* styleSheet)
{
if (!styleSheet)
return 0;
}
+static void fillMediaListChain(CSSRule* rule, InspectorArray* mediaArray)
+{
+ MediaList* mediaList;
+ CSSRule* parentRule = rule;
+ String sourceURL;
+ while (parentRule) {
+ CSSStyleSheet* parentStyleSheet = 0;
+ bool isMediaRule = true;
+ if (parentRule->isMediaRule()) {
+ CSSMediaRule* mediaRule = static_cast<CSSMediaRule*>(parentRule);
+ mediaList = mediaRule->media();
+ parentStyleSheet = mediaRule->parentStyleSheet();
+ } else if (parentRule->isImportRule()) {
+ CSSImportRule* importRule = static_cast<CSSImportRule*>(parentRule);
+ mediaList = importRule->media();
+ parentStyleSheet = importRule->parentStyleSheet();
+ isMediaRule = false;
+ } else
+ mediaList = 0;
+
+ if (parentStyleSheet) {
+ sourceURL = parentStyleSheet->finalURL();
+ if (sourceURL.isEmpty())
+ sourceURL = InspectorDOMAgent::documentURLString(parentStyleSheet->findDocument());
+ } else
+ sourceURL = "";
+
+ if (mediaList && mediaList->length())
+ mediaArray->pushObject(buildMediaObject(mediaList, isMediaRule ? MediaListSourceMediaRule : MediaListSourceImportRule, sourceURL));
+
+ if (parentRule->parentRule())
+ parentRule = parentRule->parentRule();
+ else {
+ CSSStyleSheet* styleSheet = parentRule->parentStyleSheet();
+ while (styleSheet) {
+ mediaList = styleSheet->media();
+ if (mediaList && mediaList->length()) {
+ Document* doc = styleSheet->findDocument();
+ if (doc)
+ sourceURL = doc->url();
+ else if (!styleSheet->finalURL().isEmpty())
+ sourceURL = styleSheet->finalURL();
+ else
+ sourceURL = "";
+ mediaArray->pushObject(buildMediaObject(mediaList, styleSheet->ownerNode() ? MediaListSourceLinkedSheet : MediaListSourceInlineSheet, sourceURL));
+ }
+ parentRule = styleSheet->parentRule();
+ if (parentRule)
+ break;
+ styleSheet = styleSheet->parentStyleSheet();
+ }
+ }
+ }
+}
+
PassRefPtr<InspectorStyle> InspectorStyle::create(const InspectorCSSId& styleId, PassRefPtr<CSSStyleDeclaration> style, InspectorStyleSheet* parentStyleSheet)
{
return adoptRef(new InspectorStyle(styleId, style, parentStyleSheet));
return result.release();
}
+PassRefPtr<InspectorArray> InspectorStyle::buildArrayForComputedStyle() const
+{
+ RefPtr<InspectorArray> result = InspectorArray::create();
+ Vector<InspectorStyleProperty> properties;
+ populateAllProperties(&properties);
+
+ for (Vector<InspectorStyleProperty>::iterator it = properties.begin(), itEnd = properties.end(); it != itEnd; ++it) {
+ const CSSPropertySourceData& propertyEntry = it->sourceData;
+ RefPtr<InspectorObject> entry = InspectorObject::create();
+ entry->setString("name", propertyEntry.name);
+ entry->setString("value", propertyEntry.value);
+ result->pushObject(entry);
+ }
+
+ return result.release();
+}
+
// This method does the following preprocessing of |propertyText| with |overwrite| == false and |index| past the last active property:
// - If the last property (if present) has no closing ";", the ";" is prepended to the current |propertyText| value.
// - A heuristic formatting is attempted to retain the style structure.
if (propertyText.stripWhiteSpace().length()) {
RefPtr<CSSMutableStyleDeclaration> tempMutableStyle = CSSMutableStyleDeclaration::create();
- CSSParser p;
RefPtr<CSSStyleSourceData> sourceData = CSSStyleSourceData::create();
- p.parseDeclaration(tempMutableStyle.get(), propertyText + " " + bogusPropertyName + ": none", &sourceData);
+ CSSParser p;
+ p.parseDeclaration(tempMutableStyle.get(), propertyText + " " + bogusPropertyName + ": none", &sourceData, m_style->parentStyleSheet());
Vector<CSSPropertySourceData>& propertyData = sourceData->propertyData;
unsigned propertyCount = propertyData.size();
result->setObject("selectorRange", selectorRange.release());
}
+ RefPtr<InspectorArray> mediaArray = InspectorArray::create();
+
+ fillMediaListChain(rule, mediaArray.get());
+ if (mediaArray->length())
+ result->setArray("media", mediaArray.release());
+
return result.release();
}
Document* InspectorStyleSheet::ownerDocument() const
{
- return m_pageStyleSheet->document();
+ return m_pageStyleSheet->findDocument();
}
RefPtr<CSSRuleSourceData> InspectorStyleSheet::ruleSourceDataFor(CSSStyleDeclaration* style) const
if (m_origin == "user" || m_origin == "user-agent")
return false;
- if (!m_pageStyleSheet || !ownerDocument())
+ if (!m_pageStyleSheet || !ownerDocument() || !ownerDocument()->frame())
return false;
String error;
if (!ownerNode || ownerNode->nodeType() != Node::ELEMENT_NODE)
return false;
Element* ownerElement = static_cast<Element*>(ownerNode);
- if (ownerElement->tagName().lower() != "style")
+
+ if (!ownerElement->hasTagName(HTMLNames::styleTag)
+#if ENABLE(SVG)
+ && !ownerElement->hasTagName(SVGNames::styleTag)
+#endif
+ )
return false;
*result = ownerElement->innerText();
return true;
RefPtr<CSSMutableStyleDeclaration> tempDeclaration = CSSMutableStyleDeclaration::create();
CSSParser p;
- p.parseDeclaration(tempDeclaration.get(), m_styleText, result);
+ p.parseDeclaration(tempDeclaration.get(), m_styleText, result, m_element->document()->elementSheet());
return true;
}