bool SubframeLoader::loadPlugin(HTMLPlugInImageElement* pluginElement, const KURL& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback) { RenderEmbeddedObject* renderer = pluginElement->renderEmbeddedObject(); // FIXME: This code should not depend on renderer! if (!renderer || useFallback) return false; if (!document()->securityOrigin()->canDisplay(url)) { FrameLoader::reportLocalLoadFailed(m_frame, url.string()); return false; } FrameLoader* frameLoader = m_frame->loader(); frameLoader->checkIfRunInsecureContent(document()->securityOrigin(), url); IntSize contentSize(renderer->contentWidth(), renderer->contentHeight()); bool loadManually = document()->isPluginDocument() && !m_containsPlugins; RefPtr<Widget> widget = frameLoader->client()->createPlugin(contentSize, pluginElement, url, paramNames, paramValues, mimeType, loadManually); if (!widget) { renderer->setShowsMissingPluginIndicator(); return false; } renderer->setWidget(widget); m_containsPlugins = true; #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) pluginElement->setNeedsStyleRecalc(SyntheticStyleChange); #endif return true; }
bool SubframeLoader::pluginIsLoadable(HTMLPlugInImageElement& pluginElement, const URL& url, const String& mimeType) { if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) { if (!m_frame.settings().isJavaEnabled()) return false; if (document() && document()->securityOrigin()->isLocal() && !m_frame.settings().isJavaEnabledForLocalFiles()) return false; } if (document()) { if (document()->isSandboxed(SandboxPlugins)) return false; if (!document()->securityOrigin()->canDisplay(url)) { FrameLoader::reportLocalLoadFailed(&m_frame, url.string()); return false; } String declaredMimeType = document()->isPluginDocument() && document()->ownerElement() ? document()->ownerElement()->fastGetAttribute(HTMLNames::typeAttr) : pluginElement.fastGetAttribute(HTMLNames::typeAttr); if (!document()->contentSecurityPolicy()->allowObjectFromSource(url) || !document()->contentSecurityPolicy()->allowPluginType(mimeType, declaredMimeType, url)) { RenderEmbeddedObject* renderer = pluginElement.renderEmbeddedObject(); renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginBlockedByContentSecurityPolicy); return false; } if (!m_frame.loader().mixedContentChecker().canRunInsecureContent(document()->securityOrigin(), url)) return false; } return true; }
bool HTMLPlugInElement::requestObject(const String& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues) { if (url.isEmpty() && mimeType.isEmpty()) return false; // FIXME: None of this code should use renderers! RenderEmbeddedObject* renderer = renderEmbeddedObject(); ASSERT(renderer); if (!renderer) return false; KURL completedURL = document().completeURL(url); if (!pluginIsLoadable(completedURL, mimeType)) return false; bool useFallback; if (shouldUsePlugin(completedURL, mimeType, renderer->hasFallbackContent(), useFallback)) return loadPlugin(completedURL, mimeType, paramNames, paramValues, useFallback); // If the plug-in element already contains a subframe, // loadOrRedirectSubframe will re-use it. Otherwise, it will create a new // frame and set it as the RenderPart's widget, causing what was previously // in the widget to be torn down. return loadOrRedirectSubframe(completedURL, getNameAttribute(), true); }
bool HTMLPlugInImageElement::isTopLevelFullPagePlugin(const RenderEmbeddedObject& renderer) const { Frame& frame = *document().frame(); if (!frame.isMainFrame()) return false; auto& style = renderer.style(); IntSize visibleSize = frame.view()->visibleSize(); LayoutRect contentRect = renderer.contentBoxRect(); int contentWidth = contentRect.width(); int contentHeight = contentRect.height(); return is100Percent(style.width()) && is100Percent(style.height()) && contentWidth * contentHeight > visibleSize.area() * sizingFullPageAreaRatioThreshold; }
void PluginView::pluginProcessCrashed() { if (!m_pluginElement->renderer()) return; // FIXME: The renderer could also be a RenderApplet, we should handle that. if (!m_pluginElement->renderer()->isEmbeddedObject()) return; RenderEmbeddedObject* renderer = toRenderEmbeddedObject(m_pluginElement->renderer()); renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginCrashed); Widget::invalidate(); }
PassRefPtr<Widget> SubframeLoader::createJavaAppletWidget(const IntSize& size, HTMLAppletElement& element, const Vector<String>& paramNames, const Vector<String>& paramValues) { String baseURLString; String codeBaseURLString; for (size_t i = 0; i < paramNames.size(); ++i) { if (equalLettersIgnoringASCIICase(paramNames[i], "baseurl")) baseURLString = paramValues[i]; else if (equalLettersIgnoringASCIICase(paramNames[i], "codebase")) codeBaseURLString = paramValues[i]; } if (!codeBaseURLString.isEmpty()) { URL codeBaseURL = completeURL(codeBaseURLString); if (!element.document().securityOrigin()->canDisplay(codeBaseURL)) { FrameLoader::reportLocalLoadFailed(&m_frame, codeBaseURL.string()); return nullptr; } const char javaAppletMimeType[] = "application/x-java-applet"; ASSERT(element.document().contentSecurityPolicy()); auto& contentSecurityPolicy = *element.document().contentSecurityPolicy(); // Elements in user agent show tree should load whatever the embedding document policy is. if (!element.isInUserAgentShadowTree() && (!contentSecurityPolicy.allowObjectFromSource(codeBaseURL) || !contentSecurityPolicy.allowPluginType(javaAppletMimeType, javaAppletMimeType, codeBaseURL))) return nullptr; } if (baseURLString.isEmpty()) baseURLString = m_frame.document()->baseURL().string(); URL baseURL = completeURL(baseURLString); RefPtr<Widget> widget; if (allowPlugins()) widget = m_frame.loader().client().createJavaAppletWidget(size, &element, baseURL, paramNames, paramValues); logPluginRequest(document()->page(), element.serviceType(), String(), widget); if (!widget) { RenderEmbeddedObject* renderer = element.renderEmbeddedObject(); if (!renderer->isPluginUnavailable()) renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginMissing); return nullptr; } m_containsPlugins = true; return widget; }
bool SubframeLoader::requestObject(HTMLPlugInImageElement* ownerElement, const String& url, const AtomicString& frameName, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues) { if (url.isEmpty() && mimeType.isEmpty()) return false; // FIXME: None of this code should use renderers! RenderEmbeddedObject* renderer = ownerElement->renderEmbeddedObject(); ASSERT(renderer); if (!renderer) return false; KURL completedURL; if (!url.isEmpty()) completedURL = completeURL(url); bool useFallback; if (shouldUsePlugin(completedURL, mimeType, ownerElement->shouldPreferPlugInsForImages(), renderer->hasFallbackContent(), useFallback)) { bool success = requestPlugin(ownerElement, completedURL, mimeType, paramNames, paramValues, useFallback); logPluginRequest(document()->page(), mimeType, completedURL, success); return success; } // If the plug-in element already contains a subframe, loadOrRedirectSubframe will re-use it. Otherwise, // it will create a new frame and set it as the RenderPart's widget, causing what was previously // in the widget to be torn down. return loadOrRedirectSubframe(ownerElement, completedURL, frameName, true, true); }
PassRefPtr<Widget> SubframeLoader::createJavaAppletWidget(const IntSize& size, HTMLAppletElement* element, const Vector<String>& paramNames, const Vector<String>& paramValues) { String baseURLString; String codeBaseURLString; for (size_t i = 0; i < paramNames.size(); ++i) { if (equalIgnoringCase(paramNames[i], "baseurl")) baseURLString = paramValues[i]; else if (equalIgnoringCase(paramNames[i], "codebase")) codeBaseURLString = paramValues[i]; } if (!codeBaseURLString.isEmpty()) { URL codeBaseURL = completeURL(codeBaseURLString); if (!element->document().securityOrigin()->canDisplay(codeBaseURL)) { FrameLoader::reportLocalLoadFailed(&m_frame, codeBaseURL.string()); return 0; } const char javaAppletMimeType[] = "application/x-java-applet"; if (!element->document().contentSecurityPolicy()->allowObjectFromSource(codeBaseURL) || !element->document().contentSecurityPolicy()->allowPluginType(javaAppletMimeType, javaAppletMimeType, codeBaseURL)) return 0; } if (baseURLString.isEmpty()) baseURLString = m_frame.document()->baseURL().string(); URL baseURL = completeURL(baseURLString); RefPtr<Widget> widget; if (allowPlugins(AboutToInstantiatePlugin)) widget = m_frame.loader().client().createJavaAppletWidget(size, element, baseURL, paramNames, paramValues); logPluginRequest(document()->page(), element->serviceType(), String(), widget); if (!widget) { RenderEmbeddedObject* renderer = element->renderEmbeddedObject(); if (!renderer->isPluginUnavailable()) renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginMissing); return 0; } m_containsPlugins = true; return widget; }
bool SubframeLoader::requestObject(HTMLPlugInImageElement* ownerElement, const String& url, const AtomicString& frameName, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues) { if (url.isEmpty() && mimeType.isEmpty()) return false; if (!m_frame->script()->xssAuditor()->canLoadObject(url)) { // It is unsafe to honor the request for this object. return false; } // FIXME: None of this code should use renderers! RenderEmbeddedObject* renderer = ownerElement->renderEmbeddedObject(); ASSERT(renderer); if (!renderer) return false; KURL completedURL; if (!url.isEmpty()) completedURL = completeURL(url); bool useFallback; if (shouldUsePlugin(completedURL, mimeType, renderer->hasFallbackContent(), useFallback)) { Settings* settings = m_frame->settings(); if ((!allowPlugins(AboutToInstantiatePlugin) // Application plugins are plugins implemented by the user agent, for example Qt plugins, // as opposed to third-party code such as flash. The user agent decides whether or not they are // permitted, rather than WebKit. && !MIMETypeRegistry::isApplicationPluginMIMEType(mimeType)) || (!settings->isJavaEnabled() && MIMETypeRegistry::isJavaAppletMIMEType(mimeType))) return false; if (m_frame->document() && m_frame->document()->securityOrigin()->isSandboxed(SandboxPlugins)) return false; ASSERT(ownerElement->hasTagName(objectTag) || ownerElement->hasTagName(embedTag)); HTMLPlugInImageElement* pluginElement = static_cast<HTMLPlugInImageElement*>(ownerElement); return loadPlugin(pluginElement, completedURL, mimeType, paramNames, paramValues, useFallback); } // If the plug-in element already contains a subframe, loadOrRedirectSubframe will re-use it. Otherwise, // it will create a new frame and set it as the RenderPart's widget, causing what was previously // in the widget to be torn down. return loadOrRedirectSubframe(ownerElement, completedURL, frameName, true, true); }
bool SubframeLoader::loadPlugin(HTMLPlugInImageElement* pluginElement, const URL& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback) { RenderEmbeddedObject* renderer = pluginElement->renderEmbeddedObject(); // FIXME: This code should not depend on renderer! if (!renderer || useFallback) return false; pluginElement->subframeLoaderWillCreatePlugIn(url); IntSize contentSize = roundedIntSize(LayoutSize(renderer->contentWidth(), renderer->contentHeight())); bool loadManually = document()->isPluginDocument() && !m_containsPlugins && toPluginDocument(document())->shouldLoadPluginManually(); RefPtr<Widget> widget = m_frame.loader().client().createPlugin(contentSize, pluginElement, url, paramNames, paramValues, mimeType, loadManually); if (!widget) { if (!renderer->isPluginUnavailable()) renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginMissing); return false; } pluginElement->subframeLoaderDidCreatePlugIn(widget.get()); renderer->setWidget(widget); m_containsPlugins = true; #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) pluginElement->setNeedsStyleRecalc(SyntheticStyleChange); #endif return true; }
bool SubframeLoader::loadPlugin(HTMLPlugInImageElement& pluginElement, const URL& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback) { RenderEmbeddedObject* renderer = pluginElement.renderEmbeddedObject(); // FIXME: This code should not depend on renderer! if (!renderer || useFallback) return false; pluginElement.subframeLoaderWillCreatePlugIn(url); IntSize contentSize = roundedIntSize(LayoutSize(renderer->contentWidth(), renderer->contentHeight())); bool loadManually = is<PluginDocument>(*document()) && !m_containsPlugins && downcast<PluginDocument>(*document()).shouldLoadPluginManually(); #if PLATFORM(IOS) // On iOS, we only tell the plugin to be in full page mode if the containing plugin document is the top level document. if (document()->ownerElement()) loadManually = false; #endif RefPtr<Widget> widget = m_frame.loader().client().createPlugin(contentSize, &pluginElement, url, paramNames, paramValues, mimeType, loadManually); if (!widget) { if (!renderer->isPluginUnavailable()) renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginMissing); return false; } pluginElement.subframeLoaderDidCreatePlugIn(*widget); renderer->setWidget(widget); m_containsPlugins = true; return true; }
bool HTMLPlugInElement::loadPlugin(const KURL& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback) { Frame* frame = document().frame(); if (!frame->loader().allowPlugins(AboutToInstantiatePlugin)) return false; RenderEmbeddedObject* renderer = renderEmbeddedObject(); // FIXME: This code should not depend on renderer! if (!renderer || useFallback) return false; WTF_LOG(Plugins, "%p Plug-in URL: %s", this, m_url.utf8().data()); WTF_LOG(Plugins, " Loaded URL: %s", url.string().utf8().data()); m_loadedUrl = url; IntSize contentSize = roundedIntSize(LayoutSize(renderer->contentWidth(), renderer->contentHeight())); bool loadManually = document().isPluginDocument() && !document().containsPlugins() && toPluginDocument(document()).shouldLoadPluginManually(); RefPtr<Widget> widget = frame->loader().client()->createPlugin(contentSize, this, url, paramNames, paramValues, mimeType, loadManually); if (!widget) { if (!renderer->showsUnavailablePluginIndicator()) renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginMissing); return false; } renderer->setWidget(widget); document().setContainsPlugins(); setNeedsStyleRecalc(LocalStyleChange, StyleChangeFromRenderer); return true; }
bool HTMLPlugInElement::loadPlugin(const KURL& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback, bool requireRenderer) { LocalFrame* frame = document().frame(); if (!frame->loader().allowPlugins(AboutToInstantiatePlugin)) return false; RenderEmbeddedObject* renderer = renderEmbeddedObject(); // FIXME: This code should not depend on renderer! if ((!renderer && requireRenderer) || useFallback) return false; WTF_LOG(Plugins, "%p Plug-in URL: %s", this, m_url.utf8().data()); WTF_LOG(Plugins, " Loaded URL: %s", url.string().utf8().data()); m_loadedUrl = url; RefPtr<Widget> widget = m_persistedPluginWidget; if (!widget) { bool loadManually = document().isPluginDocument() && !document().containsPlugins() && toPluginDocument(document()).shouldLoadPluginManually(); FrameLoaderClient::DetachedPluginPolicy policy = requireRenderer ? FrameLoaderClient::FailOnDetachedPlugin : FrameLoaderClient::AllowDetachedPlugin; widget = frame->loader().client()->createPlugin(this, url, paramNames, paramValues, mimeType, loadManually, policy); } if (!widget) { if (renderer && !renderer->showsUnavailablePluginIndicator()) renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginMissing); return false; } if (renderer) { setWidget(widget); m_persistedPluginWidget = nullptr; } else if (widget != m_persistedPluginWidget) { m_persistedPluginWidget = widget; } document().setContainsPlugins(); scheduleSVGFilterLayerUpdateHack(); return true; }
void HTMLAppletElement::updateWidgetInternal() { setNeedsWidgetUpdate(false); // FIXME: This should ASSERT isFinishedParsingChildren() instead. if (!isFinishedParsingChildren()) return; RenderEmbeddedObject* renderer = renderEmbeddedObject(); LocalFrame* frame = document().frame(); ASSERT(frame); Vector<String> paramNames; Vector<String> paramValues; const AtomicString& codeBase = getAttribute(codebaseAttr); if (!codeBase.isNull()) { KURL codeBaseURL = document().completeURL(codeBase); paramNames.append("codeBase"); paramValues.append(codeBase.string()); } const AtomicString& archive = getAttribute(archiveAttr); if (!archive.isNull()) { paramNames.append("archive"); paramValues.append(archive.string()); } const AtomicString& code = getAttribute(codeAttr); paramNames.append("code"); paramValues.append(code.string()); // If the 'codebase' attribute is set, it serves as a relative root for the file that the Java // plugin will load. If the 'code' attribute is set, and the 'archive' is not set, then we need // to check the url generated by resolving 'code' against 'codebase'. If the 'archive' // attribute is set, then 'code' points to a class inside the archive, so we need to check the // url generated by resolving 'archive' against 'codebase'. KURL urlToCheck; KURL rootURL = codeBase.isNull() ? document().url() : document().completeURL(codeBase); if (!archive.isNull()) urlToCheck = KURL(rootURL, archive); else if (!code.isNull()) urlToCheck = KURL(rootURL, code); if (!canEmbedURL(urlToCheck)) return; const AtomicString& name = document().isHTMLDocument() ? getNameAttribute() : getIdAttribute(); if (!name.isNull()) { paramNames.append("name"); paramValues.append(name.string()); } paramNames.append("baseURL"); KURL baseURL = document().baseURL(); paramValues.append(baseURL.string()); const AtomicString& mayScript = getAttribute(mayscriptAttr); if (!mayScript.isNull()) { paramNames.append("mayScript"); paramValues.append(mayScript.string()); } for (HTMLParamElement* param = Traversal<HTMLParamElement>::firstChild(*this); param; param = Traversal<HTMLParamElement>::nextSibling(*param)) { if (param->name().isEmpty()) continue; paramNames.append(param->name()); paramValues.append(param->value()); } OwnPtrWillBeRawPtr<PluginPlaceholder> placeholder = nullptr; RefPtrWillBeRawPtr<Widget> widget = nullptr; if (frame->loader().allowPlugins(AboutToInstantiatePlugin)) { placeholder = frame->loader().client()->createPluginPlaceholder(document(), KURL(), paramNames, paramValues, m_serviceType, false); if (!placeholder) widget = frame->loader().client()->createJavaAppletWidget(this, baseURL, paramNames, paramValues); } if (!placeholder && !widget) { if (!renderer->showsUnavailablePluginIndicator()) renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginMissing); setPlaceholder(nullptr); } else if (placeholder) { setPlaceholder(placeholder.release()); } else if (widget) { document().setContainsPlugins(); setWidget(widget); setPlaceholder(nullptr); } }
void HTMLAppletElement::updateWidget(PluginCreationOption) { setNeedsWidgetUpdate(false); // FIXME: This should ASSERT isFinishedParsingChildren() instead. if (!isFinishedParsingChildren()) return; RenderEmbeddedObject* renderer = renderEmbeddedObject(); LayoutUnit contentWidth = renderer->style()->width().isFixed() ? LayoutUnit(renderer->style()->width().value()) : renderer->width() - renderer->borderAndPaddingWidth(); LayoutUnit contentHeight = renderer->style()->height().isFixed() ? LayoutUnit(renderer->style()->height().value()) : renderer->height() - renderer->borderAndPaddingHeight(); Vector<String> paramNames; Vector<String> paramValues; paramNames.append("code"); paramValues.append(getAttribute(codeAttr).string()); const AtomicString& codeBase = getAttribute(codebaseAttr); if (!codeBase.isNull()) { paramNames.append("codeBase"); paramValues.append(codeBase.string()); } const AtomicString& name = document()->isHTMLDocument() ? getNameAttribute() : getIdAttribute(); if (!name.isNull()) { paramNames.append("name"); paramValues.append(name.string()); } const AtomicString& archive = getAttribute(archiveAttr); if (!archive.isNull()) { paramNames.append("archive"); paramValues.append(archive.string()); } paramNames.append("baseURL"); paramValues.append(document()->baseURL().string()); const AtomicString& mayScript = getAttribute(mayscriptAttr); if (!mayScript.isNull()) { paramNames.append("mayScript"); paramValues.append(mayScript.string()); } for (Node* child = firstChild(); child; child = child->nextSibling()) { if (!child->hasTagName(paramTag)) continue; HTMLParamElement* param = static_cast<HTMLParamElement*>(child); if (param->name().isEmpty()) continue; paramNames.append(param->name()); paramValues.append(param->value()); } Frame* frame = document()->frame(); ASSERT(frame); renderer->setWidget(frame->loader()->subframeLoader()->createJavaAppletWidget(roundedIntSize(LayoutSize(contentWidth, contentHeight)), this, paramNames, paramValues)); }
void HTMLAppletElement::updateWidgetInternal() { ASSERT(!m_isDelayingLoadEvent); setNeedsWidgetUpdate(false); // FIXME: This should ASSERT isFinishedParsingChildren() instead. if (!isFinishedParsingChildren()) return; RenderEmbeddedObject* renderer = renderEmbeddedObject(); Frame* frame = document().frame(); ASSERT(frame); LayoutUnit contentWidth = renderer->style()->width().isFixed() ? LayoutUnit(renderer->style()->width().value()) : renderer->width() - renderer->borderAndPaddingWidth(); LayoutUnit contentHeight = renderer->style()->height().isFixed() ? LayoutUnit(renderer->style()->height().value()) : renderer->height() - renderer->borderAndPaddingHeight(); Vector<String> paramNames; Vector<String> paramValues; const AtomicString& codeBase = getAttribute(codebaseAttr); if (!codeBase.isNull()) { KURL codeBaseURL = document().completeURL(codeBase); paramNames.append("codeBase"); paramValues.append(codeBase.string()); } const AtomicString& archive = getAttribute(archiveAttr); if (!archive.isNull()) { paramNames.append("archive"); paramValues.append(archive.string()); } const AtomicString& code = getAttribute(codeAttr); paramNames.append("code"); paramValues.append(code.string()); // If the 'codebase' attribute is set, it serves as a relative root for the file that the Java // plugin will load. If the 'code' attribute is set, and the 'archive' is not set, then we need // to check the url generated by resolving 'code' against 'codebase'. If the 'archive' // attribute is set, then 'code' points to a class inside the archive, so we need to check the // url generated by resolving 'archive' against 'codebase'. KURL urlToCheck; KURL rootURL = codeBase.isNull() ? document().url() : document().completeURL(codeBase); if (!archive.isNull()) urlToCheck = KURL(rootURL, archive); else if (!code.isNull()) urlToCheck = KURL(rootURL, code); if (!canEmbedURL(urlToCheck)) return; const AtomicString& name = document().isHTMLDocument() ? getNameAttribute() : getIdAttribute(); if (!name.isNull()) { paramNames.append("name"); paramValues.append(name.string()); } paramNames.append("baseURL"); KURL baseURL = document().baseURL(); paramValues.append(baseURL.string()); const AtomicString& mayScript = getAttribute(mayscriptAttr); if (!mayScript.isNull()) { paramNames.append("mayScript"); paramValues.append(mayScript.string()); } for (Node* child = firstChild(); child; child = child->nextSibling()) { if (!child->hasTagName(paramTag)) continue; HTMLParamElement* param = toHTMLParamElement(child); if (param->name().isEmpty()) continue; paramNames.append(param->name()); paramValues.append(param->value()); } RefPtr<Widget> widget; if (frame->loader().allowPlugins(AboutToInstantiatePlugin)) widget = frame->loader().client()->createJavaAppletWidget(roundedIntSize(LayoutSize(contentWidth, contentHeight)), this, baseURL, paramNames, paramValues); if (!widget) { if (!renderer->showsUnavailablePluginIndicator()) renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginMissing); return; } document().setContainsPlugins(); renderer->setWidget(widget); }
void HTMLAppletElement::updateWidget(PluginCreationOption) { setNeedsWidgetUpdate(false); // FIXME: This should ASSERT isFinishedParsingChildren() instead. if (!isFinishedParsingChildren()) return; RenderEmbeddedObject* renderer = renderEmbeddedObject(); Frame* frame = document().frame(); ASSERT(frame); LayoutUnit contentWidth = renderer->style()->width().isFixed() ? LayoutUnit(renderer->style()->width().value()) : renderer->width() - renderer->borderAndPaddingWidth(); LayoutUnit contentHeight = renderer->style()->height().isFixed() ? LayoutUnit(renderer->style()->height().value()) : renderer->height() - renderer->borderAndPaddingHeight(); Vector<String> paramNames; Vector<String> paramValues; paramNames.append("code"); paramValues.append(getAttribute(codeAttr).string()); const AtomicString& codeBase = getAttribute(codebaseAttr); if (!codeBase.isNull()) { KURL codeBaseURL = document().completeURL(codeBase); if (!document().securityOrigin()->canDisplay(codeBaseURL)) { FrameLoader::reportLocalLoadFailed(frame, codeBaseURL.string()); return; } const char javaAppletMimeType[] = "application/x-java-applet"; if (!document().contentSecurityPolicy()->allowObjectFromSource(codeBaseURL) || !document().contentSecurityPolicy()->allowPluginType(javaAppletMimeType, javaAppletMimeType, codeBaseURL)) return; paramNames.append("codeBase"); paramValues.append(codeBase.string()); } const AtomicString& name = document().isHTMLDocument() ? getNameAttribute() : getIdAttribute(); if (!name.isNull()) { paramNames.append("name"); paramValues.append(name.string()); } const AtomicString& archive = getAttribute(archiveAttr); if (!archive.isNull()) { paramNames.append("archive"); paramValues.append(archive.string()); } paramNames.append("baseURL"); KURL baseURL = document().baseURL(); paramValues.append(baseURL.string()); const AtomicString& mayScript = getAttribute(mayscriptAttr); if (!mayScript.isNull()) { paramNames.append("mayScript"); paramValues.append(mayScript.string()); } for (Node* child = firstChild(); child; child = child->nextSibling()) { if (!child->hasTagName(paramTag)) continue; HTMLParamElement* param = toHTMLParamElement(child); if (param->name().isEmpty()) continue; paramNames.append(param->name()); paramValues.append(param->value()); } RefPtr<Widget> widget; if (frame->loader()->allowPlugins(AboutToInstantiatePlugin)) widget = frame->loader()->client()->createJavaAppletWidget(roundedIntSize(LayoutSize(contentWidth, contentHeight)), this, baseURL, paramNames, paramValues); if (!widget) { if (!renderer->showsUnavailablePluginIndicator()) renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginMissing); return; } frame->loader()->setContainsPlugins(); renderer->setWidget(widget); }
void HTMLAppletElement::updateWidget(PluginCreationOption pluginCreationOption) { setNeedsWidgetUpdate(false); // FIXME: This should ASSERT isFinishedParsingChildren() instead. if (!isFinishedParsingChildren()) return; #if PLATFORM(IOS) UNUSED_PARAM(pluginCreationOption); #else // FIXME: It's sadness that we have this special case here. // See http://trac.webkit.org/changeset/25128 and // plugins/netscape-plugin-setwindow-size.html if (pluginCreationOption == CreateOnlyNonNetscapePlugins) { // Ensure updateWidget() is called again during layout to create the Netscape plug-in. setNeedsWidgetUpdate(true); return; } RenderEmbeddedObject* renderer = renderEmbeddedObject(); LayoutUnit contentWidth = renderer->style().width().isFixed() ? LayoutUnit(renderer->style().width().value()) : renderer->width() - renderer->horizontalBorderAndPaddingExtent(); LayoutUnit contentHeight = renderer->style().height().isFixed() ? LayoutUnit(renderer->style().height().value()) : renderer->height() - renderer->verticalBorderAndPaddingExtent(); Vector<String> paramNames; Vector<String> paramValues; paramNames.append("code"); paramValues.append(fastGetAttribute(codeAttr).string()); const AtomicString& codeBase = fastGetAttribute(codebaseAttr); if (!codeBase.isNull()) { paramNames.append(ASCIILiteral("codeBase")); paramValues.append(codeBase.string()); } const AtomicString& name = document().isHTMLDocument() ? getNameAttribute() : getIdAttribute(); if (!name.isNull()) { paramNames.append("name"); paramValues.append(name.string()); } const AtomicString& archive = fastGetAttribute(archiveAttr); if (!archive.isNull()) { paramNames.append(ASCIILiteral("archive")); paramValues.append(archive.string()); } paramNames.append(ASCIILiteral("baseURL")); paramValues.append(document().baseURL().string()); const AtomicString& mayScript = fastGetAttribute(mayscriptAttr); if (!mayScript.isNull()) { paramNames.append(ASCIILiteral("mayScript")); paramValues.append(mayScript.string()); } for (auto& param : childrenOfType<HTMLParamElement>(*this)) { if (param.name().isEmpty()) continue; paramNames.append(param.name()); paramValues.append(param.value()); } Frame* frame = document().frame(); ASSERT(frame); renderer->setWidget(frame->loader().subframeLoader().createJavaAppletWidget(roundedIntSize(LayoutSize(contentWidth, contentHeight)), *this, paramNames, paramValues)); #endif // !PLATFORM(IOS) }
static inline bool isSmallerThanTinySizingThreshold(const RenderEmbeddedObject& renderer) { LayoutRect contentRect = renderer.contentBoxRect(); return contentRect.width() <= sizingTinyDimensionThreshold || contentRect.height() <= sizingTinyDimensionThreshold; }