void PageSerializer::serializeFrame(Frame* frame) { Document* document = frame->document(); URL url = document->url(); if (!url.isValid() || url.isBlankURL()) { // 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, 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). if (element->isStyledElement()) retrieveResourcesForProperties(toStyledElement(element)->inlineStyle(), document); if (isHTMLImageElement(element)) { HTMLImageElement* imageElement = toHTMLImageElement(element); URL url = document->completeURL(imageElement->getAttribute(HTMLNames::srcAttr)); CachedImage* cachedImage = imageElement->cachedImage(); addImageToResources(cachedImage, imageElement->renderer(), url); } else if (element->hasTagName(HTMLNames::linkTag)) { HTMLLinkElement* linkElement = toHTMLLinkElement(element); if (CSSStyleSheet* sheet = linkElement->sheet()) { URL url = document->completeURL(linkElement->getAttribute(HTMLNames::hrefAttr)); serializeCSSStyleSheet(sheet, url); ASSERT(m_resourceURLs.contains(url)); } } else if (isHTMLStyleElement(element)) { if (CSSStyleSheet* sheet = toHTMLStyleElement(element)->sheet()) serializeCSSStyleSheet(sheet, URL()); } } for (Frame* childFrame = frame->tree().firstChild(); childFrame; childFrame = childFrame->tree().nextSibling()) serializeFrame(childFrame); }
JSValue jsHTMLLinkElementSheet(ExecState* exec, JSValue slotBase, const Identifier&) { JSHTMLLinkElement* castedThis = static_cast<JSHTMLLinkElement*>(asObject(slotBase)); UNUSED_PARAM(exec); HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(castedThis->impl()); JSValue result = toJS(exec, castedThis->globalObject(), WTF::getPtr(imp->sheet())); return result; }
JSValue* JSHTMLLinkElement::getValueProperty(ExecState* exec, int token) const { switch (token) { case DisabledAttrNum: { HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(impl()); return jsBoolean(imp->disabled()); } case CharsetAttrNum: { HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(impl()); return jsString(exec, imp->charset()); } case HrefAttrNum: { HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(impl()); return jsString(exec, imp->href()); } case HreflangAttrNum: { HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(impl()); return jsString(exec, imp->hreflang()); } case MediaAttrNum: { HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(impl()); return jsString(exec, imp->media()); } case RelAttrNum: { HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(impl()); return jsString(exec, imp->rel()); } case RevAttrNum: { HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(impl()); return jsString(exec, imp->rev()); } case TargetAttrNum: { HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(impl()); return jsString(exec, imp->target()); } case TypeAttrNum: { HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(impl()); return jsString(exec, imp->type()); } case SheetAttrNum: { HTMLLinkElement* imp = static_cast<HTMLLinkElement*>(impl()); return toJS(exec, WTF::getPtr(imp->sheet())); } case ConstructorAttrNum: return getConstructor(exec); } return 0; }
void DocumentStyleSheetCollection::collectActiveStyleSheets(Vector<RefPtr<StyleSheet> >& sheets) { if (m_document->settings() && !m_document->settings()->authorAndUserStylesEnabled()) return; StyleSheetCandidateListHashSet::iterator begin = m_styleSheetCandidateNodes.begin(); StyleSheetCandidateListHashSet::iterator end = m_styleSheetCandidateNodes.end(); for (StyleSheetCandidateListHashSet::iterator it = begin; it != end; ++it) { Node* n = *it; StyleSheet* sheet = 0; if (n->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) { // Processing instruction (XML documents only). // We don't support linking to embedded CSS stylesheets, see <https://bugs.webkit.org/show_bug.cgi?id=49281> for discussion. ProcessingInstruction* pi = static_cast<ProcessingInstruction*>(n); sheet = pi->sheet(); #if ENABLE(XSLT) // Don't apply XSL transforms to already transformed documents -- <rdar://problem/4132806> if (pi->isXSL() && !m_document->transformSourceDocument()) { // Don't apply XSL transforms until loading is finished. if (!m_document->parsing()) m_document->applyXSLTransform(pi); return; } #endif } else if ((n->isHTMLElement() && (n->hasTagName(linkTag) || n->hasTagName(styleTag))) #if ENABLE(SVG) || (n->isSVGElement() && n->hasTagName(SVGNames::styleTag)) #endif ) { Element* e = toElement(n); AtomicString title = e->getAttribute(titleAttr); bool enabledViaScript = false; if (e->hasTagName(linkTag)) { // <LINK> element HTMLLinkElement* linkElement = static_cast<HTMLLinkElement*>(n); if (linkElement->isDisabled()) continue; enabledViaScript = linkElement->isEnabledViaScript(); if (linkElement->styleSheetIsLoading()) { // it is loading but we should still decide which style sheet set to use if (!enabledViaScript && !title.isEmpty() && m_preferredStylesheetSetName.isEmpty()) { const AtomicString& rel = e->getAttribute(relAttr); if (!rel.contains("alternate")) { m_preferredStylesheetSetName = title; m_selectedStylesheetSetName = title; } } continue; } if (!linkElement->sheet()) title = nullAtom; } // Get the current preferred styleset. This is the // set of sheets that will be enabled. #if ENABLE(SVG) if (e->hasTagName(SVGNames::styleTag)) sheet = static_cast<SVGStyleElement*>(n)->sheet(); else #endif { if (e->hasTagName(linkTag)) sheet = static_cast<HTMLLinkElement*>(n)->sheet(); else // <STYLE> element sheet = toHTMLStyleElement(e)->sheet(); } // Check to see if this sheet belongs to a styleset // (thus making it PREFERRED or ALTERNATE rather than // PERSISTENT). AtomicString rel = e->getAttribute(relAttr); if (!enabledViaScript && !title.isEmpty()) { // Yes, we have a title. if (m_preferredStylesheetSetName.isEmpty()) { // No preferred set has been established. If // we are NOT an alternate sheet, then establish // us as the preferred set. Otherwise, just ignore // this sheet. if (e->hasTagName(styleTag) || !rel.contains("alternate")) m_preferredStylesheetSetName = m_selectedStylesheetSetName = title; } if (title != m_preferredStylesheetSetName) sheet = 0; } if (rel.contains("alternate") && title.isEmpty()) sheet = 0; } if (sheet) sheets.append(sheet); } }