void CSSStyleRule::setSelectorText(const String& selectorText) { Document* doc = 0; StyleSheet* ownerStyleSheet = m_style->stylesheet(); if (ownerStyleSheet) { if (ownerStyleSheet->isCSSStyleSheet()) doc = static_cast<CSSStyleSheet*>(ownerStyleSheet)->document(); if (!doc) doc = ownerStyleSheet->ownerNode() ? ownerStyleSheet->ownerNode()->document() : 0; } if (!doc) doc = m_style->node() ? m_style->node()->document() : 0; if (!doc) return; CSSParser p; CSSSelectorList selectorList; p.parseSelector(selectorText, doc, selectorList); if (!selectorList.first()) return; String oldSelectorText = this->selectorText(); m_selectorList.adopt(selectorList); if (this->selectorText() == oldSelectorText) return; doc->styleSelectorChanged(DeferRecalcStyle); }
CSSStyleSheet::CSSStyleSheet(const StyleSheet &other) { if (!other.isCSSStyleSheet()) impl = 0; else operator=(other); }
CSSStyleSheet* InspectorCSSStore::inspectorStyleSheet(Document* ownerDocument, bool createIfAbsent, long callId) { DocumentToStyleSheetMap::iterator it = m_documentNodeToInspectorStyleSheetMap.find(ownerDocument); if (it != m_documentNodeToInspectorStyleSheetMap.end()) return it->second.get(); if (!createIfAbsent) return 0; ExceptionCode ec = 0; RefPtr<Element> styleElement = ownerDocument->createElement("style", ec); if (!ec) styleElement->setAttribute("type", "text/css", ec); if (!ec) ownerDocument->head()->appendChild(styleElement, ec); if (ec) { m_inspectorController->inspectorFrontend()->didAddRule(callId, ScriptValue::undefined(), false); return 0; } StyleSheetList* styleSheets = ownerDocument->styleSheets(); StyleSheet* styleSheet = styleSheets->item(styleSheets->length() - 1); if (!styleSheet->isCSSStyleSheet()) { m_inspectorController->inspectorFrontend()->didAddRule(callId, ScriptValue::undefined(), false); return 0; } CSSStyleSheet* inspectorStyleSheet = static_cast<CSSStyleSheet*>(styleSheet); m_documentNodeToInspectorStyleSheetMap.set(ownerDocument, inspectorStyleSheet); return inspectorStyleSheet; }
// static CSSStyleSheet* InspectorCSSAgent::parentStyleSheet(StyleBase* styleBase) { if (!styleBase) return 0; StyleSheet* styleSheet = styleBase->stylesheet(); if (styleSheet && styleSheet->isCSSStyleSheet()) return static_cast<CSSStyleSheet*>(styleSheet); return 0; }
bool StyleSheetCandidate::canBeActivated(const String& currentPreferrableName) const { StyleSheet* sheet = this->sheet(); if (!sheet || sheet->disabled() || !sheet->isCSSStyleSheet()) return false; const AtomicString& title = this->title(); if (!isEnabledViaScript() && !title.isEmpty() && title != currentPreferrableName) return false; if (isAlternate() && title.isEmpty()) return false; return true; }
void InspectorCSSAgent::getAllStyles(RefPtr<InspectorArray>* styles) { Vector<Document*> documents = m_domAgent->documents(); for (Vector<Document*>::iterator it = documents.begin(); it != documents.end(); ++it) { StyleSheetList* list = (*it)->styleSheets(); for (unsigned i = 0; i < list->length(); ++i) { StyleSheet* styleSheet = list->item(i); if (styleSheet->isCSSStyleSheet()) { InspectorStyleSheet* inspectorStyleSheet = bindStyleSheet(static_cast<CSSStyleSheet*>(styleSheet)); (*styles)->pushString(inspectorStyleSheet->id()); } } } }
void ShadowTreeStyleSheetCollection::collectStyleSheets(StyleEngine* collections, Vector<RefPtr<StyleSheet> >& styleSheets, Vector<RefPtr<CSSStyleSheet> >& activeSheets) { if (document()->settings() && !document()->settings()->authorAndUserStylesEnabled()) return; DocumentOrderedList::iterator begin = m_styleSheetCandidateNodes.begin(); DocumentOrderedList::iterator end = m_styleSheetCandidateNodes.end(); for (DocumentOrderedList::iterator it = begin; it != end; ++it) { Node* node = *it; StyleSheet* sheet = 0; CSSStyleSheet* activeSheet = 0; if (!node->isHTMLElement() || !node->hasTagName(styleTag)) continue; Element* element = toElement(node); AtomicString title = element->getAttribute(titleAttr); bool enabledViaScript = false; sheet = toHTMLStyleElement(node)->sheet(); if (sheet && !sheet->disabled() && sheet->isCSSStyleSheet()) activeSheet = static_cast<CSSStyleSheet*>(sheet); // FIXME: clarify how PREFERRED or ALTERNATE works in shadow trees. // Should we set preferred/selected stylesheets name in shadow trees and // use the name in document? AtomicString rel = element->getAttribute(relAttr); if (!enabledViaScript && sheet && !title.isEmpty()) { if (collections->preferredStylesheetSetName().isEmpty()) { if (element->hasLocalName(styleTag) || !rel.contains("alternate")) { collections->setPreferredStylesheetSetName(title); collections->setSelectedStylesheetSetName(title); } } if (title != collections->preferredStylesheetSetName()) activeSheet = 0; } if (rel.contains("alternate") && title.isEmpty()) activeSheet = 0; if (sheet) styleSheets.append(sheet); if (activeSheet) activeSheets.append(activeSheet); } }
void ShadowTreeStyleSheetCollection::collectStyleSheets(StyleEngine* engine, StyleSheetCollection& collection) { DocumentOrderedList::iterator begin = m_styleSheetCandidateNodes.begin(); DocumentOrderedList::iterator end = m_styleSheetCandidateNodes.end(); for (DocumentOrderedList::iterator it = begin; it != end; ++it) { Node* node = *it; StyleSheet* sheet = 0; CSSStyleSheet* activeSheet = 0; if (!isHTMLStyleElement(*node)) continue; HTMLStyleElement* element = toHTMLStyleElement(node); const AtomicString& title = element->fastGetAttribute(titleAttr); bool enabledViaScript = false; sheet = element->sheet(); if (sheet && !sheet->disabled() && sheet->isCSSStyleSheet()) activeSheet = toCSSStyleSheet(sheet); // FIXME: clarify how PREFERRED or ALTERNATE works in shadow trees. // Should we set preferred/selected stylesheets name in shadow trees and // use the name in document? if (!enabledViaScript && sheet && !title.isEmpty()) { if (engine->preferredStylesheetSetName().isEmpty()) { engine->setPreferredStylesheetSetName(title); engine->setSelectedStylesheetSetName(title); } if (title != engine->preferredStylesheetSetName()) activeSheet = 0; } const AtomicString& rel = element->fastGetAttribute(relAttr); if (rel.contains("alternate") && title.isEmpty()) activeSheet = 0; if (sheet) collection.appendSheetForList(sheet); if (activeSheet) collection.appendActiveStyleSheet(activeSheet); } }
InspectorStyleSheet* InspectorCSSAgent::viaInspectorStyleSheet(Document* document, bool createIfAbsent) { if (!document) { ASSERT(!createIfAbsent); return 0; } RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_documentToInspectorStyleSheet.get(document); if (inspectorStyleSheet || !createIfAbsent) return inspectorStyleSheet.get(); ExceptionCode ec = 0; RefPtr<Element> styleElement = document->createElement("style", ec); if (!ec) styleElement->setAttribute("type", "text/css", ec); if (!ec) { ContainerNode* targetNode; // HEAD is absent in ImageDocuments, for example. if (document->head()) targetNode = document->head(); else if (document->body()) targetNode = document->body(); else return 0; targetNode->appendChild(styleElement, ec); } if (ec) return 0; StyleSheetList* styleSheets = document->styleSheets(); StyleSheet* styleSheet = styleSheets->item(styleSheets->length() - 1); if (!styleSheet->isCSSStyleSheet()) return 0; CSSStyleSheet* cssStyleSheet = static_cast<CSSStyleSheet*>(styleSheet); String id = String::number(m_lastStyleSheetId++); inspectorStyleSheet = InspectorStyleSheet::create(id, cssStyleSheet, "inspector", m_domAgent->documentURLString(document)); m_idToInspectorStyleSheet.set(id, inspectorStyleSheet); m_cssStyleSheetToInspectorStyleSheet.set(cssStyleSheet, inspectorStyleSheet); m_documentToInspectorStyleSheet.set(document, inspectorStyleSheet); return inspectorStyleSheet.get(); }
void PageSerializer::serializeFrame(Frame* frame) { Document* document = frame->document(); KURL url = document->url(); if (!url.isValid() || url.protocolIs("about")) { // For blank frames we generate a fake URL so they can be referenced by their containing frame. url = urlForBlankFrame(frame); } if (m_resourceURLs.contains(url)) { // FIXME: We could have 2 frame with the same URL but which were dynamically changed and have now // different content. So we should serialize both and somehow rename the frame src in the containing // frame. Arg! return; } Vector<Node*> nodes; SerializerMarkupAccumulator accumulator(this, document, &nodes); TextEncoding textEncoding(document->charset()); CString data; if (!textEncoding.isValid()) { // FIXME: iframes used as images trigger this. We should deal with them correctly. return; } String text = accumulator.serializeNodes(document->documentElement(), 0, IncludeNode); CString frameHTML = textEncoding.encode(text.characters(), text.length(), EntitiesForUnencodables); m_resources->append(Resource(url, document->suggestedMIMEType(), SharedBuffer::create(frameHTML.data(), frameHTML.length()))); m_resourceURLs.add(url); for (Vector<Node*>::iterator iter = nodes.begin(); iter != nodes.end(); ++iter) { Node* node = *iter; if (!node->isElementNode()) continue; Element* element = toElement(node); // We have to process in-line style as it might contain some resources (typically background images). retrieveResourcesForCSSDeclaration(element->style()); if (element->hasTagName(HTMLNames::imgTag)) { HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(element); KURL url = document->completeURL(imageElement->getAttribute(HTMLNames::srcAttr)); CachedImage* cachedImage = imageElement->cachedImage(); addImageToResources(cachedImage, url); } else if (element->hasTagName(HTMLNames::linkTag)) { HTMLLinkElement* linkElement = static_cast<HTMLLinkElement*>(element); StyleSheet* sheet = linkElement->sheet(); if (sheet && sheet->isCSSStyleSheet()) { KURL url = document->completeURL(linkElement->getAttribute(HTMLNames::hrefAttr)); serializeCSSStyleSheet(static_cast<CSSStyleSheet*>(sheet), url); ASSERT(m_resourceURLs.contains(url)); } } else if (element->hasTagName(HTMLNames::styleTag)) { HTMLStyleElement* styleElement = static_cast<HTMLStyleElement*>(element); StyleSheet* sheet = styleElement->sheet(); if (sheet && sheet->isCSSStyleSheet()) serializeCSSStyleSheet(static_cast<CSSStyleSheet*>(sheet), KURL()); } } for (Frame* childFrame = frame->tree()->firstChild(); childFrame; childFrame = childFrame->tree()->nextSibling()) serializeFrame(childFrame); }