Changeset 85961 in webkit


Ignore:
Timestamp:
May 6, 2011 11:41:32 AM (13 years ago)
Author:
Adam Roben
Message:

Show/hide windowed plugins according to the plugin element's visibility CSS property

Fixes <http://webkit.org/b/60285> <rdar://problem/9152400> REGRESSION (WebKit2): A white
rectangle covers up important UI elements when composing a new message at mail.yahoo.com
with BrowserPlus! plug-in installed

Reviewed by Anders Carlsson.

Source/WebKit2:

  • PluginProcess/PluginControllerProxy.cpp:

(WebKit::PluginControllerProxy::isPluginVisible):

  • PluginProcess/PluginControllerProxy.h:

Stubbed out.

  • Shared/win/WindowGeometry.cpp:

(WebKit::WindowGeometry::WindowGeometry):
(WebKit::WindowGeometry::encode):
(WebKit::WindowGeometry::decode):

  • Shared/win/WindowGeometry.h:

Added visible member.

  • UIProcess/win/WebView.cpp:

(WebKit::WebView::updateChildWindowGeometries): Show or hide the window as specified in the
geometry.

  • WebProcess/Plugins/Netscape/NetscapePlugin.cpp:

(WebKit::NetscapePlugin::visibilityDidChange):

  • WebProcess/Plugins/Netscape/NetscapePlugin.h:

Added. Calls through to platform-specific code.

  • WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm:

(WebKit::NetscapePlugin::platformVisibilityDidChange):

  • WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:

(WebKit::NetscapePlugin::platformVisibilityDidChange):
Stubbed out.

  • WebProcess/Plugins/Netscape/win/NetscapePluginWin.cpp:

(WebKit::NetscapePlugin::platformGeometryDidChange): Moved most logic from here to
scheduleWindowedGeometryUpdate.
(WebKit::NetscapePlugin::platformVisibilityDidChange): Added. Calls through to
scheduleWindowedGeometryUpdate.
(WebKit::NetscapePlugin::scheduleWindowedGeometryUpdate): Added. Code came from
platformGeometryDidChange. Now also records whether the plugin element is visible.

  • WebProcess/Plugins/Plugin.h: Added visibilityDidChange.
  • WebProcess/Plugins/PluginController.h: Added isPluginVisible.
  • WebProcess/Plugins/PluginProxy.cpp:

(WebKit::PluginProxy::visibilityDidChange):

  • WebProcess/Plugins/PluginProxy.h:

Stubbed out.

  • WebProcess/Plugins/PluginView.cpp:

(WebKit::PluginView::show):
(WebKit::PluginView::hide):
Added. These Widget overrides were based on WebCore's PluginView class.

(WebKit::PluginView::viewVisibilityDidChange): Added. Similar to viewGeometryDidChange.
Calls down to the plugin if it's been initialized.
(WebKit::PluginView::isPluginVisible): Added. Just calls up to the Widget base class.

  • WebProcess/Plugins/PluginView.h: Updated for PluginController changes.

LayoutTests:

Add a test that shows that windowed plugins with visibility:hidden do not appear on screen

I could only figure out how to make this a pixel test. Note that the pixel test doesn't pass
in WebKit2 due to <http://webkit.org/b/58050>, but I verified it works correctly in
MiniBrowser.

  • platform/win/plugins/visibility-hidden-expected.png: Added.
  • platform/win/plugins/visibility-hidden-expected.txt: Added.
  • platform/win/plugins/visibility-hidden.html: Added.
Location:
trunk
Files:
3 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r85959 r85961  
     12011-05-06  Adam Roben  <aroben@apple.com>
     2
     3        Add a test that shows that windowed plugins with visibility:hidden do not appear on screen
     4
     5        I could only figure out how to make this a pixel test. Note that the pixel test doesn't pass
     6        in WebKit2 due to <http://webkit.org/b/58050>, but I verified it works correctly in
     7        MiniBrowser.
     8
     9        Test for <http://webkit.org/b/60285> REGRESSION (WebKit2): A white rectangle covers up
     10        important UI elements when composing a new message at mail.yahoo.com with BrowserPlus!
     11        plug-in installed
     12
     13        Reviewed by Anders Carlsson.
     14
     15        * platform/win/plugins/visibility-hidden-expected.png: Added.
     16        * platform/win/plugins/visibility-hidden-expected.txt: Added.
     17        * platform/win/plugins/visibility-hidden.html: Added.
     18
    1192011-05-04  Adrienne Walker  <enne@google.com>
    220
  • trunk/Source/WebKit2/ChangeLog

    r85958 r85961  
     12011-05-06  Adam Roben  <aroben@apple.com>
     2
     3        Show/hide windowed plugins according to the plugin element's visibility CSS property
     4
     5        Fixes <http://webkit.org/b/60285> <rdar://problem/9152400> REGRESSION (WebKit2): A white
     6        rectangle covers up important UI elements when composing a new message at mail.yahoo.com
     7        with BrowserPlus! plug-in installed
     8
     9        Reviewed by Anders Carlsson.
     10
     11        * PluginProcess/PluginControllerProxy.cpp:
     12        (WebKit::PluginControllerProxy::isPluginVisible):
     13        * PluginProcess/PluginControllerProxy.h:
     14        Stubbed out.
     15
     16        * Shared/win/WindowGeometry.cpp:
     17        (WebKit::WindowGeometry::WindowGeometry):
     18        (WebKit::WindowGeometry::encode):
     19        (WebKit::WindowGeometry::decode):
     20        * Shared/win/WindowGeometry.h:
     21        Added visible member.
     22
     23        * UIProcess/win/WebView.cpp:
     24        (WebKit::WebView::updateChildWindowGeometries): Show or hide the window as specified in the
     25        geometry.
     26
     27        * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
     28        (WebKit::NetscapePlugin::visibilityDidChange):
     29        * WebProcess/Plugins/Netscape/NetscapePlugin.h:
     30        Added. Calls through to platform-specific code.
     31
     32        * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm:
     33        (WebKit::NetscapePlugin::platformVisibilityDidChange):
     34        * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
     35        (WebKit::NetscapePlugin::platformVisibilityDidChange):
     36        Stubbed out.
     37
     38        * WebProcess/Plugins/Netscape/win/NetscapePluginWin.cpp:
     39        (WebKit::NetscapePlugin::platformGeometryDidChange): Moved most logic from here to
     40        scheduleWindowedGeometryUpdate.
     41        (WebKit::NetscapePlugin::platformVisibilityDidChange): Added. Calls through to
     42        scheduleWindowedGeometryUpdate.
     43        (WebKit::NetscapePlugin::scheduleWindowedGeometryUpdate): Added. Code came from
     44        platformGeometryDidChange. Now also records whether the plugin element is visible.
     45
     46        * WebProcess/Plugins/Plugin.h: Added visibilityDidChange.
     47
     48        * WebProcess/Plugins/PluginController.h: Added isPluginVisible.
     49
     50        * WebProcess/Plugins/PluginProxy.cpp:
     51        (WebKit::PluginProxy::visibilityDidChange):
     52        * WebProcess/Plugins/PluginProxy.h:
     53        Stubbed out.
     54
     55        * WebProcess/Plugins/PluginView.cpp:
     56        (WebKit::PluginView::show):
     57        (WebKit::PluginView::hide):
     58        Added. These Widget overrides were based on WebCore's PluginView class.
     59
     60        (WebKit::PluginView::viewVisibilityDidChange): Added. Similar to viewGeometryDidChange.
     61        Calls down to the plugin if it's been initialized.
     62        (WebKit::PluginView::isPluginVisible): Added. Just calls up to the Widget base class.
     63
     64        * WebProcess/Plugins/PluginView.h: Updated for PluginController changes.
     65
    1662011-05-06  Adam Roben  <aroben@apple.com>
    267
  • trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp

    r85502 r85961  
    4141#include "WebProcessConnection.h"
    4242#include <WebCore/GraphicsContext.h>
     43#include <WebCore/NotImplemented.h>
    4344#include <wtf/text/WTFString.h>
    4445
     
    181182}
    182183
     184bool PluginControllerProxy::isPluginVisible()
     185{
     186    // FIXME: Implement this.
     187    notImplemented();
     188    return false;
     189}
     190
    183191void PluginControllerProxy::invalidate(const IntRect& rect)
    184192{
  • trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.h

    r85502 r85961  
    8080
    8181    // PluginController
     82    virtual bool isPluginVisible();
    8283    virtual void invalidate(const WebCore::IntRect&);
    8384    virtual String userAgent();
  • trunk/Source/WebKit2/Shared/win/WindowGeometry.cpp

    r85958 r85961  
    3333WindowGeometry::WindowGeometry()
    3434    : window(0)
     35    , visible(false)
    3536{
    3637}
     
    3940{
    4041    encoder->encodeUInt64(reinterpret_cast<uint64_t>(window));
     42    encoder->encode(visible);
    4143    encoder->encode(frame);
    4244    encoder->encode(clipRect);
     
    5153    geometry.window = reinterpret_cast<HWND>(window);
    5254
     55    if (!decoder->decode(geometry.visible))
     56        return false;
     57
    5358    if (!decoder->decode(geometry.frame))
    5459        return false;
  • trunk/Source/WebKit2/Shared/win/WindowGeometry.h

    r85958 r85961  
    4444    HWND window;
    4545
     46    // Whether the window is visible.
     47    bool visible;
     48
    4649    // The position and size of the window in its parent's client coordinate space.
    4750    WebCore::IntRect frame;
  • trunk/Source/WebKit2/UIProcess/win/WebView.cpp

    r85958 r85961  
    15601560            continue;
    15611561
    1562         deferWindowPos = ::DeferWindowPos(deferWindowPos, geometry.window, 0, geometry.frame.x(), geometry.frame.y(), geometry.frame.width(), geometry.frame.height(), SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER);
     1562        UINT flags = SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER;
     1563        if (geometry.visible)
     1564            flags |= SWP_SHOWWINDOW;
     1565        else
     1566            flags |= SWP_HIDEWINDOW;
     1567
     1568        deferWindowPos = ::DeferWindowPos(deferWindowPos, geometry.window, 0, geometry.frame.x(), geometry.frame.y(), geometry.frame.width(), geometry.frame.height(), flags);
    15631569
    15641570        setWindowRegion(geometry.window, adoptPtr(::CreateRectRgn(geometry.clipRect.x(), geometry.clipRect.y(), geometry.clipRect.maxX(), geometry.clipRect.maxY())));
  • trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp

    r83300 r85961  
    550550}
    551551
     552void NetscapePlugin::visibilityDidChange()
     553{
     554    ASSERT(m_isStarted);
     555
     556    platformVisibilityDidChange();
     557}
     558
    552559void NetscapePlugin::frameDidFinishLoading(uint64_t requestID)
    553560{
  • trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h

    r84638 r85961  
    130130    bool platformInvalidate(const WebCore::IntRect&);
    131131    void platformGeometryDidChange();
     132    void platformVisibilityDidChange();
    132133    void platformPaint(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect, bool isSnapshot = false);
    133134
     
    149150    virtual bool isTransparent();
    150151    virtual void geometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect);
     152    virtual void visibilityDidChange();
    151153    virtual void frameDidFinishLoading(uint64_t requestID);
    152154    virtual void frameDidFail(uint64_t requestID, bool wasCancelled);
     
    188190#if PLUGIN_ARCHITECTURE(WIN)
    189191    static BOOL WINAPI hookedTrackPopupMenu(HMENU, UINT uFlags, int x, int y, int nReserved, HWND, const RECT*);
     192    void scheduleWindowedGeometryUpdate();
    190193#endif
    191194
  • trunk/Source/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm

    r84997 r85961  
    291291}
    292292
     293void NetscapePlugin::platformVisibilityDidChange()
     294{
     295    // FIXME: Implement this. <http://webkit.org/b/44368>.
     296    notImplemented();
     297}
     298
    293299static inline NPCocoaEvent initializeEvent(NPCocoaEventType type)
    294300{
  • trunk/Source/WebKit2/WebProcess/Plugins/Netscape/win/NetscapePluginWin.cpp

    r85958 r85961  
    146146        return;
    147147
     148    scheduleWindowedGeometryUpdate();
     149}
     150
     151void NetscapePlugin::platformVisibilityDidChange()
     152{
     153    if (!m_isWindowed)
     154        return;
     155
     156    scheduleWindowedGeometryUpdate();
     157}
     158
     159void NetscapePlugin::scheduleWindowedGeometryUpdate()
     160{
    148161    IntRect clipRectInPluginWindowCoordinates = m_clipRect;
    149162    clipRectInPluginWindowCoordinates.move(-m_frameRect.x(), -m_frameRect.y());
     
    155168    WindowGeometry geometry;
    156169    geometry.window = m_window;
     170    geometry.visible = m_pluginController->isPluginVisible();
    157171    geometry.frame = m_frameRect;
    158172    geometry.clipRect = clipRectInPluginWindowCoordinates;
  • trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp

    r85953 r85961  
    197197}
    198198
     199void NetscapePlugin::platformVisibilityDidChange()
     200{
     201    notImplemented();
     202}
     203
    199204void NetscapePlugin::platformPaint(GraphicsContext* context, const IntRect& dirtyRect, bool /*isSnapshot*/)
    200205{
  • trunk/Source/WebKit2/WebProcess/Plugins/Plugin.h

    r81705 r85961  
    9292    virtual void geometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect) = 0;
    9393
     94    // Tells the plug-in that it has been explicitly hidden or shown. (Note that this is not called when the plug-in becomes obscured from view on screen.)
     95    virtual void visibilityDidChange() = 0;
     96
    9497    // Tells the plug-in that a frame load request that the plug-in made by calling PluginController::loadURL has finished.
    9598    virtual void frameDidFinishLoading(uint64_t requestID) = 0;
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginController.h

    r85958 r85961  
    4646class PluginController {
    4747public:
     48    // Returns false if the plugin has explicitly been hidden. Returns true otherwise (even if the plugin is currently obscured from view on screen.)
     49    virtual bool isPluginVisible() = 0;
     50
    4851    // Tells the controller that the plug-in wants the given rect to be repainted. The rect is in the plug-in's coordinate system.
    4952    virtual void invalidate(const WebCore::IntRect&) = 0;
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp

    r85566 r85961  
    4343#include "WebProcessConnectionMessages.h"
    4444#include <WebCore/GraphicsContext.h>
     45#include <WebCore/NotImplemented.h>
    4546
    4647using namespace WebCore;
     
    213214}
    214215
     216void PluginProxy::visibilityDidChange()
     217{
     218    ASSERT(m_isStarted);
     219    notImplemented();
     220}
     221
    215222void PluginProxy::frameDidFinishLoading(uint64_t requestID)
    216223{
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h

    r81705 r85961  
    7171    virtual bool isTransparent();
    7272    virtual void geometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect);
     73    virtual void visibilityDidChange();
    7374    virtual void frameDidFinishLoading(uint64_t requestID);
    7475    virtual void frameDidFail(uint64_t requestID, bool wasCancelled);
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp

    r85958 r85961  
    606606}
    607607
     608void PluginView::show()
     609{
     610    bool wasVisible = isVisible();
     611
     612    setSelfVisible(true);
     613
     614    if (!wasVisible)
     615        viewVisibilityDidChange();
     616
     617    Widget::show();
     618}
     619
     620void PluginView::hide()
     621{
     622    bool wasVisible = isVisible();
     623
     624    setSelfVisible(false);
     625
     626    if (wasVisible)
     627        viewVisibilityDidChange();
     628
     629    Widget::hide();
     630}
     631
    608632void PluginView::viewGeometryDidChange()
    609633{
     
    615639    frameRectInWindowCoordinates.setSize(m_boundsSize);
    616640    m_plugin->geometryDidChange(frameRectInWindowCoordinates, clipRectInWindowCoordinates());
     641}
     642
     643void PluginView::viewVisibilityDidChange()
     644{
     645    if (!m_isInitialized || !m_plugin || !parent())
     646        return;
     647
     648    m_plugin->visibilityDidChange();
    617649}
    618650
     
    856888}
    857889
     890bool PluginView::isPluginVisible()
     891{
     892    return isVisible();
     893}
     894
    858895void PluginView::invalidate(const IntRect& dirtyRect)
    859896{
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h

    r85958 r85961  
    7676
    7777    void viewGeometryDidChange();
     78    void viewVisibilityDidChange();
    7879    WebCore::IntRect clipRectInWindowCoordinates() const;
    7980    void focusPluginElement();
     
    113114    virtual void handleEvent(WebCore::Event*);
    114115    virtual void notifyWidget(WebCore::WidgetNotification);
     116    virtual void show();
     117    virtual void hide();
    115118
    116119    // WebCore::MediaCanStartListener
     
    118121
    119122    // PluginController
     123    virtual bool isPluginVisible();
    120124    virtual void invalidate(const WebCore::IntRect&);
    121125    virtual String userAgent();
Note: See TracChangeset for help on using the changeset viewer.