String SVGImageLoader::sourceURI(const AtomicString& attribute) const { KURL base = element()->baseURI(); if (!base.isValid()) base = element()->document().baseURI(); return element()->document().completeURLWithOverride(stripLeadingAndTrailingHTMLSpaces(attribute), base); }
void HTMLObjectElement::parseAttribute(const QualifiedName& name, const AtomicString& value) { if (name == formAttr) formAttributeChanged(); else if (name == typeAttr) { m_serviceType = value.lower(); size_t pos = m_serviceType.find(";"); if (pos != notFound) m_serviceType = m_serviceType.left(pos); if (renderer()) setNeedsWidgetUpdate(true); } else if (name == dataAttr) { m_url = stripLeadingAndTrailingHTMLSpaces(value); if (renderer()) { setNeedsWidgetUpdate(true); if (isImageType()) { if (!m_imageLoader) m_imageLoader = adoptPtr(new HTMLImageLoader(this)); m_imageLoader->updateFromElementIgnoringPreviousError(); } } } else if (name == classidAttr) { m_classId = value; if (renderer()) setNeedsWidgetUpdate(true); } else if (name == onbeforeloadAttr) setAttributeEventListener(eventNames().beforeloadEvent, createAttributeEventListener(this, name, value)); else HTMLPlugInImageElement::parseAttribute(name, value); }
bool ScriptElement::requestScript(const String& sourceUrl) { Ref<Document> originalDocument(m_element.document()); if (!m_element.dispatchBeforeLoadEvent(sourceUrl)) return false; if (!m_element.inDocument() || &m_element.document() != &originalDocument.get()) return false; ASSERT(!m_cachedScript); if (!stripLeadingAndTrailingHTMLSpaces(sourceUrl).isEmpty()) { CachedResourceRequest request(ResourceRequest(m_element.document().completeURL(sourceUrl))); String crossOriginMode = m_element.fastGetAttribute(HTMLNames::crossoriginAttr); if (!crossOriginMode.isNull()) { m_requestUsesAccessControl = true; StoredCredentials allowCredentials = equalIgnoringCase(crossOriginMode, "use-credentials") ? AllowStoredCredentials : DoNotAllowStoredCredentials; updateRequestForAccessControl(request.mutableResourceRequest(), m_element.document().securityOrigin(), allowCredentials); } request.setCharset(scriptCharset()); request.setInitiator(&element()); m_cachedScript = m_element.document().cachedResourceLoader()->requestScript(request); m_isExternalScript = true; } if (m_cachedScript) { return true; } dispatchErrorEvent(); return false; }
void HTMLObjectElement::parseAttribute(const QualifiedName& name, const AtomicString& value) { if (name == formAttr) formAttributeChanged(); else if (name == typeAttr) { m_serviceType = value.string().left(value.find(';')).lower(); setNeedsWidgetUpdate(true); } else if (name == dataAttr) { m_url = stripLeadingAndTrailingHTMLSpaces(value); setNeedsWidgetUpdate(true); document().updateStyleIfNeeded(); if (renderer()) { if (isImageType()) { if (!m_imageLoader) m_imageLoader = std::make_unique<HTMLImageLoader>(*this); m_imageLoader->updateFromElementIgnoringPreviousError(); } } } else if (name == classidAttr) setNeedsWidgetUpdate(true); else if (name == onbeforeloadAttr) setAttributeEventListener(eventNames().beforeloadEvent, name, value); else HTMLPlugInImageElement::parseAttribute(name, value); }
void HTMLLinkElement::parseAttribute(Attribute* attr) { if (attr->name() == relAttr) { m_relAttribute = LinkRelAttribute(attr->value()); process(); } else if (attr->name() == hrefAttr) { String url = stripLeadingAndTrailingHTMLSpaces(attr->value()); m_url = url.isEmpty() ? KURL() : document()->completeURL(url); process(); } else if (attr->name() == typeAttr) { m_type = attr->value(); process(); } else if (attr->name() == sizesAttr) { setSizes(attr->value()); process(); } else if (attr->name() == mediaAttr) { m_media = attr->value().string().lower(); process(); } else if (attr->name() == disabledAttr) setDisabledState(!attr->isNull()); else if (attr->name() == onbeforeloadAttr) setAttributeEventListener(eventNames().beforeloadEvent, createAttributeEventListener(this, attr)); #if ENABLE(LINK_PREFETCH) else if (attr->name() == onloadAttr) setAttributeEventListener(eventNames().loadEvent, createAttributeEventListener(this, attr)); else if (attr->name() == onerrorAttr) setAttributeEventListener(eventNames().errorEvent, createAttributeEventListener(this, attr)); #endif else { if (attr->name() == titleAttr && m_sheet) m_sheet->setTitle(attr->value()); HTMLElement::parseAttribute(attr); } }
bool ScriptLoader::fetchScript(const String& sourceUrl) { ASSERT(m_element); RefPtrWillBeRawPtr<Document> elementDocument(m_element->document()); if (!m_element->inDocument() || m_element->document() != elementDocument) return false; ASSERT(!m_resource); if (!stripLeadingAndTrailingHTMLSpaces(sourceUrl).isEmpty()) { FetchRequest request(ResourceRequest(elementDocument->completeURL(sourceUrl)), m_element->localName()); AtomicString crossOriginMode = m_element->fastGetAttribute(HTMLNames::crossoriginAttr); if (!crossOriginMode.isNull()) request.setCrossOriginAccessControl(elementDocument->securityOrigin(), crossOriginMode); request.setCharset(scriptCharset()); bool isValidScriptNonce = elementDocument->contentSecurityPolicy()->allowScriptNonce(m_element->fastGetAttribute(HTMLNames::nonceAttr)); if (isValidScriptNonce) request.setContentSecurityCheck(DoNotCheckContentSecurityPolicy); m_resource = elementDocument->fetcher()->fetchScript(request); m_isExternalScript = true; } if (m_resource) return true; dispatchErrorEvent(); return false; }
void HTMLAnchorElement::handleClick(Event* event) { event->setDefaultHandled(); Frame* frame = document().frame(); if (!frame) return; StringBuilder url; url.append(stripLeadingAndTrailingHTMLSpaces(fastGetAttribute(hrefAttr))); appendServerMapMousePosition(url, event); URL kurl = document().completeURL(url.toString()); #if ENABLE(DOWNLOAD_ATTRIBUTE) if (hasAttribute(downloadAttr)) { ResourceRequest request(kurl); // FIXME: Why are we not calling addExtraFieldsToMainResourceRequest() if this check fails? It sets many important header fields. if (!hasRel(RelationNoReferrer)) { String referrer = SecurityPolicy::generateReferrerHeader(document().referrerPolicy(), kurl, frame->loader().outgoingReferrer()); if (!referrer.isEmpty()) request.setHTTPReferrer(referrer); frame->loader().addExtraFieldsToMainResourceRequest(request); } frame->loader().client().startDownload(request, fastGetAttribute(downloadAttr)); } else #endif frame->loader().urlSelected(kurl, target(), event, LockHistory::No, LockBackForwardList::No, hasRel(RelationNoReferrer) ? NeverSendReferrer : MaybeSendReferrer); sendPings(kurl); }
void ClipboardQt::declareAndWriteDragImage(Element* element, const KURL& url, const String& title, Frame* frame) { ASSERT(frame); // WebCore::writeURL(m_writableDataObject.get(), url, title, true, false); if (!m_writableData) m_writableData = new QMimeData; CachedImage* cachedImage = getCachedImage(element); if (!cachedImage || !cachedImage->image() || !cachedImage->isLoaded()) return; QPixmap* pixmap = cachedImage->image()->nativeImageForCurrentFrame(); if (pixmap) m_writableData->setImageData(*pixmap); AtomicString imageURL = element->getAttribute(HTMLNames::srcAttr); if (imageURL.isEmpty()) return; KURL fullURL = frame->document()->completeURL(stripLeadingAndTrailingHTMLSpaces(imageURL)); if (fullURL.isEmpty()) return; QList<QUrl> urls; urls.append(url); urls.append(fullURL); m_writableData->setText(title); m_writableData->setUrls(urls); #ifndef QT_NO_CLIPBOARD if (isForCopyAndPaste()) QApplication::clipboard()->setMimeData(m_writableData); #endif }
void Pasteboard::writeImage(Node* node, const KURL&, const String& title) { ASSERT(node); ASSERT(node->renderer()); ASSERT(node->renderer()->isImage()); RenderImage* renderer = toRenderImage(node->renderer()); CachedImage* cachedImage = renderer->cachedImage(); if (!cachedImage || cachedImage->errorOccurred()) return; Image* image = cachedImage->image(); ASSERT(image); NativeImagePtr bitmap = image->nativeImageForCurrentFrame(); if (!bitmap) return; // If the image is wrapped in a link, |url| points to the target of the // link. This isn't useful to us, so get the actual image URL. AtomicString urlString; if (node->hasTagName(HTMLNames::imgTag) || node->hasTagName(HTMLNames::inputTag)) urlString = static_cast<Element*>(node)->getAttribute(HTMLNames::srcAttr); #if ENABLE(SVG) else if (node->hasTagName(SVGNames::imageTag)) urlString = static_cast<Element*>(node)->getAttribute(XLinkNames::hrefAttr); #endif else if (node->hasTagName(HTMLNames::embedTag) || node->hasTagName(HTMLNames::objectTag)) { Element* element = static_cast<Element*>(node); urlString = element->getAttribute(element->imageSourceAttributeName()); } KURL url = urlString.isEmpty() ? KURL() : node->document()->completeURL(stripLeadingAndTrailingHTMLSpaces(urlString)); ChromiumBridge::clipboardWriteImage(bitmap, url, title); }
void HTMLAnchorElement::handleClick(Event* event) { event->setDefaultHandled(); Frame* frame = document()->frame(); if (!frame) return; StringBuilder url; url.append(stripLeadingAndTrailingHTMLSpaces(fastGetAttribute(hrefAttr))); appendServerMapMousePosition(url, event); KURL kurl = document()->completeURL(url.toString()); #if ENABLE(DOWNLOAD_ATTRIBUTE) if (hasAttribute(downloadAttr)) { ResourceRequest request(kurl); if (!hasRel(RelationNoReferrer)) { String referrer = SecurityPolicy::generateReferrerHeader(document()->referrerPolicy(), kurl, frame->loader()->outgoingReferrer()); if (!referrer.isEmpty()) request.setHTTPReferrer(referrer); frame->loader()->addExtraFieldsToMainResourceRequest(request); } frame->loader()->client()->startDownload(request, fastGetAttribute(downloadAttr)); } else #endif frame->loader()->urlSelected(kurl, target(), event, false, false, hasRel(RelationNoReferrer) ? NeverSendReferrer : MaybeSendReferrer); sendPings(kurl); }
bool ScriptElement::requestScript(const String& sourceUrl) { RefPtr<Document> originalDocument = m_element->document(); if (!m_element->dispatchBeforeLoadEvent(sourceUrl)) return false; if (!m_element->inDocument() || m_element->document() != originalDocument) return false; if (!m_element->document()->contentSecurityPolicy()->allowScriptNonce(m_element->fastGetAttribute(HTMLNames::nonceAttr), m_element->document()->url(), m_startLineNumber, m_element->document()->completeURL(sourceUrl))) return false; ASSERT(!m_cachedScript); if (!stripLeadingAndTrailingHTMLSpaces(sourceUrl).isEmpty()) { ResourceRequest request = ResourceRequest(m_element->document()->completeURL(sourceUrl)); String crossOriginMode = m_element->fastGetAttribute(HTMLNames::crossoriginAttr); if (!crossOriginMode.isNull()) { m_requestUsesAccessControl = true; StoredCredentials allowCredentials = equalIgnoringCase(crossOriginMode, "use-credentials") ? AllowStoredCredentials : DoNotAllowStoredCredentials; updateRequestForAccessControl(request, m_element->document()->securityOrigin(), allowCredentials); } m_cachedScript = m_element->document()->cachedResourceLoader()->requestScript(request, scriptCharset()); m_isExternalScript = true; } if (m_cachedScript) { return true; } dispatchErrorEvent(); return false; }
void HTMLAnchorElement::parseAttribute(const Attribute& attribute) { if (attribute.name() == hrefAttr) { bool wasLink = isLink(); setIsLink(!attribute.isNull()); if (wasLink != isLink()) setNeedsStyleRecalc(); if (isLink()) { String parsedURL = stripLeadingAndTrailingHTMLSpaces(attribute.value()); if (document()->isDNSPrefetchEnabled()) { if (protocolIs(parsedURL, "http") || protocolIs(parsedURL, "https") || parsedURL.startsWith("//")) prefetchDNS(document()->completeURL(parsedURL).host()); } if (document()->page() && !document()->page()->javaScriptURLsAreAllowed() && protocolIsJavaScript(parsedURL)) { clearIsLink(); // FIXME: This is horribly factored. if (Attribute* hrefAttribute = getAttributeItem(hrefAttr)) hrefAttribute->setValue(nullAtom); } } invalidateCachedVisitedLinkHash(); } else if (attribute.name() == nameAttr || attribute.name() == titleAttr) { // Do nothing. } else if (attribute.name() == relAttr) setRel(attribute.value()); else HTMLElement::parseAttribute(attribute); }
void HTMLObjectElement::parseMappedAttribute(Attribute* attr) { if (attr->name() == typeAttr) { m_serviceType = attr->value().lower(); size_t pos = m_serviceType.find(";"); if (pos != notFound) m_serviceType = m_serviceType.left(pos); if (renderer()) setNeedsWidgetUpdate(true); if (!isImageType() && m_imageLoader) m_imageLoader.clear(); } else if (attr->name() == dataAttr) { m_url = stripLeadingAndTrailingHTMLSpaces(attr->value()); if (renderer()) { setNeedsWidgetUpdate(true); if (isImageType()) { if (!m_imageLoader) m_imageLoader = adoptPtr(new HTMLImageLoader(this)); m_imageLoader->updateFromElementIgnoringPreviousError(); } } } else if (attr->name() == classidAttr) { m_classId = attr->value(); if (renderer()) setNeedsWidgetUpdate(true); } else if (attr->name() == onloadAttr) setAttributeEventListener(eventNames().loadEvent, NULL_METHOD_RESULT(this, attr)); else if (attr->name() == onbeforeloadAttr) setAttributeEventListener(eventNames().beforeloadEvent, NULL_METHOD_RESULT(this, attr)); else if (attr->name() == nameAttr) { const AtomicString& newName = attr->value(); if (isDocNamedItem() && inDocument() && document()->isHTMLDocument()) { HTMLDocument* document = static_cast<HTMLDocument*>(this->document()); document->removeNamedItem(m_name); document->addNamedItem(newName); } m_name = newName; } else if (attr->name() == borderAttr) { addCSSLength(attr, CSSPropertyBorderWidth, attr->value().toInt() ? attr->value() : "0"); addCSSProperty(attr, CSSPropertyBorderTopStyle, CSSValueSolid); addCSSProperty(attr, CSSPropertyBorderRightStyle, CSSValueSolid); addCSSProperty(attr, CSSPropertyBorderBottomStyle, CSSValueSolid); addCSSProperty(attr, CSSPropertyBorderLeftStyle, CSSValueSolid); } else if (isIdAttributeName(attr->name())) { const AtomicString& newId = attr->value(); if (isDocNamedItem() && inDocument() && document()->isHTMLDocument()) { HTMLDocument* document = static_cast<HTMLDocument*>(this->document()); document->removeExtraNamedItem(m_id); document->addExtraNamedItem(newId); } m_id = newId; // also call superclass HTMLPlugInImageElement::parseMappedAttribute(attr); } else HTMLPlugInImageElement::parseMappedAttribute(attr); }
KURL Element::getURLAttribute(const QualifiedName& name) const { #if ENABLE(ASSERT) if (elementData()) { if (const Attribute* attribute = attributes().find(name)) ASSERT(isURLAttribute(*attribute)); } #endif return document().completeURL(stripLeadingAndTrailingHTMLSpaces(getAttribute(name))); }
String HTMLImageLoader::sourceURI(const AtomicString& attr) const { #if ENABLE(DASHBOARD_SUPPORT) Settings* settings = client()->sourceElement()->document()->settings(); if (settings && settings->usesDashboardBackwardCompatibilityMode() && attr.length() > 7 && attr.startsWith("url(\"") && attr.endsWith("\")")) return attr.string().substring(5, attr.length() - 7); #endif return stripLeadingAndTrailingHTMLSpaces(attr); }
KURL HTMLBaseElement::href() const { // This does not use the getURLAttribute function because that will resolve relative to the document's base URL; // base elements like this one can be used to set that base URL. Thus we need to resolve relative to the document's // URL and ignore the base URL. const AtomicString& attributeValue = fastGetAttribute(hrefAttr); if (attributeValue.isNull()) return document().url(); KURL url = document().encoding().isValid() ? KURL(document().url(), stripLeadingAndTrailingHTMLSpaces(attributeValue)) : KURL(document().url(), stripLeadingAndTrailingHTMLSpaces(attributeValue), document().encoding()); if (!url.isValid()) return KURL(); return url; }
static String semicolonSeparatedValueContainingJavaScriptURL(const String& value) { Vector<String> valueList; value.split(';', valueList); for (size_t i = 0; i < valueList.size(); ++i) { String stripped = stripLeadingAndTrailingHTMLSpaces(valueList[i]); if (protocolIsJavaScript(stripped)) return stripped; } return emptyString(); }
String YouTubePluginReplacement::youTubeURL(const String& srcString) { URL srcURL = m_parentElement->document().completeURL(stripLeadingAndTrailingHTMLSpaces(srcString)); bool isYouTubeShortenedURL = false; URL youTubeURL = processAndCreateYouTubeURL(srcURL, isYouTubeShortenedURL); if (srcURL.isEmpty() || youTubeURL.isEmpty()) return srcString; // Transform the youtubeURL (youtube:VideoID) to iframe embed url which has the format: http://www.youtube.com/embed/VideoID const String& srcPath = srcURL.path(); const String& videoID = youTubeURL.string().substring(youTubeURL.protocol().length() + 1); size_t locationOfVideoIDInPath = srcPath.find(videoID); size_t locationOfPathBeforeVideoID = notFound; if (locationOfVideoIDInPath != notFound) { ASSERT(locationOfVideoIDInPath); // From the original URL, we need to get the part before /path/VideoId. locationOfPathBeforeVideoID = srcString.find(srcPath.substring(0, locationOfVideoIDInPath)); } else if (srcPath.lower() == "/watch") { // From the original URL, we need to get the part before /watch/#!v=VideoID locationOfPathBeforeVideoID = srcString.find("/watch"); } else return srcString; ASSERT(locationOfPathBeforeVideoID != notFound); const String& srcURLPrefix = srcString.substring(0, locationOfPathBeforeVideoID); String query = srcURL.query(); // By default, the iframe will display information like the video title and uploader on top of the video. Don't display // them if the embeding html doesn't specify it. if (!query.isEmpty() && !query.contains("showinfo")) query.append("&showinfo=0"); else query = "showinfo=0"; // Append the query string if it is valid. Some sites apparently forget to add "?" for the query string, in that case, // we will discard the parameters in the url. // See: <rdar://problem/11535155> StringBuilder finalURL; if (isYouTubeShortenedURL) finalURL.append("http://www.youtube.com"); else finalURL.append(srcURLPrefix); finalURL.appendLiteral("/embed/"); finalURL.append(videoID); if (!query.isEmpty()) { finalURL.appendLiteral("?"); finalURL.append(query); } return finalURL.toString(); }
static unsigned avoidDownloadIfHigherDensityResourceIsInCache(Vector<ImageCandidate*>& imageCandidates, unsigned winner, Document* document) { if (!document) return winner; for (unsigned i = imageCandidates.size() - 1; i > winner; --i) { KURL url = document->completeURL(stripLeadingAndTrailingHTMLSpaces(imageCandidates[i]->url())); if (memoryCache()->resourceForURL(url, document->fetcher()->getCacheIdentifier())) return i; } return winner; }
static URL getURLForImageElement(Element& element) { // FIXME: Later this code should be shared with Chromium somehow. Chances are all platforms want it. AtomicString urlString; if (isHTMLImageElement(element) || isHTMLInputElement(element)) urlString = element.getAttribute(HTMLNames::srcAttr); else if (element.hasTagName(SVGNames::imageTag)) urlString = element.getAttribute(XLinkNames::hrefAttr); else if (element.hasTagName(HTMLNames::embedTag) || isHTMLObjectElement(element)) urlString = element.imageSourceURL(); return urlString.isEmpty() ? URL() : element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(urlString)); }
void Editor::writeImageToPasteboard(Pasteboard& pasteboard, Element& imageElement, const URL&, const String& title) { PasteboardImage pasteboardImage; if (!getImageForElement(imageElement, pasteboardImage.image)) return; ASSERT(pasteboardImage.image); pasteboardImage.url.url = imageElement.document().completeURL(stripLeadingAndTrailingHTMLSpaces(elementURL(imageElement))); pasteboardImage.url.title = title; pasteboardImage.url.markup = createMarkup(imageElement, IncludeNode, nullptr, ResolveAllURLs); pasteboard.write(pasteboardImage); }
KURL Element::getNonEmptyURLAttribute(const QualifiedName& name) const { #if ENABLE(ASSERT) if (elementData()) { if (const Attribute* attribute = attributes().find(name)) ASSERT(isURLAttribute(*attribute)); } #endif String value = stripLeadingAndTrailingHTMLSpaces(getAttribute(name)); if (value.isEmpty()) return KURL(); return document().completeURL(value); }
bool EmailInputType::typeMismatchFor(const String& value) const { if (value.isEmpty()) return false; if (!element()->multiple()) return !isValidEmailAddress(value); Vector<String> addresses; value.split(',', true, addresses); for (unsigned i = 0; i < addresses.size(); ++i) { if (!isValidEmailAddress(stripLeadingAndTrailingHTMLSpaces(addresses[i]))) return true; } return false; }
void WebChromeClient::unavailablePluginButtonClicked(Element* element, RenderEmbeddedObject::PluginUnavailabilityReason pluginUnavailabilityReason) const { ASSERT(element->hasTagName(objectTag) || element->hasTagName(embedTag) || element->hasTagName(appletTag)); ASSERT(pluginUnavailabilityReason == RenderEmbeddedObject::PluginMissing || pluginUnavailabilityReason == RenderEmbeddedObject::InsecurePluginVersion || pluginUnavailabilityReason == RenderEmbeddedObject::PluginInactive); HTMLPlugInImageElement* pluginElement = static_cast<HTMLPlugInImageElement*>(element); String frameURLString = pluginElement->document()->frame()->loader()->documentLoader()->responseURL().string(); String pageURLString = m_page->mainFrame()->loader()->documentLoader()->responseURL().string(); KURL pluginspageAttributeURL = element->document()->completeURL(stripLeadingAndTrailingHTMLSpaces(pluginElement->getAttribute(pluginspageAttr))); if (!pluginspageAttributeURL.protocolIsInHTTPFamily()) pluginspageAttributeURL = KURL(); m_page->send(Messages::WebPageProxy::UnavailablePluginButtonClicked(pluginUnavailabilityReason, pluginElement->serviceType(), pluginElement->url(), pluginspageAttributeURL.string(), frameURLString, pageURLString)); }
// The return value is an invalid email address string if the specified string // contains an invalid email address. Otherwise, null string is returned. // If an empty string is returned, it means empty address is specified. // e.g. "[email protected],,[email protected]" for multiple case. String EmailInputType::findInvalidAddress(const String& value) const { if (value.isEmpty()) return String(); if (!element().multiple()) return isValidEmailAddress(value) ? String() : value; Vector<String> addresses; value.split(',', true, addresses); for (unsigned i = 0; i < addresses.size(); ++i) { String stripped = stripLeadingAndTrailingHTMLSpaces(addresses[i]); if (!isValidEmailAddress(stripped)) return stripped; } return String(); }
void SVGInteger::setValueAsString(const String& string, ExceptionState& exceptionState) { if (string.isEmpty()) { m_value = 0; return; } bool valid = true; m_value = stripLeadingAndTrailingHTMLSpaces(string).toIntStrict(&valid); if (!valid) { exceptionState.throwDOMException(SyntaxError, "The value provided ('" + string + "') is invalid."); m_value = 0; } }
static KURL getURLForImageNode(Node* node) { // FIXME: Later this code should be shared with Chromium somehow. Chances are all platforms want it. AtomicString urlString; if (node->hasTagName(HTMLNames::imgTag) || node->hasTagName(HTMLNames::inputTag)) urlString = static_cast<Element*>(node)->getAttribute(HTMLNames::srcAttr); #if ENABLE(SVG) else if (node->hasTagName(SVGNames::imageTag)) urlString = static_cast<Element*>(node)->getAttribute(XLinkNames::hrefAttr); #endif else if (node->hasTagName(HTMLNames::embedTag) || node->hasTagName(HTMLNames::objectTag)) { Element* element = static_cast<Element*>(node); urlString = element->getAttribute(element->imageSourceAttributeName()); } return urlString.isEmpty() ? KURL() : node->document()->completeURL(stripLeadingAndTrailingHTMLSpaces(urlString)); }
KURL ImageLoader::imageSourceToKURL(AtomicString imageSourceURL) const { KURL url; // Don't load images for inactive documents. We don't want to slow down the // raw HTML parsing case by loading images we don't intend to display. Document& document = m_element->document(); if (!document.isActive()) return url; // Do not load any image if the 'src' attribute is missing or if it is // an empty string. if (!imageSourceURL.isNull() && !stripLeadingAndTrailingHTMLSpaces(imageSourceURL).isEmpty()) url = document.completeURL(sourceURI(imageSourceURL)); return url; }
bool ScriptLoader::fetchScript(const String& sourceUrl, FetchRequest::DeferOption defer) { DCHECK(m_element); Document* elementDocument = &(m_element->document()); if (!m_element->inShadowIncludingDocument() || m_element->document() != elementDocument) return false; DCHECK(!m_resource); if (!stripLeadingAndTrailingHTMLSpaces(sourceUrl).isEmpty()) { FetchRequest request(ResourceRequest(elementDocument->completeURL(sourceUrl)), m_element->localName()); CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(m_element->fastGetAttribute(HTMLNames::crossoriginAttr)); if (crossOrigin != CrossOriginAttributeNotSet) request.setCrossOriginAccessControl(elementDocument->getSecurityOrigin(), crossOrigin); request.setCharset(scriptCharset()); // Skip fetch-related CSP checks if dynamically injected script is whitelisted and this script is not parser-inserted. bool scriptPassesCSPDynamic = (!isParserInserted() && elementDocument->contentSecurityPolicy()->allowDynamic()); request.setContentSecurityPolicyNonce(m_element->fastGetAttribute(HTMLNames::nonceAttr)); if (scriptPassesCSPDynamic) { UseCounter::count(elementDocument->frame(), UseCounter::ScriptPassesCSPDynamic); request.setContentSecurityCheck(DoNotCheckContentSecurityPolicy); } request.setDefer(defer); String integrityAttr = m_element->fastGetAttribute(HTMLNames::integrityAttr); if (!integrityAttr.isEmpty()) { IntegrityMetadataSet metadataSet; SubresourceIntegrity::parseIntegrityAttribute(integrityAttr, metadataSet, elementDocument); request.setIntegrityMetadata(metadataSet); } m_resource = ScriptResource::fetch(request, elementDocument->fetcher()); m_isExternalScript = true; } if (m_resource) return true; dispatchErrorEvent(); return false; }
void HTMLObjectElement::parseAttribute(const QualifiedName& name, const AtomicString& value) { if (name == formAttr) formAttributeChanged(); else if (name == typeAttr) { m_serviceType = value.string().left(value.find(';')).lower(); setNeedsWidgetUpdate(true); } else if (name == dataAttr) { m_url = stripLeadingAndTrailingHTMLSpaces(value); setNeedsWidgetUpdate(true); updateImageLoaderWithNewURLSoon(); } else if (name == classidAttr) setNeedsWidgetUpdate(true); else if (name == onbeforeloadAttr) setAttributeEventListener(eventNames().beforeloadEvent, name, value); else HTMLPlugInImageElement::parseAttribute(name, value); }