Changeset 155524 in webkit
- Timestamp:
- Sep 11, 2013 7:16:31 AM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r155521 r155524 1 2013-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 1 37 2013-09-11 Patrick Gansterer <paroga@webkit.org> 2 38 -
trunk/Source/WebCore/html/HTMLPlugInImageElement.h
r154254 r155524 167 167 }; 168 168 169 inline 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 169 177 inline HTMLPlugInImageElement* toHTMLPlugInImageElement(Node* node) 170 178 { -
trunk/Source/WebCore/html/HTMLTagNames.in
r155507 r155524 8 8 acronym interfaceName=HTMLElement 9 9 address interfaceName=HTMLElement 10 applet constructorNeedsCreatedByParser 10 applet constructorNeedsCreatedByParser, generateTypeHelpers 11 11 area generateTypeHelpers 12 12 article interfaceName=HTMLElement … … 44 44 dt interfaceName=HTMLElement 45 45 em interfaceName=HTMLElement 46 embed constructorNeedsCreatedByParser 46 embed constructorNeedsCreatedByParser, generateTypeHelpers 47 47 fieldset interfaceName=HTMLFieldSetElement, constructorNeedsFormElement, generateTypeHelpers 48 48 figcaption interfaceName=HTMLElement -
trunk/Source/WebCore/page/FrameView.cpp
r155496 r155524 128 128 #endif 129 129 130 // The maximum number of update Widgets iterations that should be done before returning.131 static const unsigned maxUpdate WidgetsIterations = 2;130 // The maximum number of updateEmbeddedObjects iterations that should be done before returning. 131 static const unsigned maxUpdateEmbeddedObjectsIterations = 2; 132 132 133 133 static RenderLayer::UpdateLayerPositionsFlags updateLayerPositionFlags(RenderLayer* layer, bool isRelayoutingSubtree, bool didFullRepaint) … … 1396 1396 } 1397 1397 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); 1398 void 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 1415 void FrameView::removeEmbeddedObjectToUpdate(RenderEmbeddedObject& embeddedObject) 1416 { 1417 if (!m_embeddedObjectsToUpdate) 1418 return; 1419 1420 m_embeddedObjectsToUpdate->remove(&embeddedObject); 1420 1421 } 1421 1422 … … 2645 2646 } 2646 2647 2647 void FrameView::update Widget(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 nodecleared),2648 void FrameView::updateEmbeddedObject(RenderEmbeddedObject& embeddedObject) 2649 { 2650 ASSERT(m_embeddedObjectsToUpdate->contains(&embeddedObject)); 2651 2652 // The object may have already been destroyed (thus element cleared), 2652 2653 // 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(); 2661 2677 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. 2683 2684 #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 2696 bool FrameView::updateEmbeddedObjects() 2697 { 2698 if (m_nestedLayoutCount > 1 || !m_embeddedObjectsToUpdate || m_embeddedObjectsToUpdate->isEmpty()) 2699 2699 return true; 2700 2701 size_t size = m_widgetUpdateSet->size(); 2702 2703 Vector<RenderObject*> objects; 2704 objects.reserveInitialCapacity(size); 2700 2705 2701 // Protect RendereArena from getting wiped out, when Document is detached during updateWidget(). 2706 2702 RefPtr<RenderArena> protectedArena = frame().document()->renderArena(); 2707 2703 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(); 2733 2722 } 2734 2723 … … 2791 2780 // is called through the post layout timer. 2792 2781 Ref<FrameView> protect(*this); 2793 for (unsigned i = 0; i < maxUpdate WidgetsIterations; i++) {2794 if (update Widgets())2782 for (unsigned i = 0; i < maxUpdateEmbeddedObjectsIterations; i++) { 2783 if (updateEmbeddedObjects()) 2795 2784 break; 2796 2785 } -
trunk/Source/WebCore/page/FrameView.h
r155315 r155524 55 55 class RenderStyle; 56 56 class RenderView; 57 class RenderWidget; 57 58 58 59 Pagination::Mode paginationModeForRenderStyle(RenderStyle*); … … 268 269 void setSafeToPropagateScrollToParent(bool isSafe) { m_safeToPropagateScrollToParent = isSafe; } 269 270 270 void add WidgetToUpdate(RenderObject*);271 void remove WidgetToUpdate(RenderObject*);271 void addEmbeddedObjectToUpdate(RenderEmbeddedObject&); 272 void removeEmbeddedObjectToUpdate(RenderEmbeddedObject&); 272 273 273 274 virtual void paintContents(GraphicsContext*, const IntRect& damageRect) OVERRIDE; … … 523 524 double adjustedDeferredRepaintDelay() const; 524 525 525 bool update Widgets();526 void update Widget(RenderObject*);526 bool updateEmbeddedObjects(); 527 void updateEmbeddedObject(RenderEmbeddedObject&); 527 528 void scrollToAnchor(); 528 529 void scrollPositionChanged(); … … 548 549 LayoutSize m_size; 549 550 LayoutSize m_margins; 550 551 552 OwnPtr<HashSet<RenderEmbeddedObject*>> m_embeddedObjectsToUpdate; 553 const RefPtr<Frame> m_frame; 554 551 555 typedef HashSet<RenderObject*> RenderObjectSet; 552 OwnPtr<RenderObjectSet> m_widgetUpdateSet;553 const RefPtr<Frame> m_frame;554 555 556 OwnPtr<RenderObjectSet> m_slowRepaintObjects; 556 557 -
trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp
r155374 r155524 116 116 { 117 117 if (frameView()) 118 frameView()->remove WidgetToUpdate(this);118 frameView()->removeEmbeddedObjectToUpdate(*this); 119 119 } 120 120 … … 467 467 if (!widget() && frameView() && canHaveWidget()) { 468 468 wasMissingWidget = true; 469 frameView()->add WidgetToUpdate(this);469 frameView()->addEmbeddedObjectToUpdate(*this); 470 470 } 471 471 … … 480 480 if (plugInImageElement->displayState() > HTMLPlugInElement::DisplayingSnapshot && plugInImageElement->snapshotDecision() == HTMLPlugInImageElement::MaySnapshotWhenResized) { 481 481 plugInImageElement->setNeedsCheckForSizeChange(); 482 view().frameView().add WidgetToUpdate(this);482 view().frameView().addEmbeddedObjectToUpdate(*this); 483 483 } 484 484 } -
trunk/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp
r155374 r155524 77 77 return; 78 78 79 view().frameView().add WidgetToUpdate(this);79 view().frameView().addEmbeddedObjectToUpdate(*this); 80 80 } 81 81
Note: See TracChangeset
for help on using the changeset viewer.