2010-03-01 Thatcher Ulrich <tulrich@google.com>
authoreric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 1 Mar 2010 22:51:25 +0000 (22:51 +0000)
committereric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 1 Mar 2010 22:51:25 +0000 (22:51 +0000)
        Reviewed by Darin Fisher.

        Fix chromium iframe shims.  Add another test case to the
        iframes-shims test.  After r53637, the plugin widget doesn't get
        moved every paint.  This used to hide the bug that if an iframe
        gets added, the plugin's cutout rectangles don't get updated until
        a layout happens.
        https://bugs.webkit.org/show_bug.cgi?id=35184

        * plugins/iframe-shims.html: test case that adds an iframe shim dynamically
2010-03-01  Thatcher Ulrich  <tulrich@google.com>

        Reviewed by Darin Fisher.

        Fix chromium iframe shims.  Add another test case to the
        iframes-shims test.  After r53637, the plugin widget doesn't get
        moved every paint.  This used to hide the bug that if an iframe
        gets added, the plugin's cutout rectangles don't get updated until
        a layout happens.
        https://bugs.webkit.org/show_bug.cgi?id=35184

        * platform/Widget.h:
        (WebCore::Widget::widgetPositionsUpdated): new virtual method
            widgetPositionsUpdated() to notify widgets when other widgets on
            the page have been repositioned.
        * rendering/RenderView.cpp:
        (WebCore::RenderView::updateWidgetPositions): call widgetPositionsUpdated() on the widgets
        * rendering/RenderWidget.cpp:
        (WebCore::RenderWidget::widgetPositionsUpdated): call widgetPositionsUpdated() on the widget
        * rendering/RenderWidget.h:
2010-03-01  Thatcher Ulrich  <tulrich@google.com>

        Reviewed by Darin Fisher.

        Fix chromium iframe shims.  Add another test case to the
        iframes-shims test.  After r53637, the plugin widget doesn't get
        moved every paint.  This used to hide the bug that if an iframe
        gets added, the plugin's cutout rectangles don't get updated until
        a layout happens.
        https://bugs.webkit.org/show_bug.cgi?id=35184

        * src/WebPluginContainerImpl.cpp:
        (WebKit::WebPluginContainerImpl::widgetPositionsUpdated): do reportGeometry() to ensure that
            the plugin is aware of the positions of cutouts on the page (for iframe shim behavior).
        * src/WebPluginContainerImpl.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@55381 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/plugins/iframe-shims-expected.txt
LayoutTests/plugins/iframe-shims.html
WebCore/ChangeLog
WebCore/platform/Widget.h
WebCore/rendering/RenderView.cpp
WebCore/rendering/RenderWidget.cpp
WebCore/rendering/RenderWidget.h
WebKit/chromium/ChangeLog
WebKit/chromium/src/WebPluginContainerImpl.cpp
WebKit/chromium/src/WebPluginContainerImpl.h

index 36f68d9..95f5989 100644 (file)
@@ -1,3 +1,16 @@
+2010-03-01  Thatcher Ulrich  <tulrich@google.com>
+
+        Reviewed by Darin Fisher.
+
+        Fix chromium iframe shims.  Add another test case to the
+        iframes-shims test.  After r53637, the plugin widget doesn't get
+        moved every paint.  This used to hide the bug that if an iframe
+        gets added, the plugin's cutout rectangles don't get updated until
+        a layout happens.
+        https://bugs.webkit.org/show_bug.cgi?id=35184
+
+        * plugins/iframe-shims.html: test case that adds an iframe shim dynamically
+
 2010-03-01  Gavin Barraclough  <barraclough@apple.com>
 
         Reviewed by Oliver Hunt.
index e4be006..f76fd78 100644 (file)
             ');" value="clickme" style="position: absolute; top: 10; left: 10; width: 60px; height: 60px;"/>';
         return o;
     }
+    
+    function appendOverlay(overlayDivZIframe, overlayDivZOverlay, overlayInsideDiv, expectClickable, caseId)
+    {
+        var id = makeIframeDiv();
+        var root = document.getElementById(caseId);
+        if (overlayDivZIframe)
+            id.style.zIndex = overlayDivZIframe;
+
+        var od = makeOverlayDiv(expectClickable ? 'green' : 'red', caseId);
+        od.style.position = 'absolute';
+        if (overlayDivZOverlay)
+            od.style.zIndex = overlayDivZOverlay;
+
+        if (overlayInsideDiv) {
+            var parentdiv = document.createElement('div');
+            if (overlayDivZOverlay)
+                parentdiv.style.zIndex = overlayDivZOverlay;
+
+            parentdiv.style.position = 'absolute';
+            parentdiv.style.top = '0px';
+            parentdiv.style.left = '0px';
+            parentdiv.appendChild(id);
+            parentdiv.appendChild(od);
+            root.appendChild(parentdiv);
+        } else {
+            root.appendChild(id);
+            root.appendChild(od);
+        }
+    };
 
     function addCase(x, y, tags)
     {
@@ -62,6 +91,7 @@
         root.style.position = 'absolute';
         root.style.left = x * (width + 40) + 'px';
         root.style.top = y * (height + 20) + 'px';
+        root.id = caseId;
         container.appendChild(root);
 
         var pluginDivZ;
             }
         };
 
-        var appendOverlay = function()
-        {
-            var id = makeIframeDiv();
-            if (overlayDivZIframe)
-                id.style.zIndex = overlayDivZIframe;
-
-            var od = makeOverlayDiv(expectClickable ? 'green' : 'red', caseId);
-            od.style.position = 'absolute';
-            if (overlayDivZOverlay)
-                od.style.zIndex = overlayDivZOverlay;
-
-            if (tags.overlayInsideDiv) {
-                var parentdiv = document.createElement('div');
-                if (overlayDivZOverlay)
-                    parentdiv.style.zIndex = overlayDivZOverlay;
-
-                parentdiv.style.position = 'absolute';
-                parentdiv.style.top = '0px';
-                parentdiv.style.left = '0px';
-                parentdiv.appendChild(id);
-                parentdiv.appendChild(od);
-                root.appendChild(parentdiv);
-            } else {
-                root.appendChild(id);
-                root.appendChild(od);
-            }
-        };
-
         if (tags.overlayEarlier) {
-            appendOverlay();
+            appendOverlay(overlayDivZIframe, overlayDivZOverlay, tags.overlayInsideDiv, expectClickable, caseId);
             appendPlugin();
         } else {
             appendPlugin();
-            appendOverlay();
+            if (tags.overlayOnTimeout) {
+                setTimeout('appendOverlay('+overlayDivZIframe+', '+overlayDivZOverlay +', ' + tags.overlayInsideDiv + ', ' + expectClickable + ', ' + caseId + ')', 0);
+            } else {
+                appendOverlay(overlayDivZIframe, overlayDivZOverlay, tags.overlayInsideDiv, expectClickable, caseId);
+            }
         }
      }
 
         addCase(0, 3, {'pluginNorelative':1, expect:'overlay OVER'});
         addCase(1, 3, {'overlayEarlier':1, 'pluginNorelative':1, 'pluginInsideDiv':1, expect:'overlay OVER'});
         addCase(2, 3, {'pluginNorelative':1, 'pluginInsideDiv':1, expect:'overlay OVER'});
+        addCase(3, 3, {'pluginLowerz':1, 'overlayOnTimeout':1, expect:'overlay OVER'});
 
         runTest();
     }
index 813f40d..22cee78 100644 (file)
@@ -1,3 +1,24 @@
+2010-03-01  Thatcher Ulrich  <tulrich@google.com>
+
+        Reviewed by Darin Fisher.
+
+        Fix chromium iframe shims.  Add another test case to the
+        iframes-shims test.  After r53637, the plugin widget doesn't get
+        moved every paint.  This used to hide the bug that if an iframe
+        gets added, the plugin's cutout rectangles don't get updated until
+        a layout happens.
+        https://bugs.webkit.org/show_bug.cgi?id=35184
+
+        * platform/Widget.h:
+        (WebCore::Widget::widgetPositionsUpdated): new virtual method
+            widgetPositionsUpdated() to notify widgets when other widgets on
+            the page have been repositioned.
+        * rendering/RenderView.cpp:
+        (WebCore::RenderView::updateWidgetPositions): call widgetPositionsUpdated() on the widgets
+        * rendering/RenderWidget.cpp:
+        (WebCore::RenderWidget::widgetPositionsUpdated): call widgetPositionsUpdated() on the widget
+        * rendering/RenderWidget.h:
+
 2010-03-01  Fridrich Strba  <fridrich.strba@bluewin.ch>
 
         Reviewed by Holger Freyther.
index a713afa..db91bbf 100644 (file)
@@ -186,6 +186,9 @@ public:
 
     virtual void frameRectsChanged() {}
 
+    // Notifies this widget that other widgets on the page have been repositioned.
+    virtual void widgetPositionsUpdated() {}
+
 #if PLATFORM(MAC)
     NSView* getOuterView() const;
     
index 69a1173..4f76e80 100644 (file)
@@ -541,6 +541,8 @@ void RenderView::updateWidgetPositions()
     RenderWidgetSet::iterator end = m_widgets.end();
     for (RenderWidgetSet::iterator it = m_widgets.begin(); it != end; ++it)
         (*it)->updateWidgetPosition();
+    for (RenderWidgetSet::iterator it = m_widgets.begin(); it != end; ++it)
+        (*it)->widgetPositionsUpdated();
 }
 
 void RenderView::addWidget(RenderWidget* o)
index 4763309..96a2731 100644 (file)
@@ -325,6 +325,13 @@ void RenderWidget::updateWidgetPosition()
     }
 }
 
+void RenderWidget::widgetPositionsUpdated()
+{
+    if (!m_widget)
+        return;
+    m_widget->widgetPositionsUpdated();
+}
+
 void RenderWidget::setSelectionState(SelectionState state)
 {
     if (selectionState() != state) {
index 6cad04a..4076cc3 100644 (file)
@@ -39,6 +39,7 @@ public:
     static RenderWidget* find(const Widget*);
 
     void updateWidgetPosition();
+    void widgetPositionsUpdated();
 
     void showSubstituteImage(PassRefPtr<Image>);
 
index 398a8c6..b4cfaa9 100644 (file)
@@ -1,3 +1,19 @@
+2010-03-01  Thatcher Ulrich  <tulrich@google.com>
+
+        Reviewed by Darin Fisher.
+
+        Fix chromium iframe shims.  Add another test case to the
+        iframes-shims test.  After r53637, the plugin widget doesn't get
+        moved every paint.  This used to hide the bug that if an iframe
+        gets added, the plugin's cutout rectangles don't get updated until
+        a layout happens.
+        https://bugs.webkit.org/show_bug.cgi?id=35184
+
+        * src/WebPluginContainerImpl.cpp:
+        (WebKit::WebPluginContainerImpl::widgetPositionsUpdated): do reportGeometry() to ensure that
+            the plugin is aware of the positions of cutouts on the page (for iframe shim behavior).
+        * src/WebPluginContainerImpl.h:
+
 2010-02-27  Pavel Feldman  <pfeldman@chromium.org>
 
         Reviewed by Timothy Hatcher.
index 86cac26..c44434c 100644 (file)
@@ -170,6 +170,12 @@ void WebPluginContainerImpl::frameRectsChanged()
     reportGeometry();
 }
 
+void WebPluginContainerImpl::widgetPositionsUpdated()
+{
+    Widget::widgetPositionsUpdated();
+    reportGeometry();
+}
+
 void WebPluginContainerImpl::setParentVisible(bool parentVisible)
 {
     // We override this function to make sure that geometry updates are sent
index 00450bb..8e1b75a 100644 (file)
@@ -73,6 +73,7 @@ public:
     virtual void frameRectsChanged();
     virtual void setParentVisible(bool);
     virtual void setParent(WebCore::ScrollView*);
+    virtual void widgetPositionsUpdated();
 
     // WebPluginContainer methods
     virtual void invalidate();