Changeset 158962 in webkit


Ignore:
Timestamp:
Nov 8, 2013 3:23:16 PM (10 years ago)
Author:
weinig@apple.com
Message:

Teach SubframeLoader a bit about references
https://bugs.webkit.org/show_bug.cgi?id=124076

Reviewed by Anders Carlsson.

  • html/HTMLAppletElement.cpp:
  • html/HTMLFrameElementBase.cpp:
  • html/HTMLMediaElement.cpp:
  • loader/SubframeLoader.cpp:
  • loader/SubframeLoader.h:
Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r158961 r158962  
     12013-11-08  Sam Weinig  <sam@webkit.org>
     2
     3        Teach SubframeLoader a bit about references
     4        https://bugs.webkit.org/show_bug.cgi?id=124076
     5
     6        Reviewed by Anders Carlsson.
     7
     8        * html/HTMLAppletElement.cpp:
     9        * html/HTMLFrameElementBase.cpp:
     10        * html/HTMLMediaElement.cpp:
     11        * loader/SubframeLoader.cpp:
     12        * loader/SubframeLoader.h:
     13
    1142013-11-08  Brady Eidson  <beidson@apple.com>
    215
  • trunk/Source/WebCore/html/HTMLAppletElement.cpp

    r158163 r158962  
    161161    ASSERT(frame);
    162162
    163     renderer->setWidget(frame->loader().subframeLoader().createJavaAppletWidget(roundedIntSize(LayoutSize(contentWidth, contentHeight)), this, paramNames, paramValues));
     163    renderer->setWidget(frame->loader().subframeLoader().createJavaAppletWidget(roundedIntSize(LayoutSize(contentWidth, contentHeight)), *this, paramNames, paramValues));
    164164}
    165165
  • trunk/Source/WebCore/html/HTMLFrameElementBase.cpp

    r156903 r158962  
    8787        return;
    8888
    89     parentFrame->loader().subframeLoader().requestFrame(this, m_URL, m_frameName, lockHistory, lockBackForwardList);
     89    parentFrame->loader().subframeLoader().requestFrame(*this, m_URL, m_frameName, lockHistory, lockBackForwardList);
    9090    if (contentFrame())
    9191        contentFrame()->setInViewSourceMode(viewSourceMode());
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r158874 r158962  
    43824382    // Hang onto the proxy widget so it won't be destroyed if the plug-in is set to
    43834383    // display:none
    4384     m_proxyWidget = frame->loader().subframeLoader().loadMediaPlayerProxyPlugin(this, url, paramNames, paramValues);
     4384    m_proxyWidget = frame->loader().subframeLoader().loadMediaPlayerProxyPlugin(*this, url, paramNames, paramValues);
    43854385    if (m_proxyWidget)
    43864386        m_needWidgetUpdate = false;
     
    43994399    // FIXME: What if document().frame() is 0?
    44004400    SubframeLoader& loader = document().frame()->loader().subframeLoader();
    4401     loader.loadMediaPlayerProxyPlugin(mediaElement, kurl, paramNames, paramValues);
     4401    loader.loadMediaPlayerProxyPlugin(*mediaElement, kurl, paramNames, paramValues);
    44024402}
    44034403
  • trunk/Source/WebCore/loader/SubframeLoader.cpp

    r158657 r158962  
    7676}
    7777
    78 bool SubframeLoader::requestFrame(HTMLFrameOwnerElement* ownerElement, const String& urlString, const AtomicString& frameName, bool lockHistory, bool lockBackForwardList)
     78bool SubframeLoader::requestFrame(HTMLFrameOwnerElement& ownerElement, const String& urlString, const AtomicString& frameName, bool lockHistory, bool lockBackForwardList)
    7979{
    8080    // Support for <frame src="javascript:string">
     
    107107}
    108108
    109 bool SubframeLoader::pluginIsLoadable(HTMLPlugInImageElement* pluginElement, const URL& url, const String& mimeType)
     109bool SubframeLoader::pluginIsLoadable(HTMLPlugInImageElement& pluginElement, const URL& url, const String& mimeType)
    110110{
    111111    if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) {
     
    127127        String declaredMimeType = document()->isPluginDocument() && document()->ownerElement() ?
    128128            document()->ownerElement()->fastGetAttribute(HTMLNames::typeAttr) :
    129             pluginElement->fastGetAttribute(HTMLNames::typeAttr);
     129            pluginElement.fastGetAttribute(HTMLNames::typeAttr);
    130130        if (!document()->contentSecurityPolicy()->allowObjectFromSource(url)
    131131            || !document()->contentSecurityPolicy()->allowPluginType(mimeType, declaredMimeType, url)) {
    132             RenderEmbeddedObject* renderer = pluginElement->renderEmbeddedObject();
     132            RenderEmbeddedObject* renderer = pluginElement.renderEmbeddedObject();
    133133            renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginBlockedByContentSecurityPolicy);
    134134            return false;
     
    142142}
    143143
    144 bool SubframeLoader::requestPlugin(HTMLPlugInImageElement* ownerElement, const URL& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback)
     144bool SubframeLoader::requestPlugin(HTMLPlugInImageElement& ownerElement, const URL& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback)
    145145{
    146146    // Application plug-ins are plug-ins implemented by the user agent, for example Qt plug-ins,
     
    153153        return false;
    154154
    155     ASSERT(ownerElement->hasTagName(objectTag) || ownerElement->hasTagName(embedTag));
     155    ASSERT(ownerElement.hasTagName(objectTag) || ownerElement.hasTagName(embedTag));
    156156    return loadPlugin(ownerElement, url, mimeType, paramNames, paramValues, useFallback);
    157157}
     
    222222    bool useFallback;
    223223    if (shouldUsePlugin(completedURL, mimeType, ownerElement.shouldPreferPlugInsForImages(), hasFallbackContent, useFallback)) {
    224         bool success = requestPlugin(&ownerElement, completedURL, mimeType, paramNames, paramValues, useFallback);
     224        bool success = requestPlugin(ownerElement, completedURL, mimeType, paramNames, paramValues, useFallback);
    225225        logPluginRequest(document()->page(), mimeType, completedURL, success);
    226226        return success;
     
    230230    // it will create a new frame and set it as the RenderWidget's Widget, causing what was previously
    231231    // in the widget to be torn down.
    232     return loadOrRedirectSubframe(&ownerElement, completedURL, frameName, true, true);
     232    return loadOrRedirectSubframe(ownerElement, completedURL, frameName, true, true);
    233233}
    234234
    235235#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
    236 PassRefPtr<Widget> SubframeLoader::loadMediaPlayerProxyPlugin(Node* node, const URL& url,
    237     const Vector<String>& paramNames, const Vector<String>& paramValues)
    238 {
    239     ASSERT(node->hasTagName(videoTag) || isHTMLAudioElement(node));
     236PassRefPtr<Widget> SubframeLoader::loadMediaPlayerProxyPlugin(HTMLMediaElement& mediaElement, const URL& url, const Vector<String>& paramNames, const Vector<String>& paramValues)
     237{
     238    ASSERT(mediaElement.hasTagName(videoTag) || isHTMLAudioElement(mediaElement));
    240239
    241240    URL completedURL;
     
    245244    if (!m_frame.document()->securityOrigin()->canDisplay(completedURL)) {
    246245        FrameLoader::reportLocalLoadFailed(m_frame, completedURL.string());
    247         return 0;
     246        return nullptr;
    248247    }
    249248
    250249    if (!m_frame.document()->contentSecurityPolicy()->allowMediaFromSource(completedURL))
    251         return 0;
    252 
    253     HTMLMediaElement* mediaElement = toHTMLMediaElement(node);
    254     RenderWidget* renderer = toRenderWidget(node->renderer());
     250        return nullptr;
     251
     252    RenderWidget* renderer = toRenderWidget(mediaElement.renderer());
    255253    IntSize size;
    256254
    257255    if (renderer)
    258256        size = roundedIntSize(LayoutSize(renderer->contentWidth(), renderer->contentHeight()));
    259     else if (mediaElement->isVideo())
     257    else if (mediaElement.isVideo())
    260258        size = RenderVideo::defaultSize();
    261259
    262260    if (!m_frame.loader().mixedContentChecker().canRunInsecureContent(m_frame.document()->securityOrigin(), completedURL))
    263         return 0;
    264 
    265     RefPtr<Widget> widget = m_frame.loader().client().createMediaPlayerProxyPlugin(size, mediaElement, completedURL,
    266                                          paramNames, paramValues, "application/x-media-element-proxy-plugin");
     261        return nullptr;
     262
     263    RefPtr<Widget> widget = m_frame.loader().client().createMediaPlayerProxyPlugin(size, &mediaElement, completedURL, paramNames, paramValues, "application/x-media-element-proxy-plugin");
    267264
    268265    if (widget && renderer) {
     
    272269    m_containsPlugins = true;
    273270
    274     return widget ? widget.release() : 0;
     271    return widget ? widget.release() : nullptr;
    275272}
    276273#endif // ENABLE(PLUGIN_PROXY_FOR_VIDEO)
    277274
    278 PassRefPtr<Widget> SubframeLoader::createJavaAppletWidget(const IntSize& size, HTMLAppletElement* element, const Vector<String>& paramNames, const Vector<String>& paramValues)
     275PassRefPtr<Widget> SubframeLoader::createJavaAppletWidget(const IntSize& size, HTMLAppletElement& element, const Vector<String>& paramNames, const Vector<String>& paramValues)
    279276{
    280277    String baseURLString;
     
    290287    if (!codeBaseURLString.isEmpty()) {
    291288        URL codeBaseURL = completeURL(codeBaseURLString);
    292         if (!element->document().securityOrigin()->canDisplay(codeBaseURL)) {
     289        if (!element.document().securityOrigin()->canDisplay(codeBaseURL)) {
    293290            FrameLoader::reportLocalLoadFailed(&m_frame, codeBaseURL.string());
    294             return 0;
     291            return nullptr;
    295292        }
    296293
    297294        const char javaAppletMimeType[] = "application/x-java-applet";
    298         if (!element->document().contentSecurityPolicy()->allowObjectFromSource(codeBaseURL)
    299             || !element->document().contentSecurityPolicy()->allowPluginType(javaAppletMimeType, javaAppletMimeType, codeBaseURL))
    300             return 0;
     295        if (!element.document().contentSecurityPolicy()->allowObjectFromSource(codeBaseURL)
     296            || !element.document().contentSecurityPolicy()->allowPluginType(javaAppletMimeType, javaAppletMimeType, codeBaseURL))
     297            return nullptr;
    301298    }
    302299
     
    307304    RefPtr<Widget> widget;
    308305    if (allowPlugins(AboutToInstantiatePlugin))
    309         widget = m_frame.loader().client().createJavaAppletWidget(size, element, baseURL, paramNames, paramValues);
    310 
    311     logPluginRequest(document()->page(), element->serviceType(), String(), widget);
     306        widget = m_frame.loader().client().createJavaAppletWidget(size, &element, baseURL, paramNames, paramValues);
     307
     308    logPluginRequest(document()->page(), element.serviceType(), String(), widget);
    312309
    313310    if (!widget) {
    314         RenderEmbeddedObject* renderer = element->renderEmbeddedObject();
     311        RenderEmbeddedObject* renderer = element.renderEmbeddedObject();
    315312
    316313        if (!renderer->isPluginUnavailable())
    317314            renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginMissing);
    318         return 0;
     315        return nullptr;
    319316    }
    320317
     
    323320}
    324321
    325 Frame* SubframeLoader::loadOrRedirectSubframe(HTMLFrameOwnerElement* ownerElement, const URL& url, const AtomicString& frameName, bool lockHistory, bool lockBackForwardList)
    326 {
    327     Frame* frame = ownerElement->contentFrame();
     322Frame* SubframeLoader::loadOrRedirectSubframe(HTMLFrameOwnerElement& ownerElement, const URL& url, const AtomicString& frameName, bool lockHistory, bool lockBackForwardList)
     323{
     324    Frame* frame = ownerElement.contentFrame();
    328325    if (frame)
    329326        frame->navigationScheduler().scheduleLocationChange(m_frame.document()->securityOrigin(), url.string(), m_frame.loader().outgoingReferrer(), lockHistory, lockBackForwardList);
     
    331328        frame = loadSubframe(ownerElement, url, frameName, m_frame.loader().outgoingReferrer());
    332329
    333     ASSERT(ownerElement->contentFrame() == frame || !ownerElement->contentFrame());
    334     return ownerElement->contentFrame();
    335 }
    336 
    337 Frame* SubframeLoader::loadSubframe(HTMLFrameOwnerElement* ownerElement, const URL& url, const String& name, const String& referrer)
     330    ASSERT(ownerElement.contentFrame() == frame || !ownerElement.contentFrame());
     331    return ownerElement.contentFrame();
     332}
     333
     334Frame* SubframeLoader::loadSubframe(HTMLFrameOwnerElement& ownerElement, const URL& url, const String& name, const String& referrer)
    338335{
    339336    Ref<Frame> protect(m_frame);
     
    342339    int marginWidth = -1;
    343340    int marginHeight = -1;
    344     if (ownerElement->hasTagName(frameTag) || ownerElement->hasTagName(iframeTag)) {
    345         HTMLFrameElementBase* frameElementBase = toHTMLFrameElementBase(ownerElement);
    346         allowsScrolling = frameElementBase->scrollingMode() != ScrollbarAlwaysOff;
    347         marginWidth = frameElementBase->marginWidth();
    348         marginHeight = frameElementBase->marginHeight();
    349     }
    350 
    351     if (!ownerElement->document().securityOrigin()->canDisplay(url)) {
     341    if (ownerElement.hasTagName(frameTag) || ownerElement.hasTagName(iframeTag)) {
     342        HTMLFrameElementBase& frameElementBase = toHTMLFrameElementBase(ownerElement);
     343        allowsScrolling = frameElementBase.scrollingMode() != ScrollbarAlwaysOff;
     344        marginWidth = frameElementBase.marginWidth();
     345        marginHeight = frameElementBase.marginHeight();
     346    }
     347
     348    if (!ownerElement.document().securityOrigin()->canDisplay(url)) {
    352349        FrameLoader::reportLocalLoadFailed(&m_frame, url.string());
    353         return 0;
    354     }
    355 
    356     String referrerToUse = SecurityPolicy::generateReferrerHeader(ownerElement->document().referrerPolicy(), url, referrer);
    357     RefPtr<Frame> frame = m_frame.loader().client().createFrame(url, name, ownerElement, referrerToUse, allowsScrolling, marginWidth, marginHeight);
     350        return nullptr;
     351    }
     352
     353    String referrerToUse = SecurityPolicy::generateReferrerHeader(ownerElement.document().referrerPolicy(), url, referrer);
     354    RefPtr<Frame> frame = m_frame.loader().client().createFrame(url, name, &ownerElement, referrerToUse, allowsScrolling, marginWidth, marginHeight);
    358355
    359356    if (!frame)  {
    360357        m_frame.loader().checkCallImplicitClose();
    361         return 0;
     358        return nullptr;
    362359    }
    363360   
     
    370367    frame->loader().started();
    371368   
    372     RenderObject* renderer = ownerElement->renderer();
     369    RenderObject* renderer = ownerElement.renderer();
    373370    FrameView* view = frame->view();
    374371    if (renderer && renderer->isWidget() && view)
     
    424421}
    425422
    426 bool SubframeLoader::loadPlugin(HTMLPlugInImageElement* pluginElement, const URL& url, const String& mimeType,
    427     const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback)
    428 {
    429     RenderEmbeddedObject* renderer = pluginElement->renderEmbeddedObject();
     423bool SubframeLoader::loadPlugin(HTMLPlugInImageElement& pluginElement, const URL& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback)
     424{
     425    RenderEmbeddedObject* renderer = pluginElement.renderEmbeddedObject();
    430426
    431427    // FIXME: This code should not depend on renderer!
     
    433429        return false;
    434430
    435     pluginElement->subframeLoaderWillCreatePlugIn(url);
     431    pluginElement.subframeLoaderWillCreatePlugIn(url);
    436432
    437433    IntSize contentSize = roundedIntSize(LayoutSize(renderer->contentWidth(), renderer->contentHeight()));
    438434    bool loadManually = document()->isPluginDocument() && !m_containsPlugins && toPluginDocument(document())->shouldLoadPluginManually();
    439     RefPtr<Widget> widget = m_frame.loader().client().createPlugin(contentSize,
    440         pluginElement, url, paramNames, paramValues, mimeType, loadManually);
     435    RefPtr<Widget> widget = m_frame.loader().client().createPlugin(contentSize, &pluginElement, url, paramNames, paramValues, mimeType, loadManually);
    441436
    442437    if (!widget) {
     
    446441    }
    447442
    448     pluginElement->subframeLoaderDidCreatePlugIn(widget.get());
     443    pluginElement.subframeLoaderDidCreatePlugIn(widget.get());
    449444    renderer->setWidget(widget);
    450445    m_containsPlugins = true;
  • trunk/Source/WebCore/loader/SubframeLoader.h

    r158657 r158962  
    4646class HTMLAppletElement;
    4747class HTMLFrameOwnerElement;
     48class HTMLMediaElement;
    4849class HTMLPlugInImageElement;
    4950class IntSize;
    5051class URL;
    51 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
    52 class Node;
    53 #endif
    5452class Widget;
    5553
     
    6260    void clear();
    6361
    64     bool requestFrame(HTMLFrameOwnerElement*, const String& url, const AtomicString& frameName, bool lockHistory = true, bool lockBackForwardList = true);   
     62    bool requestFrame(HTMLFrameOwnerElement&, const String& url, const AtomicString& frameName, bool lockHistory = true, bool lockBackForwardList = true);
    6563    bool requestObject(HTMLPlugInImageElement&, const String& url, const AtomicString& frameName,
    6664        const String& serviceType, const Vector<String>& paramNames, const Vector<String>& paramValues);
    6765
    6866#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
    69     // FIXME: This should take Element* instead of Node*, or better yet the
    70     // specific type of Element which this code depends on.
    71     PassRefPtr<Widget> loadMediaPlayerProxyPlugin(Node*, const URL&, const Vector<String>& paramNames, const Vector<String>& paramValues);
     67    PassRefPtr<Widget> loadMediaPlayerProxyPlugin(HTMLMediaElement&, const URL&, const Vector<String>& paramNames, const Vector<String>& paramValues);
    7268#endif
    7369
    74     PassRefPtr<Widget> createJavaAppletWidget(const IntSize&, HTMLAppletElement*, const Vector<String>& paramNames, const Vector<String>& paramValues);
     70    PassRefPtr<Widget> createJavaAppletWidget(const IntSize&, HTMLAppletElement&, const Vector<String>& paramNames, const Vector<String>& paramValues);
    7571
    7672    bool allowPlugins(ReasonForCallingAllowPlugins);
     
    8177
    8278private:
    83     bool requestPlugin(HTMLPlugInImageElement*, const URL&, const String& serviceType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback);
    84     Frame* loadOrRedirectSubframe(HTMLFrameOwnerElement*, const URL&, const AtomicString& frameName, bool lockHistory, bool lockBackForwardList);
    85     Frame* loadSubframe(HTMLFrameOwnerElement*, const URL&, const String& name, const String& referrer);
    86     bool loadPlugin(HTMLPlugInImageElement*, const URL&, const String& mimeType,
    87         const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback);
     79    bool requestPlugin(HTMLPlugInImageElement&, const URL&, const String& serviceType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback);
     80    Frame* loadOrRedirectSubframe(HTMLFrameOwnerElement&, const URL&, const AtomicString& frameName, bool lockHistory, bool lockBackForwardList);
     81    Frame* loadSubframe(HTMLFrameOwnerElement&, const URL&, const String& name, const String& referrer);
     82    bool loadPlugin(HTMLPlugInImageElement&, const URL&, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback);
    8883
    8984    bool shouldUsePlugin(const URL&, const String& mimeType, bool shouldPreferPlugInsForImages, bool hasFallback, bool& useFallback);
    90     bool pluginIsLoadable(HTMLPlugInImageElement*, const URL&, const String& mimeType);
     85    bool pluginIsLoadable(HTMLPlugInImageElement&, const URL&, const String& mimeType);
    9186
    9287    Document* document() const;
Note: See TracChangeset for help on using the changeset viewer.