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; }
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; }
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; }