Changeset 66711 in webkit


Ignore:
Timestamp:
Sep 2, 2010 9:49:14 PM (14 years ago)
Author:
eric@webkit.org
Message:

2010-09-02 Eric Seidel <eric@webkit.org>

Reviewed by Dimitri Glazkov.

Move updateWidget into FrameView from RenderEmbeddedObject
https://bugs.webkit.org/show_bug.cgi?id=45065

I also made updateWidget() virtual on HTMLPlugInImageElement.
I'm not yet sure that updateWidget belongs on HTMLElement since
I'm not sure that HTMLMediaElement's use of the updateWidget
infrastructure is correct.

I also got rid of the strange !m_replacementText.isEmpty() checks
by making a pluginCrashedOrWasMissing() call which seems to embody
the idea behind that check and hides the screwy details.

I noticed a couple methods on HTMLPlugInImageElement were public
which did not need to be. Fixed.

No functional change, thus no tests.

  • html/HTMLEmbedElement.h:
  • html/HTMLObjectElement.h:
  • html/HTMLPlugInImageElement.cpp: (WebCore::HTMLPlugInImageElement::updateWidgetIfNecessary):
  • html/HTMLPlugInImageElement.h: (WebCore::HTMLPlugInImageElement::serviceType): (WebCore::HTMLPlugInImageElement::url):
  • page/FrameView.cpp: (WebCore::FrameView::updateWidget): (WebCore::FrameView::updateWidgets):
  • page/FrameView.h:
  • rendering/RenderEmbeddedObject.cpp: (WebCore::RenderEmbeddedObject::pluginCrashedOrWasMissing): (WebCore::RenderEmbeddedObject::paint): (WebCore::RenderEmbeddedObject::paintReplaced):
  • rendering/RenderEmbeddedObject.h:
Location:
trunk/WebCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r66710 r66711  
     12010-09-02  Eric Seidel  <eric@webkit.org>
     2
     3        Reviewed by Dimitri Glazkov.
     4
     5        Move updateWidget into FrameView from RenderEmbeddedObject
     6        https://bugs.webkit.org/show_bug.cgi?id=45065
     7
     8        I also made updateWidget() virtual on HTMLPlugInImageElement.
     9        I'm not yet sure that updateWidget belongs on HTMLElement since
     10        I'm not sure that HTMLMediaElement's use of the updateWidget
     11        infrastructure is correct.
     12
     13        I also got rid of the strange !m_replacementText.isEmpty() checks
     14        by making a pluginCrashedOrWasMissing() call which seems to embody
     15        the idea behind that check and hides the screwy details.
     16
     17        I noticed a couple methods on HTMLPlugInImageElement were public
     18        which did not need to be.  Fixed.
     19
     20        No functional change, thus no tests.
     21
     22        * html/HTMLEmbedElement.h:
     23        * html/HTMLObjectElement.h:
     24        * html/HTMLPlugInImageElement.cpp:
     25        (WebCore::HTMLPlugInImageElement::updateWidgetIfNecessary):
     26        * html/HTMLPlugInImageElement.h:
     27        (WebCore::HTMLPlugInImageElement::serviceType):
     28        (WebCore::HTMLPlugInImageElement::url):
     29        * page/FrameView.cpp:
     30        (WebCore::FrameView::updateWidget):
     31        (WebCore::FrameView::updateWidgets):
     32        * page/FrameView.h:
     33        * rendering/RenderEmbeddedObject.cpp:
     34        (WebCore::RenderEmbeddedObject::pluginCrashedOrWasMissing):
     35        (WebCore::RenderEmbeddedObject::paint):
     36        (WebCore::RenderEmbeddedObject::paintReplaced):
     37        * rendering/RenderEmbeddedObject.h:
     38
    1392010-09-02  Eric Seidel  <eric@webkit.org>
    240
  • trunk/WebCore/html/HTMLEmbedElement.cpp

    r66710 r66711  
    138138void HTMLEmbedElement::updateWidget(bool onlyCreateNonNetscapePlugins)
    139139{
     140    ASSERT(!renderEmbeddedObject()->pluginCrashedOrWasMissing());
    140141    // FIXME: We should ASSERT(needsWidgetUpdate()), but currently
    141142    // FrameView::updateWidget() calls updateWidget(false) without checking if
  • trunk/WebCore/html/HTMLEmbedElement.h

    r66710 r66711  
    3232    static PassRefPtr<HTMLEmbedElement> create(const QualifiedName&, Document*, bool createdByParser);
    3333
    34     void updateWidget(bool onlyCreateNonNetscapePlugins);
    35 
    3634private:
    3735    HTMLEmbedElement(const QualifiedName&, Document*, bool createdByParser);
     
    4442    virtual void removedFromDocument();
    4543    virtual void attributeChanged(Attribute*, bool preserveDecls = false);
    46    
     44
    4745    virtual bool isURLAttribute(Attribute*) const;
    4846    virtual const QualifiedName& imageSourceAttributeName() const;
    4947
    5048    virtual RenderWidget* renderWidgetForJSBindings() const;
     49
     50    virtual void updateWidget(bool onlyCreateNonNetscapePlugins);
    5151
    5252    virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
  • trunk/WebCore/html/HTMLObjectElement.cpp

    r66710 r66711  
    241241void HTMLObjectElement::updateWidget(bool onlyCreateNonNetscapePlugins)
    242242{
     243    ASSERT(!renderEmbeddedObject()->pluginCrashedOrWasMissing());
    243244    // FIXME: We should ASSERT(needsWidgetUpdate()), but currently
    244245    // FrameView::updateWidget() calls updateWidget(false) without checking if
  • trunk/WebCore/html/HTMLObjectElement.h

    r66710 r66711  
    3838    bool containsJavaApplet() const;
    3939
    40     void updateWidget(bool onlyCreateNonNetscapePlugins);
    41 
    4240    virtual bool useFallbackContent() const { return m_useFallbackContent; }
    4341    void renderFallbackContent();
     
    6159    virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
    6260
     61    virtual void updateWidget(bool onlyCreateNonNetscapePlugins);
    6362    void updateDocNamedItem();
    6463
  • trunk/WebCore/html/HTMLPlugInImageElement.cpp

    r66709 r66711  
    160160{
    161161    document()->updateStyleIfNeeded();
    162     if (needsWidgetUpdate() && renderEmbeddedObject() && !useFallbackContent() && !isImageType())
    163         renderEmbeddedObject()->updateWidget(true);
     162
     163    if (!needsWidgetUpdate() || useFallbackContent() || isImageType())
     164        return;
     165
     166    if (!renderEmbeddedObject() || renderEmbeddedObject()->pluginCrashedOrWasMissing())
     167        return;
     168
     169    // True indicates that this code path should only create non-netscape plugins (no clue why).
     170    updateWidget(true);
    164171}
    165172
  • trunk/WebCore/html/HTMLPlugInImageElement.h

    r66710 r66711  
    3333class HTMLPlugInImageElement : public HTMLPlugInElement {
    3434public:
    35     const String& serviceType() const { return m_serviceType; }
    36     const String& url() const { return m_url; }
     35    RenderEmbeddedObject* renderEmbeddedObject() const;
    3736
    38     RenderEmbeddedObject* renderEmbeddedObject() const;
     37    virtual void updateWidget(bool onlyCreateNonNetscapePlugins) = 0;
    3938
    4039protected:
     
    4241
    4342    bool isImageType();
     43
     44    const String& serviceType() const { return m_serviceType; }
     45    const String& url() const { return m_url; }
    4446
    4547    OwnPtr<HTMLImageLoader> m_imageLoader;
  • trunk/WebCore/page/FrameView.cpp

    r66577 r66711  
    4545#include "HTMLFrameSetElement.h"
    4646#include "HTMLNames.h"
     47#include "HTMLPlugInImageElement.h"
    4748#include "InspectorTimelineAgent.h"
    4849#include "OverflowEvent.h"
     
    15741575}
    15751576
     1577void FrameView::updateWidget(RenderEmbeddedObject* object)
     1578{
     1579    ASSERT(!object->node() || object->node()->isElementNode());
     1580    Element* ownerElement = static_cast<Element*>(object->node());
     1581    // The object may have already been destroyed (thus node cleared),
     1582    // but FrameView holds a manual ref, so it won't have been deleted.
     1583    ASSERT(m_widgetUpdateSet->contains(object));
     1584    if (!ownerElement)
     1585        return;
     1586
     1587    // No need to update if it's already crashed or known to be missing.
     1588    if (object->pluginCrashedOrWasMissing())
     1589        return;
     1590
     1591    // FIXME: This could turn into a real virtual dispatch if we defined
     1592    // updateWidget(bool) on HTMLElement.
     1593    if (ownerElement->hasTagName(objectTag) || ownerElement->hasTagName(embedTag))
     1594        static_cast<HTMLPlugInImageElement*>(ownerElement)->updateWidget(false);
     1595    // FIXME: It is not clear that Media elements need or want this updateWidget() call.
     1596#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
     1597    else if (ownerElement->hasTagName(videoTag) || ownerElement->hasTagName(audioTag))
     1598        static_cast<HTMLMediaElement*>(ownerElement)->updateWidget(false);
     1599#endif
     1600    else
     1601        ASSERT_NOT_REACHED();
     1602
     1603    // Caution: it's possible the object was destroyed again, since loading a
     1604    // plugin may run any arbitrary javascript.
     1605    object->updateWidgetPosition();
     1606}
     1607
    15761608bool FrameView::updateWidgets()
    15771609{
     
    15921624    for (size_t i = 0; i < size; ++i) {
    15931625        RenderEmbeddedObject* object = objects[i];
    1594 
    1595         // The object may have been destroyed, but our manual ref() keeps the object from being deleted.
    1596         object->updateWidget(false);
    1597         object->updateWidgetPosition();
    1598 
     1626        updateWidget(object);
    15991627        m_widgetUpdateSet->remove(object);
    16001628    }
  • trunk/WebCore/page/FrameView.h

    r66577 r66711  
    281281
    282282    bool updateWidgets();
     283    void updateWidget(RenderEmbeddedObject*);
    283284    void scrollToAnchor();
    284285    void scrollPositionChanged();
  • trunk/WebCore/rendering/RenderEmbeddedObject.cpp

    r66710 r66711  
    103103#endif
    104104
    105 // FIXME: This should be moved into FrameView (the only caller)
    106 void RenderEmbeddedObject::updateWidget(bool onlyCreateNonNetscapePlugins)
    107 {
    108     if (!m_replacementText.isNull() || !node()) // Check the node in case destroy() has been called.
    109         return;
    110 
    111     // The calls to SubframeLoader::requestObject within this function can result in a plug-in being initialized.
    112     // This can run cause arbitrary JavaScript to run and may result in this RenderObject being detached from
    113     // the render tree and destroyed, causing a crash like <rdar://problem/6954546>.  By extending our lifetime
    114     // artifically to ensure that we remain alive for the duration of plug-in initialization.
    115     RenderWidgetProtector protector(this);
    116 
    117     if (node()->hasTagName(objectTag))
    118         static_cast<HTMLObjectElement*>(node())->updateWidget(onlyCreateNonNetscapePlugins);
    119     else if (node()->hasTagName(embedTag))
    120         static_cast<HTMLEmbedElement*>(node())->updateWidget(onlyCreateNonNetscapePlugins);
    121 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)       
    122     else if (node()->hasTagName(videoTag) || node()->hasTagName(audioTag))
    123         static_cast<HTMLMediaElement*>(node())->updateWidget(onlyCreateNonNetscapePlugins);
    124 #endif
    125     else
    126         ASSERT_NOT_REACHED();
    127 }
    128 
    129105void RenderEmbeddedObject::setShowsMissingPluginIndicator()
    130106{
     
    140116}
    141117
     118bool RenderEmbeddedObject::pluginCrashedOrWasMissing() const
     119{
     120    return !m_replacementText.isNull();
     121}
     122   
    142123void RenderEmbeddedObject::setMissingPluginIndicatorIsPressed(bool pressed)
    143124{
     
    151132void RenderEmbeddedObject::paint(PaintInfo& paintInfo, int tx, int ty)
    152133{
    153     if (!m_replacementText.isNull()) {
     134    if (pluginCrashedOrWasMissing()) {
    154135        RenderReplaced::paint(paintInfo, tx, ty);
    155136        return;
     
    161142void RenderEmbeddedObject::paintReplaced(PaintInfo& paintInfo, int tx, int ty)
    162143{
    163     if (!m_replacementText)
     144    if (pluginCrashedOrWasMissing())
    164145        return;
    165146
  • trunk/WebCore/rendering/RenderEmbeddedObject.h

    r66631 r66711  
    3737    virtual ~RenderEmbeddedObject();
    3838
    39     void updateWidget(bool onlyCreateNonNetscapePlugins);
     39    bool pluginCrashedOrWasMissing() const;
     40   
    4041    void setShowsMissingPluginIndicator();
    4142    void setShowsCrashedPluginIndicator();
Note: See TracChangeset for help on using the changeset viewer.