Changeset 66711 in webkit
- Timestamp:
- Sep 2, 2010 9:49:14 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r66710 r66711 1 2010-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 1 39 2010-09-02 Eric Seidel <eric@webkit.org> 2 40 -
trunk/WebCore/html/HTMLEmbedElement.cpp
r66710 r66711 138 138 void HTMLEmbedElement::updateWidget(bool onlyCreateNonNetscapePlugins) 139 139 { 140 ASSERT(!renderEmbeddedObject()->pluginCrashedOrWasMissing()); 140 141 // FIXME: We should ASSERT(needsWidgetUpdate()), but currently 141 142 // FrameView::updateWidget() calls updateWidget(false) without checking if -
trunk/WebCore/html/HTMLEmbedElement.h
r66710 r66711 32 32 static PassRefPtr<HTMLEmbedElement> create(const QualifiedName&, Document*, bool createdByParser); 33 33 34 void updateWidget(bool onlyCreateNonNetscapePlugins);35 36 34 private: 37 35 HTMLEmbedElement(const QualifiedName&, Document*, bool createdByParser); … … 44 42 virtual void removedFromDocument(); 45 43 virtual void attributeChanged(Attribute*, bool preserveDecls = false); 46 44 47 45 virtual bool isURLAttribute(Attribute*) const; 48 46 virtual const QualifiedName& imageSourceAttributeName() const; 49 47 50 48 virtual RenderWidget* renderWidgetForJSBindings() const; 49 50 virtual void updateWidget(bool onlyCreateNonNetscapePlugins); 51 51 52 52 virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const; -
trunk/WebCore/html/HTMLObjectElement.cpp
r66710 r66711 241 241 void HTMLObjectElement::updateWidget(bool onlyCreateNonNetscapePlugins) 242 242 { 243 ASSERT(!renderEmbeddedObject()->pluginCrashedOrWasMissing()); 243 244 // FIXME: We should ASSERT(needsWidgetUpdate()), but currently 244 245 // FrameView::updateWidget() calls updateWidget(false) without checking if -
trunk/WebCore/html/HTMLObjectElement.h
r66710 r66711 38 38 bool containsJavaApplet() const; 39 39 40 void updateWidget(bool onlyCreateNonNetscapePlugins);41 42 40 virtual bool useFallbackContent() const { return m_useFallbackContent; } 43 41 void renderFallbackContent(); … … 61 59 virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const; 62 60 61 virtual void updateWidget(bool onlyCreateNonNetscapePlugins); 63 62 void updateDocNamedItem(); 64 63 -
trunk/WebCore/html/HTMLPlugInImageElement.cpp
r66709 r66711 160 160 { 161 161 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); 164 171 } 165 172 -
trunk/WebCore/html/HTMLPlugInImageElement.h
r66710 r66711 33 33 class HTMLPlugInImageElement : public HTMLPlugInElement { 34 34 public: 35 const String& serviceType() const { return m_serviceType; } 36 const String& url() const { return m_url; } 35 RenderEmbeddedObject* renderEmbeddedObject() const; 37 36 38 RenderEmbeddedObject* renderEmbeddedObject() const;37 virtual void updateWidget(bool onlyCreateNonNetscapePlugins) = 0; 39 38 40 39 protected: … … 42 41 43 42 bool isImageType(); 43 44 const String& serviceType() const { return m_serviceType; } 45 const String& url() const { return m_url; } 44 46 45 47 OwnPtr<HTMLImageLoader> m_imageLoader; -
trunk/WebCore/page/FrameView.cpp
r66577 r66711 45 45 #include "HTMLFrameSetElement.h" 46 46 #include "HTMLNames.h" 47 #include "HTMLPlugInImageElement.h" 47 48 #include "InspectorTimelineAgent.h" 48 49 #include "OverflowEvent.h" … … 1574 1575 } 1575 1576 1577 void 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 1576 1608 bool FrameView::updateWidgets() 1577 1609 { … … 1592 1624 for (size_t i = 0; i < size; ++i) { 1593 1625 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); 1599 1627 m_widgetUpdateSet->remove(object); 1600 1628 } -
trunk/WebCore/page/FrameView.h
r66577 r66711 281 281 282 282 bool updateWidgets(); 283 void updateWidget(RenderEmbeddedObject*); 283 284 void scrollToAnchor(); 284 285 void scrollPositionChanged(); -
trunk/WebCore/rendering/RenderEmbeddedObject.cpp
r66710 r66711 103 103 #endif 104 104 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 from113 // the render tree and destroyed, causing a crash like <rdar://problem/6954546>. By extending our lifetime114 // 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 #endif125 else126 ASSERT_NOT_REACHED();127 }128 129 105 void RenderEmbeddedObject::setShowsMissingPluginIndicator() 130 106 { … … 140 116 } 141 117 118 bool RenderEmbeddedObject::pluginCrashedOrWasMissing() const 119 { 120 return !m_replacementText.isNull(); 121 } 122 142 123 void RenderEmbeddedObject::setMissingPluginIndicatorIsPressed(bool pressed) 143 124 { … … 151 132 void RenderEmbeddedObject::paint(PaintInfo& paintInfo, int tx, int ty) 152 133 { 153 if ( !m_replacementText.isNull()) {134 if (pluginCrashedOrWasMissing()) { 154 135 RenderReplaced::paint(paintInfo, tx, ty); 155 136 return; … … 161 142 void RenderEmbeddedObject::paintReplaced(PaintInfo& paintInfo, int tx, int ty) 162 143 { 163 if ( !m_replacementText)144 if (pluginCrashedOrWasMissing()) 164 145 return; 165 146 -
trunk/WebCore/rendering/RenderEmbeddedObject.h
r66631 r66711 37 37 virtual ~RenderEmbeddedObject(); 38 38 39 void updateWidget(bool onlyCreateNonNetscapePlugins); 39 bool pluginCrashedOrWasMissing() const; 40 40 41 void setShowsMissingPluginIndicator(); 41 42 void setShowsCrashedPluginIndicator();
Note: See TracChangeset
for help on using the changeset viewer.