Changeset 155524 in webkit


Ignore:
Timestamp:
Sep 11, 2013 7:16:31 AM (11 years ago)
Author:
akling@apple.com
Message:

FrameView: Tighten widget handling code.
<https://webkit.org/b/121155>

Reviewed by Antti Koivisto.

Harden typing in this code to work with RenderEmbeddedObject& instead of RenderObject*.
Functions and members renamed to reflect that they only deal with embedded objects.

  • html/HTMLPlugInImageElement.h:

(WebCore::toHTMLPlugInImageElement):

Add a toHTMLPlugInImageElement that takes an Element&.

  • html/HTMLTagNames.in:

Generate type helpers for applet and embed elements.

  • page/FrameView.h:
  • page/FrameView.cpp:

(WebCore::FrameView::addEmbeddedObjectToUpdate):
(WebCore::FrameView::removeEmbeddedObjectToUpdate):
(WebCore::FrameView::updateEmbeddedObjects):
(WebCore::FrameView::updateEmbeddedObject):

Re-ordered this function in early return style. Change locals into references.

  • rendering/RenderEmbeddedObject.cpp:

(WebCore::RenderEmbeddedObject::~RenderEmbeddedObject):
(WebCore::RenderEmbeddedObject::layout):

  • rendering/RenderSnapshottedPlugIn.cpp:

(WebCore::RenderSnapshottedPlugIn::layout):

Updated for new FrameView function signatures.

Location:
trunk/Source/WebCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r155521 r155524  
     12013-09-11  Andreas Kling  <akling@apple.com>
     2
     3        FrameView: Tighten widget handling code.
     4        <https://webkit.org/b/121155>
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Harden typing in this code to work with RenderEmbeddedObject& instead of RenderObject*.
     9        Functions and members renamed to reflect that they only deal with embedded objects.
     10
     11        * html/HTMLPlugInImageElement.h:
     12        (WebCore::toHTMLPlugInImageElement):
     13
     14            Add a toHTMLPlugInImageElement that takes an Element&.
     15
     16        * html/HTMLTagNames.in:
     17
     18            Generate type helpers for applet and embed elements.
     19
     20        * page/FrameView.h:
     21        * page/FrameView.cpp:
     22        (WebCore::FrameView::addEmbeddedObjectToUpdate):
     23        (WebCore::FrameView::removeEmbeddedObjectToUpdate):
     24        (WebCore::FrameView::updateEmbeddedObjects):
     25        (WebCore::FrameView::updateEmbeddedObject):
     26
     27            Re-ordered this function in early return style. Change locals into references.
     28
     29        * rendering/RenderEmbeddedObject.cpp:
     30        (WebCore::RenderEmbeddedObject::~RenderEmbeddedObject):
     31        (WebCore::RenderEmbeddedObject::layout):
     32        * rendering/RenderSnapshottedPlugIn.cpp:
     33        (WebCore::RenderSnapshottedPlugIn::layout):
     34
     35            Updated for new FrameView function signatures.
     36
    1372013-09-11  Patrick Gansterer  <paroga@webkit.org>
    238
  • trunk/Source/WebCore/html/HTMLPlugInImageElement.h

    r154254 r155524  
    167167};
    168168
     169inline HTMLPlugInImageElement& toHTMLPlugInImageElement(Node& node)
     170{
     171    ASSERT_WITH_SECURITY_IMPLICATION(node.isPluginElement());
     172    HTMLPlugInElement& plugInElement = static_cast<HTMLPlugInElement&>(node);
     173    ASSERT_WITH_SECURITY_IMPLICATION(plugInElement.isPlugInImageElement());
     174    return static_cast<HTMLPlugInImageElement&>(plugInElement);
     175}
     176
    169177inline HTMLPlugInImageElement* toHTMLPlugInImageElement(Node* node)
    170178{
  • trunk/Source/WebCore/html/HTMLTagNames.in

    r155507 r155524  
    88acronym interfaceName=HTMLElement
    99address interfaceName=HTMLElement
    10 applet constructorNeedsCreatedByParser
     10applet constructorNeedsCreatedByParser, generateTypeHelpers
    1111area generateTypeHelpers
    1212article interfaceName=HTMLElement
     
    4444dt interfaceName=HTMLElement
    4545em interfaceName=HTMLElement
    46 embed constructorNeedsCreatedByParser
     46embed constructorNeedsCreatedByParser, generateTypeHelpers
    4747fieldset interfaceName=HTMLFieldSetElement, constructorNeedsFormElement, generateTypeHelpers
    4848figcaption interfaceName=HTMLElement
  • trunk/Source/WebCore/page/FrameView.cpp

    r155496 r155524  
    128128#endif
    129129
    130 // The maximum number of updateWidgets iterations that should be done before returning.
    131 static const unsigned maxUpdateWidgetsIterations = 2;
     130// The maximum number of updateEmbeddedObjects iterations that should be done before returning.
     131static const unsigned maxUpdateEmbeddedObjectsIterations = 2;
    132132
    133133static RenderLayer::UpdateLayerPositionsFlags updateLayerPositionFlags(RenderLayer* layer, bool isRelayoutingSubtree, bool didFullRepaint)
     
    13961396}
    13971397
    1398 void FrameView::addWidgetToUpdate(RenderObject* object)
    1399 {
    1400     if (!m_widgetUpdateSet)
    1401         m_widgetUpdateSet = adoptPtr(new RenderObjectSet);
    1402 
    1403     // Tell the DOM element that it needs a widget update.
    1404     Node* node = object->node();
    1405     if (node->hasTagName(objectTag) || node->hasTagName(embedTag)) {
    1406         HTMLPlugInImageElement* pluginElement = toHTMLPlugInImageElement(node);
    1407         if (!pluginElement->needsCheckForSizeChange())
    1408             pluginElement->setNeedsWidgetUpdate(true);
    1409     }
    1410 
    1411     m_widgetUpdateSet->add(object);
    1412 }
    1413 
    1414 void FrameView::removeWidgetToUpdate(RenderObject* object)
    1415 {
    1416     if (!m_widgetUpdateSet)
    1417         return;
    1418 
    1419     m_widgetUpdateSet->remove(object);
     1398void FrameView::addEmbeddedObjectToUpdate(RenderEmbeddedObject& embeddedObject)
     1399{
     1400    if (!m_embeddedObjectsToUpdate)
     1401        m_embeddedObjectsToUpdate = adoptPtr(new HashSet<RenderEmbeddedObject*>);
     1402
     1403    ASSERT(embeddedObject.element());
     1404    Element& element = *embeddedObject.element();
     1405    if (isHTMLObjectElement(element) || isHTMLEmbedElement(element)) {
     1406        // Tell the DOM element that it needs a widget update.
     1407        HTMLPlugInImageElement& pluginElement = toHTMLPlugInImageElement(element);
     1408        if (!pluginElement.needsCheckForSizeChange())
     1409            pluginElement.setNeedsWidgetUpdate(true);
     1410    }
     1411
     1412    m_embeddedObjectsToUpdate->add(&embeddedObject);
     1413}
     1414
     1415void FrameView::removeEmbeddedObjectToUpdate(RenderEmbeddedObject& embeddedObject)
     1416{
     1417    if (!m_embeddedObjectsToUpdate)
     1418        return;
     1419
     1420    m_embeddedObjectsToUpdate->remove(&embeddedObject);
    14201421}
    14211422
     
    26452646}
    26462647
    2647 void FrameView::updateWidget(RenderObject* object)
    2648 {
    2649     ASSERT(!object->node() || object->node()->isElementNode());
    2650     Element* ownerElement = toElement(object->node());
    2651     // The object may have already been destroyed (thus node cleared),
     2648void FrameView::updateEmbeddedObject(RenderEmbeddedObject& embeddedObject)
     2649{
     2650    ASSERT(m_embeddedObjectsToUpdate->contains(&embeddedObject));
     2651
     2652    // The object may have already been destroyed (thus element cleared),
    26522653    // but FrameView holds a manual ref, so it won't have been deleted.
    2653     ASSERT(m_widgetUpdateSet->contains(object));
    2654     if (!ownerElement)
    2655         return;
    2656 
    2657     if (object->isEmbeddedObject()) {
    2658         RenderEmbeddedObject* embeddedObject = static_cast<RenderEmbeddedObject*>(object);
    2659         // No need to update if it's already crashed or known to be missing.
    2660         if (embeddedObject->isPluginUnavailable())
     2654    if (!embeddedObject.element())
     2655        return;
     2656
     2657    // No need to update if it's already crashed or known to be missing.
     2658    if (embeddedObject.isPluginUnavailable())
     2659        return;
     2660
     2661    Element& element = *embeddedObject.element();
     2662
     2663    if (embeddedObject.isSnapshottedPlugIn()) {
     2664        if (isHTMLObjectElement(element) || isHTMLEmbedElement(element)) {
     2665            HTMLPlugInImageElement& pluginElement = toHTMLPlugInImageElement(element);
     2666            pluginElement.checkSnapshotStatus();
     2667        }
     2668        return;
     2669    }
     2670
     2671    // FIXME: This could turn into a real virtual dispatch if we defined
     2672    // updateWidget(PluginCreationOption) on HTMLElement.
     2673    if (isHTMLObjectElement(element) || isHTMLEmbedElement(element) || isHTMLAppletElement(element)) {
     2674        HTMLPlugInImageElement& pluginElement = toHTMLPlugInImageElement(element);
     2675        if (pluginElement.needsCheckForSizeChange()) {
     2676            pluginElement.checkSnapshotStatus();
    26612677            return;
    2662 
    2663         if (object->isSnapshottedPlugIn()) {
    2664             if (ownerElement->hasTagName(objectTag) || ownerElement->hasTagName(embedTag)) {
    2665                 HTMLPlugInImageElement* pluginElement = toHTMLPlugInImageElement(ownerElement);
    2666                 pluginElement->checkSnapshotStatus();
    2667             }
    2668             return;
    2669         }
    2670 
    2671         // FIXME: This could turn into a real virtual dispatch if we defined
    2672         // updateWidget(PluginCreationOption) on HTMLElement.
    2673         if (ownerElement->hasTagName(objectTag) || ownerElement->hasTagName(embedTag) || ownerElement->hasTagName(appletTag)) {
    2674             HTMLPlugInImageElement* pluginElement = toHTMLPlugInImageElement(ownerElement);
    2675             if (pluginElement->needsCheckForSizeChange()) {
    2676                 pluginElement->checkSnapshotStatus();
    2677                 return;
    2678             }
    2679             if (pluginElement->needsWidgetUpdate())
    2680                 pluginElement->updateWidget(CreateAnyWidgetType);
    2681         }
    2682         // FIXME: It is not clear that Media elements need or want this updateWidget() call.
     2678        }
     2679        if (pluginElement.needsWidgetUpdate())
     2680            pluginElement.updateWidget(CreateAnyWidgetType);
     2681    }
     2682
     2683    // FIXME: It is not clear that Media elements need or want this updateWidget() call.
    26832684#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
    2684         else if (ownerElement->isMediaElement())
    2685             toHTMLMediaElement(ownerElement)->updateWidget(CreateAnyWidgetType);
    2686 #endif
    2687         else
    2688             ASSERT_NOT_REACHED();
    2689 
    2690         // Caution: it's possible the object was destroyed again, since loading a
    2691         // plugin may run any arbitrary JavaScript.
    2692         embeddedObject->updateWidgetPosition();
    2693     }
    2694 }
    2695 
    2696 bool FrameView::updateWidgets()
    2697 {
    2698     if (m_nestedLayoutCount > 1 || !m_widgetUpdateSet || m_widgetUpdateSet->isEmpty())
     2685    else if (element.isMediaElement())
     2686        toHTMLMediaElement(element).updateWidget(CreateAnyWidgetType);
     2687#endif
     2688    else
     2689        ASSERT_NOT_REACHED();
     2690
     2691    // Caution: it's possible the object was destroyed again, since loading a
     2692    // plugin may run any arbitrary JavaScript.
     2693    embeddedObject.updateWidgetPosition();
     2694}
     2695
     2696bool FrameView::updateEmbeddedObjects()
     2697{
     2698    if (m_nestedLayoutCount > 1 || !m_embeddedObjectsToUpdate || m_embeddedObjectsToUpdate->isEmpty())
    26992699        return true;
    2700    
    2701     size_t size = m_widgetUpdateSet->size();
    2702 
    2703     Vector<RenderObject*> objects;
    2704     objects.reserveInitialCapacity(size);
     2700
    27052701    // Protect RendereArena from getting wiped out, when Document is detached during updateWidget().
    27062702    RefPtr<RenderArena> protectedArena = frame().document()->renderArena();
    27072703
    2708     RenderObjectSet::const_iterator end = m_widgetUpdateSet->end();
    2709     for (RenderObjectSet::const_iterator it = m_widgetUpdateSet->begin(); it != end; ++it) {
    2710         RenderObject* object = *it;
    2711         objects.uncheckedAppend(object);
    2712         if (object->isEmbeddedObject()) {
    2713             RenderEmbeddedObject* embeddedObject = static_cast<RenderEmbeddedObject*>(object);
    2714             embeddedObject->ref();
    2715         }
    2716     }
    2717 
    2718     for (size_t i = 0; i < size; ++i) {
    2719         RenderObject* object = objects[i];
    2720         updateWidget(object);
    2721         m_widgetUpdateSet->remove(object);
    2722     }
    2723 
    2724     for (size_t i = 0; i < size; ++i) {
    2725         RenderObject* object = objects[i];
    2726         if (object->isEmbeddedObject()) {
    2727             RenderEmbeddedObject* embeddedObject = static_cast<RenderEmbeddedObject*>(object);
    2728             embeddedObject->deref(protectedArena.get());
    2729         }
    2730     }
    2731    
    2732     return m_widgetUpdateSet->isEmpty();
     2704    Vector<RenderEmbeddedObject*> embeddedObjects;
     2705    embeddedObjects.reserveInitialCapacity(m_embeddedObjectsToUpdate->size());
     2706    for (auto it = m_embeddedObjectsToUpdate->begin(), end = m_embeddedObjectsToUpdate->end(); it != end; ++it) {
     2707        RenderEmbeddedObject& object = **it;
     2708        embeddedObjects.uncheckedAppend(&object);
     2709        object.ref();
     2710    }
     2711
     2712    for (unsigned i = 0; i < embeddedObjects.size(); ++i) {
     2713        RenderEmbeddedObject& object = *embeddedObjects[i];
     2714        updateEmbeddedObject(object);
     2715        m_embeddedObjectsToUpdate->remove(&object);
     2716    }
     2717
     2718    for (unsigned i = 0; i < embeddedObjects.size(); ++i)
     2719        embeddedObjects[i]->deref(protectedArena.get());
     2720   
     2721    return m_embeddedObjectsToUpdate->isEmpty();
    27332722}
    27342723
     
    27912780    // is called through the post layout timer.
    27922781    Ref<FrameView> protect(*this);
    2793     for (unsigned i = 0; i < maxUpdateWidgetsIterations; i++) {
    2794         if (updateWidgets())
     2782    for (unsigned i = 0; i < maxUpdateEmbeddedObjectsIterations; i++) {
     2783        if (updateEmbeddedObjects())
    27952784            break;
    27962785    }
  • trunk/Source/WebCore/page/FrameView.h

    r155315 r155524  
    5555class RenderStyle;
    5656class RenderView;
     57class RenderWidget;
    5758
    5859Pagination::Mode paginationModeForRenderStyle(RenderStyle*);
     
    268269    void setSafeToPropagateScrollToParent(bool isSafe) { m_safeToPropagateScrollToParent = isSafe; }
    269270
    270     void addWidgetToUpdate(RenderObject*);
    271     void removeWidgetToUpdate(RenderObject*);
     271    void addEmbeddedObjectToUpdate(RenderEmbeddedObject&);
     272    void removeEmbeddedObjectToUpdate(RenderEmbeddedObject&);
    272273
    273274    virtual void paintContents(GraphicsContext*, const IntRect& damageRect) OVERRIDE;
     
    523524    double adjustedDeferredRepaintDelay() const;
    524525
    525     bool updateWidgets();
    526     void updateWidget(RenderObject*);
     526    bool updateEmbeddedObjects();
     527    void updateEmbeddedObject(RenderEmbeddedObject&);
    527528    void scrollToAnchor();
    528529    void scrollPositionChanged();
     
    548549    LayoutSize m_size;
    549550    LayoutSize m_margins;
    550    
     551
     552    OwnPtr<HashSet<RenderEmbeddedObject*>> m_embeddedObjectsToUpdate;
     553    const RefPtr<Frame> m_frame;
     554
    551555    typedef HashSet<RenderObject*> RenderObjectSet;
    552     OwnPtr<RenderObjectSet> m_widgetUpdateSet;
    553     const RefPtr<Frame> m_frame;
    554 
    555556    OwnPtr<RenderObjectSet> m_slowRepaintObjects;
    556557
  • trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp

    r155374 r155524  
    116116{
    117117    if (frameView())
    118         frameView()->removeWidgetToUpdate(this);
     118        frameView()->removeEmbeddedObjectToUpdate(*this);
    119119}
    120120
     
    467467    if (!widget() && frameView() && canHaveWidget()) {
    468468        wasMissingWidget = true;
    469         frameView()->addWidgetToUpdate(this);
     469        frameView()->addEmbeddedObjectToUpdate(*this);
    470470    }
    471471
     
    480480            if (plugInImageElement->displayState() > HTMLPlugInElement::DisplayingSnapshot && plugInImageElement->snapshotDecision() == HTMLPlugInImageElement::MaySnapshotWhenResized) {
    481481                plugInImageElement->setNeedsCheckForSizeChange();
    482                 view().frameView().addWidgetToUpdate(this);
     482                view().frameView().addEmbeddedObjectToUpdate(*this);
    483483            }
    484484        }
  • trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp

    r155374 r155524  
    7777        return;
    7878
    79     view().frameView().addWidgetToUpdate(this);
     79    view().frameView().addEmbeddedObjectToUpdate(*this);
    8080}
    8181
Note: See TracChangeset for help on using the changeset viewer.