bool HTMLObjectElement::shouldAllowQuickTimeClassIdQuirk() { // This site-specific hack maintains compatibility with Mac OS X Wiki Server, // which embeds QuickTime movies using an object tag containing QuickTime's // ActiveX classid. Treat this classid as valid only if OS X Server's unique // 'generator' meta tag is present. Only apply this quirk if there is no // fallback content, which ensures the quirk will disable itself if Wiki // Server is updated to generate an alternate embed tag as fallback content. if (!document()->page() || !document()->page()->settings()->needsSiteSpecificQuirks() || hasFallbackContent() || !equalIgnoringCase(classId(), "clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B")) return false; RefPtr<NodeList> metaElements = document()->getElementsByTagName(HTMLNames::metaTag.localName()); unsigned length = metaElements->length(); for (unsigned i = 0; i < length; ++i) { ASSERT(metaElements->item(i)->isHTMLElement()); HTMLMetaElement* metaElement = static_cast<HTMLMetaElement*>(metaElements->item(i)); if (equalIgnoringCase(metaElement->name(), "generator") && metaElement->content().startsWith("Mac OS X Server Web Services Server", false)) return true; } return false; }
void JSHTMLMetaElement::putValueProperty(ExecState* exec, int token, JSValue* value) { switch (token) { case ContentAttrNum: { HTMLMetaElement* imp = static_cast<HTMLMetaElement*>(impl()); imp->setContent(valueToStringWithNullCheck(exec, value)); break; } case HttpEquivAttrNum: { HTMLMetaElement* imp = static_cast<HTMLMetaElement*>(impl()); imp->setHttpEquiv(valueToStringWithNullCheck(exec, value)); break; } case NameAttrNum: { HTMLMetaElement* imp = static_cast<HTMLMetaElement*>(impl()); imp->setName(valueToStringWithNullCheck(exec, value)); break; } case SchemeAttrNum: { HTMLMetaElement* imp = static_cast<HTMLMetaElement*>(impl()); imp->setScheme(valueToStringWithNullCheck(exec, value)); break; } } }
/*! \since 4.5 \brief Returns the meta data in this frame as a QMultiMap The meta data consists of the name and content attributes of the of the \c{<meta>} tags in the HTML document. For example: \code <html> <head> <meta name="description" content="This document is a tutorial about Qt development"> <meta name="keywords" content="Qt, WebKit, Programming"> </head> ... </html> \endcode Given the above HTML code the metaData() function will return a map with two entries: \table \header \o Key \o Value \row \o "description" \o "This document is a tutorial about Qt development" \row \o "keywords" \o "Qt, WebKit, Programming" \endtable This function returns a multi map to support multiple meta tags with the same attribute name. */ QMultiMap<QString, QString> QWebFrame::metaData() const { if (!d->frame->document()) return QMap<QString, QString>(); QMultiMap<QString, QString> map; Document* doc = d->frame->document(); RefPtr<NodeList> list = doc->getElementsByTagName("meta"); unsigned len = list->length(); for (unsigned i = 0; i < len; i++) { HTMLMetaElement* meta = static_cast<HTMLMetaElement*>(list->item(i)); map.insert(meta->name(), meta->content()); } return map; }
JSValue* JSHTMLMetaElement::getValueProperty(ExecState* exec, int token) const { switch (token) { case ContentAttrNum: { HTMLMetaElement* imp = static_cast<HTMLMetaElement*>(impl()); return jsString(exec, imp->content()); } case HttpEquivAttrNum: { HTMLMetaElement* imp = static_cast<HTMLMetaElement*>(impl()); return jsString(exec, imp->httpEquiv()); } case NameAttrNum: { HTMLMetaElement* imp = static_cast<HTMLMetaElement*>(impl()); return jsString(exec, imp->name()); } case SchemeAttrNum: { HTMLMetaElement* imp = static_cast<HTMLMetaElement*>(impl()); return jsString(exec, imp->scheme()); } case ConstructorAttrNum: return getConstructor(exec); } return 0; }
void setJSHTMLMetaElementScheme(ExecState* exec, JSObject* thisObject, JSValue value) { JSHTMLMetaElement* castedThisObj = static_cast<JSHTMLMetaElement*>(thisObject); HTMLMetaElement* imp = static_cast<HTMLMetaElement*>(castedThisObj->impl()); imp->setScheme(valueToStringWithNullCheck(exec, value)); }
void FrameLoaderClientBlackBerry::dispatchDidFinishLoad() { didFinishOrFailLoading(ResourceError()); if (m_webPagePrivate->m_dumpRenderTree) m_webPagePrivate->m_dumpRenderTree->didFinishLoadForFrame(m_frame); if (!isMainFrame() || m_webPagePrivate->m_webSettings->isEmailMode() || !m_frame->document() || !m_frame->document()->head()) return; HTMLHeadElement* headElement = m_frame->document()->head(); // FIXME: Handle NOSCRIPT special case? // Process document metadata. RefPtr<NodeList> nodeList = headElement->getElementsByTagName(HTMLNames::metaTag.localName()); unsigned int size = nodeList->length(); ScopeArray<WebString> headers; // This may allocate more space than needed since not all meta elements will be http-equiv. headers.reset(new WebString[2 * size]); unsigned headersLength = 0; for (unsigned i = 0; i < size; ++i) { HTMLMetaElement* metaElement = static_cast<HTMLMetaElement*>(nodeList->item(i)); if (WTF::equalIgnoringCase(metaElement->name(), "apple-mobile-web-app-capable") && WTF::equalIgnoringCase(metaElement->content().stripWhiteSpace(), "yes")) m_webPagePrivate->m_client->setWebAppCapable(); else { String httpEquiv = metaElement->httpEquiv().stripWhiteSpace(); String content = metaElement->content().stripWhiteSpace(); if (!httpEquiv.isNull() && !content.isNull()) { headers[headersLength++] = httpEquiv; headers[headersLength++] = content; } } } if (headersLength > 0) m_webPagePrivate->m_client->setMetaHeaders(headers, headersLength); nodeList = headElement->getElementsByTagName(HTMLNames::linkTag.localName()); size = nodeList->length(); for (unsigned i = 0; i < size; ++i) { HTMLLinkElement* linkElement = static_cast<HTMLLinkElement*>(nodeList->item(i)); String href = linkElement->href().string(); if (!href.isEmpty()) { String title = linkElement->title(); if (WTF::equalIgnoringCase(linkElement->rel(), "apple-touch-icon")) m_webPagePrivate->m_client->setLargeIcon(href.latin1().data()); else if (WTF::equalIgnoringCase(linkElement->rel(), "search")) { if (WTF::equalIgnoringCase(linkElement->type(), "application/opensearchdescription+xml")) m_webPagePrivate->m_client->setSearchProviderDetails(title.utf8().data(), href.utf8().data()); } else if (WTF::equalIgnoringCase(linkElement->rel(), "alternate") && (WTF::equalIgnoringCase(linkElement->type(), "application/rss+xml") || WTF::equalIgnoringCase(linkElement->type(), "application/atom+xml"))) m_webPagePrivate->m_client->setAlternateFeedDetails(title.utf8().data(), href.utf8().data()); } } #if ENABLE(BLACKBERRY_CREDENTIAL_PERSIST) if (!m_webPagePrivate->m_webSettings->isPrivateBrowsingEnabled()) credentialManager().autofillPasswordForms(m_frame->document()->forms()); #endif }
void MediaDocumentParser::createDocumentStructure() { DCHECK(document()); HTMLHtmlElement* rootElement = HTMLHtmlElement::create(*document()); document()->appendChild(rootElement); rootElement->insertedByParser(); if (isDetached()) return; // runScriptsAtDocumentElementAvailable can detach the frame. HTMLHeadElement* head = HTMLHeadElement::create(*document()); HTMLMetaElement* meta = HTMLMetaElement::create(*document()); meta->setAttribute(nameAttr, "viewport"); meta->setAttribute(contentAttr, "width=device-width"); head->appendChild(meta); HTMLVideoElement* media = HTMLVideoElement::create(*document()); media->setAttribute(controlsAttr, ""); media->setAttribute(autoplayAttr, ""); media->setAttribute(nameAttr, "media"); HTMLSourceElement* source = HTMLSourceElement::create(*document()); source->setSrc(document()->url()); if (DocumentLoader* loader = document()->loader()) source->setType(loader->responseMIMEType()); media->appendChild(source); HTMLBodyElement* body = HTMLBodyElement::create(*document()); body->setAttribute(styleAttr, "margin: 0px;"); document()->willInsertBody(); HTMLDivElement* div = HTMLDivElement::create(*document()); // Style sheets for media controls are lazily loaded until a media element is // encountered. As a result, elements encountered before the media element // will not get the right style at first if we put the styles in // mediacontrols.css. To solve this issue, set the styles inline so that they // will be applied when the page loads. See w3c example on how to centering // an element: https://www.w3.org/Style/Examples/007/center.en.html div->setAttribute(styleAttr, "display: flex;" "flex-direction: column;" "justify-content: center;" "align-items: center;" "min-height: min-content;" "height: 100%;"); HTMLContentElement* content = HTMLContentElement::create(*document()); div->appendChild(content); if (RuntimeEnabledFeatures::mediaDocumentDownloadButtonEnabled()) { HTMLAnchorElement* anchor = HTMLAnchorElement::create(*document()); anchor->setAttribute(downloadAttr, ""); anchor->setURL(document()->url()); anchor->setTextContent( document() ->getCachedLocale(document()->contentLanguage()) .queryString(WebLocalizedString::DownloadButtonLabel) .upper()); // Using CSS style according to Android material design. anchor->setAttribute( styleAttr, "display: inline-block;" "margin-top: 32px;" "padding: 0 16px 0 16px;" "height: 36px;" "background: #000000;" "-webkit-tap-highlight-color: rgba(255, 255, 255, 0.12);" "font-family: Roboto;" "font-size: 14px;" "border-radius: 5px;" "color: white;" "font-weight: 500;" "text-decoration: none;" "line-height: 36px;"); EventListener* listener = MediaDownloadEventListener::create(); anchor->addEventListener(EventTypeNames::click, listener, false); HTMLDivElement* buttonContainer = HTMLDivElement::create(*document()); buttonContainer->setAttribute(styleAttr, "text-align: center;" "height: 0;" "flex: none"); buttonContainer->appendChild(anchor); div->appendChild(buttonContainer); recordDownloadMetric(MediaDocumentDownloadButtonShown); } // According to // https://html.spec.whatwg.org/multipage/browsers.html#read-media, // MediaDocument should have a single child which is the video element. Use // shadow root to hide all the elements we added here. ShadowRoot& shadowRoot = body->ensureUserAgentShadowRoot(); shadowRoot.appendChild(div); body->appendChild(media); rootElement->appendChild(head); rootElement->appendChild(body); m_didBuildDocumentStructure = true; }