[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

andersca at apple.com andersca at apple.com
Wed Dec 22 13:37:12 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit dc63c833f1488dea67f76f58de67da09cf50ba05
Author: andersca at apple.com <andersca at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Sep 21 18:42:47 2010 +0000

    Send window visibility and window frame change sizes to the plug-in
    https://bugs.webkit.org/show_bug.cgi?id=46202
    
    Reviewed by Adam Roben.
    
    * Shared/CoreIPCSupport/WebPageMessageKinds.h:
    * UIProcess/API/mac/WKView.mm:
    (-[WKView _updateWindowVisibility]):
    Call WebPageProxy::setWindowIsVisible.
    
    (-[WKView addWindowObserversForWindow:]):
    Add additional observers.
    
    (-[WKView removeWindowObservers]):
    Remove observers.
    
    (-[WKView _updateWindowFrame]):
    Call WebPageProxy::setWindowFrame.
    
    (-[WKView viewDidMoveToWindow]):
    Update the window visibility and the web frame.
    
    (-[WKView _windowDidMiniaturize:]):
    (-[WKView _windowDidDeminiaturize:]):
    Update the window visibility.
    
    (-[WKView _windowFrameDidChange:]):
    Update the window frame.
    
    * UIProcess/WebPageProxy.cpp:
    (WebKit::WebPageProxy::setWindowIsVisible):
    (WebKit::WebPageProxy::setWindowFrame):
    Send messages along to the web process.
    
    * WebProcess/Plugins/PluginView.cpp:
    (WebKit::PluginView::PluginView):
    Register the plug-in view.
    
    (WebKit::PluginView::~PluginView):
    Unregister the plug-in view.
    
    (WebKit::PluginView::setWindowIsVisible):
    (WebKit::PluginView::setWindowFrame):
    Add empty stubs.
    
    * WebProcess/WebPage/WebPage.cpp:
    (WebKit::WebPage::WebPage):
    Initialize m_windowIsVisible.
    
    (WebKit::WebPage::~WebPage):
    Assert that all plug-in views have been removed.
    
    (WebKit::WebPage::setWindowIsVisible):
    Notify all plug-ins about the window visibility change.
    
    (WebKit::WebPage::setWindowFrame):
    Notify all plug-ins about the window frame change.
    
    (WebKit::WebPage::didReceiveMessage):
    Handle setWindowIsVisible and setWindowFrame.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@67971 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 684cc85..f129f1e 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,5 +1,68 @@
 2010-09-21  Anders Carlsson  <andersca at apple.com>
 
+        Reviewed by Adam Roben.
+
+        Send window visibility and window frame change sizes to the plug-in
+        https://bugs.webkit.org/show_bug.cgi?id=46202
+
+        * Shared/CoreIPCSupport/WebPageMessageKinds.h:
+        * UIProcess/API/mac/WKView.mm:
+        (-[WKView _updateWindowVisibility]):
+        Call WebPageProxy::setWindowIsVisible.
+
+        (-[WKView addWindowObserversForWindow:]):
+        Add additional observers.
+
+        (-[WKView removeWindowObservers]):
+        Remove observers.
+
+        (-[WKView _updateWindowFrame]):
+        Call WebPageProxy::setWindowFrame.
+
+        (-[WKView viewDidMoveToWindow]):
+        Update the window visibility and the web frame.
+
+        (-[WKView _windowDidMiniaturize:]):
+        (-[WKView _windowDidDeminiaturize:]):
+        Update the window visibility.
+
+        (-[WKView _windowFrameDidChange:]):
+        Update the window frame.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::setWindowIsVisible):
+        (WebKit::WebPageProxy::setWindowFrame):
+        Send messages along to the web process.
+
+        * WebProcess/Plugins/PluginView.cpp:
+        (WebKit::PluginView::PluginView):
+        Register the plug-in view.
+
+        (WebKit::PluginView::~PluginView):
+        Unregister the plug-in view.
+
+        (WebKit::PluginView::setWindowIsVisible):
+        (WebKit::PluginView::setWindowFrame):
+        Add empty stubs.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::WebPage):
+        Initialize m_windowIsVisible.
+
+        (WebKit::WebPage::~WebPage):
+        Assert that all plug-in views have been removed.
+
+        (WebKit::WebPage::setWindowIsVisible):
+        Notify all plug-ins about the window visibility change.
+        
+        (WebKit::WebPage::setWindowFrame):
+        Notify all plug-ins about the window frame change.
+        
+        (WebKit::WebPage::didReceiveMessage):
+        Handle setWindowIsVisible and setWindowFrame.
+
+2010-09-21  Anders Carlsson  <andersca at apple.com>
+
         Reviewed by Mark Rowe.
 
         * Configurations/WebKit2.xcconfig:
diff --git a/WebKit2/Shared/CoreIPCSupport/WebPageMessageKinds.h b/WebKit2/Shared/CoreIPCSupport/WebPageMessageKinds.h
index 62b317c..a4a0d56 100644
--- a/WebKit2/Shared/CoreIPCSupport/WebPageMessageKinds.h
+++ b/WebKit2/Shared/CoreIPCSupport/WebPageMessageKinds.h
@@ -55,6 +55,10 @@ enum Kind {
     SetCustomUserAgent,
     SetFocused,
     SetIsInWindow,
+#if PLATFORM(MAC)
+    SetWindowIsVisible,
+    SetWindowFrame,
+#endif
     SetPageAndTextZoomFactors,
     SetPageZoomFactor,
     SetTextZoomFactor,
diff --git a/WebKit2/UIProcess/API/mac/WKView.mm b/WebKit2/UIProcess/API/mac/WKView.mm
index 0de05ec..9482169 100644
--- a/WebKit2/UIProcess/API/mac/WKView.mm
+++ b/WebKit2/UIProcess/API/mac/WKView.mm
@@ -236,25 +236,39 @@ using namespace WebCore;
     _data->_page->setActive([[self window] isKeyWindow]);
 }
 
+- (void)_updateWindowVisibility
+{
+    _data->_page->setWindowIsVisible(![[self window] isMiniaturized]);
+}
+
 - (void)addWindowObserversForWindow:(NSWindow *)window
 {
     if (window) {
         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidBecomeKey:)
-            name:NSWindowDidBecomeKeyNotification object:nil];
+                                                     name:NSWindowDidBecomeKeyNotification object:nil];
         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidResignKey:)
-            name:NSWindowDidResignKeyNotification object:nil];
+                                                     name:NSWindowDidResignKeyNotification object:nil];
+        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidMiniaturize:) 
+                                                     name:NSWindowDidMiniaturizeNotification object:nil];
+        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidDeminiaturize:)
+                                                     name:NSWindowDidDeminiaturizeNotification object:nil];
+        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowFrameDidChange:)
+                                                     name:NSWindowDidMoveNotification object:nil];
+        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowFrameDidChange:) 
+                                                     name:NSWindowDidResizeNotification object:nil];
     }
 }
 
 - (void)removeWindowObservers
 {
     NSWindow *window = [self window];
-    if (window) {
-        [[NSNotificationCenter defaultCenter] removeObserver:self
-            name:NSWindowDidBecomeKeyNotification object:nil];
-        [[NSNotificationCenter defaultCenter] removeObserver:self
-            name:NSWindowDidResignKeyNotification object:nil];
-    }
+    if (!window)
+        return;
+
+    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidBecomeKeyNotification object:nil];
+    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidResignKeyNotification object:nil];
+    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidMiniaturizeNotification object:nil];
+    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidDeminiaturizeNotification object:nil];
 }
 
 static bool isViewVisible(NSView *view)
@@ -275,6 +289,13 @@ static bool isViewVisible(NSView *view)
         area->setPageIsVisible(isViewVisible(self));
 }
 
+- (void)_updateWindowFrame
+{
+    ASSERT([self window]);
+
+    _data->_page->setWindowFrame(enclosingIntRect([[self window] frame]));
+}
+
 - (void)viewWillMoveToWindow:(NSWindow *)window
 {
     if (window != [self window]) {
@@ -295,6 +316,9 @@ static bool isViewVisible(NSView *view)
         [self _updateVisibility];
         [self _updateActiveState];
     }
+
+    [self _updateWindowVisibility];
+    [self _updateWindowFrame];
 }
 
 - (void)_windowDidBecomeKey:(NSNotification *)notification
@@ -311,6 +335,21 @@ static bool isViewVisible(NSView *view)
         [self _updateActiveState];
 }
 
+- (void)_windowDidMiniaturize:(NSNotification *)notification
+{
+    [self _updateWindowVisibility];
+}
+
+- (void)_windowDidDeminiaturize:(NSNotification *)notification
+{
+    [self _updateWindowVisibility];
+}
+
+- (void)_windowFrameDidChange:(NSNotification *)notification
+{
+    [self _updateWindowFrame];
+}
+
 - (void)drawRect:(NSRect)rect
 {    
     [[NSColor whiteColor] set];
diff --git a/WebKit2/UIProcess/WebPageProxy.cpp b/WebKit2/UIProcess/WebPageProxy.cpp
index 331285f..81882a8 100644
--- a/WebKit2/UIProcess/WebPageProxy.cpp
+++ b/WebKit2/UIProcess/WebPageProxy.cpp
@@ -373,7 +373,24 @@ void WebPageProxy::setIsInWindow(bool isInWindow)
         return;
     process()->send(WebPageMessage::SetIsInWindow, m_pageID, CoreIPC::In(isInWindow));
 }
-    
+
+#if PLATFORM(MAC)
+void WebPageProxy::setWindowIsVisible(bool windowIsVisible)
+{
+    if (!isValid())
+        return;
+    process()->send(WebPageMessage::SetWindowIsVisible, m_pageID, CoreIPC::In(windowIsVisible));
+}
+
+void WebPageProxy::setWindowFrame(const IntRect& windowFrame)
+{
+    if (!isValid())
+        return;
+    process()->send(WebPageMessage::SetWindowFrame, m_pageID, CoreIPC::In(windowFrame));
+}
+
+#endif
+
 void WebPageProxy::mouseEvent(const WebMouseEvent& event)
 {
     if (!isValid())
diff --git a/WebKit2/UIProcess/WebPageProxy.h b/WebKit2/UIProcess/WebPageProxy.h
index 44f6046..cce38c4 100644
--- a/WebKit2/UIProcess/WebPageProxy.h
+++ b/WebKit2/UIProcess/WebPageProxy.h
@@ -132,6 +132,12 @@ public:
     void setActive(bool active);
     void setIsInWindow(bool isInWindow);
 
+// These are only used on Mac currently.
+#if PLATFORM(MAC)
+    void setWindowIsVisible(bool windowIsVisible);
+    void setWindowFrame(const WebCore::IntRect&);
+#endif
+
     void selectAll();
     void copy();
     void cut();
diff --git a/WebKit2/WebProcess/Plugins/PluginView.cpp b/WebKit2/WebProcess/Plugins/PluginView.cpp
index eb2d691..fc79a1e 100644
--- a/WebKit2/WebProcess/Plugins/PluginView.cpp
+++ b/WebKit2/WebProcess/Plugins/PluginView.cpp
@@ -221,6 +221,14 @@ void PluginView::Stream::didFinishLoading(NetscapePlugInStreamLoader*)
     m_pluginView = 0;
 }
 
+static inline WebPage* webPage(Frame* frame)
+{
+    WebPage* webPage = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame()->page();
+    ASSERT(webPage);
+
+    return webPage;
+}
+
 PluginView::PluginView(WebCore::HTMLPlugInElement* pluginElement, PassRefPtr<Plugin> plugin, const Plugin::Parameters& parameters)
     : PluginViewBase(0)
     , m_pluginElement(pluginElement)
@@ -232,10 +240,17 @@ PluginView::PluginView(WebCore::HTMLPlugInElement* pluginElement, PassRefPtr<Plu
     , m_pendingURLRequestsTimer(RunLoop::main(), this, &PluginView::pendingURLRequestsTimerFired)
     , m_npRuntimeObjectMap(this)
 {
+#if PLATFORM(MAC)
+    webPage(frame())->addPluginView(this);
+#endif
 }
 
 PluginView::~PluginView()
 {
+#if PLATFORM(MAC)
+    webPage(frame())->removePluginView(this);
+#endif
+
     ASSERT(!m_isBeingDestroyed);
 
     if (m_isWaitingUntilMediaCanStart)
@@ -294,7 +309,25 @@ void PluginView::manualLoadDidFail(const ResourceError& error)
 {
     m_plugin->manualStreamDidFail(error.isCancellation());
 }
-    
+
+#if PLATFORM(MAC)    
+void PluginView::setWindowIsVisible(bool windowIsVisible)
+{
+    if (!m_plugin)
+        return;
+
+    // FIXME: Implement.
+}
+
+void PluginView::setWindowFrame(const IntRect& windowFrame)
+{
+    if (!m_plugin)
+        return;
+        
+    // FIXME: Implement.
+}
+#endif
+
 void PluginView::initializePlugin()
 {
     if (m_isInitialized)
diff --git a/WebKit2/WebProcess/Plugins/PluginView.h b/WebKit2/WebProcess/Plugins/PluginView.h
index 4c47cb9..5decc17 100644
--- a/WebKit2/WebProcess/Plugins/PluginView.h
+++ b/WebKit2/WebProcess/Plugins/PluginView.h
@@ -60,7 +60,12 @@ public:
     void manualLoadDidReceiveData(const char* bytes, int length);
     void manualLoadDidFinishLoading();
     void manualLoadDidFail(const WebCore::ResourceError&);
-    
+
+#if PLATFORM(MAC)
+    void setWindowIsVisible(bool);
+    void setWindowFrame(const WebCore::IntRect&);
+#endif
+
 private:
     PluginView(WebCore::HTMLPlugInElement*, PassRefPtr<Plugin>, const Plugin::Parameters& parameters);
     virtual ~PluginView();
diff --git a/WebKit2/WebProcess/WebPage/WebPage.cpp b/WebKit2/WebProcess/WebPage/WebPage.cpp
index 65d8705..c1efdf5 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.cpp
+++ b/WebKit2/WebProcess/WebPage/WebPage.cpp
@@ -29,6 +29,7 @@
 #include "DrawingArea.h"
 #include "InjectedBundle.h"
 #include "MessageID.h"
+#include "PluginView.h"
 #include "WebBackForwardControllerClient.h"
 #include "WebBackForwardListProxy.h"
 #include "WebChromeClient.h"
@@ -88,6 +89,9 @@ WebPage::WebPage(uint64_t pageID, const IntSize& viewSize, const WebPreferencesS
     : m_viewSize(viewSize)
     , m_drawingArea(DrawingArea::create(drawingAreaInfo.type, drawingAreaInfo.id, this))
     , m_isInRedo(false)
+#if PLATFORM(MAC)
+    , m_windowIsVisible(false)
+#endif
     , m_pageID(pageID)
 {
     ASSERT(m_pageID);
@@ -135,6 +139,10 @@ WebPage::WebPage(uint64_t pageID, const IntSize& viewSize, const WebPreferencesS
 WebPage::~WebPage()
 {
     ASSERT(!m_page);
+#if PLATFORM(MAC)
+    ASSERT(m_pluginViews.isEmpty());
+#endif
+
 #ifndef NDEBUG
     webPageCounter.decrement();
 #endif
@@ -664,6 +672,41 @@ void WebPage::didRemoveEditCommand(uint64_t commandID)
     removeWebEditCommand(commandID);
 }
 
+#if PLATFORM(MAC)
+void WebPage::addPluginView(PluginView* pluginView)
+{
+    ASSERT(!m_pluginViews.contains(pluginView));
+
+    m_pluginViews.add(pluginView);
+}
+
+void WebPage::removePluginView(PluginView* pluginView)
+{
+    ASSERT(m_pluginViews.contains(pluginView));
+
+    m_pluginViews.remove(pluginView);
+}
+
+void WebPage::setWindowIsVisible(bool windowIsVisible)
+{
+    m_windowIsVisible = windowIsVisible;
+
+    // Tell all our plug-in views that the window visibility changed.
+    for (HashSet<PluginView*>::const_iterator it = m_pluginViews.begin(), end = m_pluginViews.end(); it != end; ++it)
+        (*it)->setWindowIsVisible(windowIsVisible);
+}
+
+void WebPage::setWindowFrame(const IntRect& windowFrame)
+{
+    m_windowFrame = windowFrame;
+
+    // Tell all our plug-in views that the window frame changed.
+    for (HashSet<PluginView*>::const_iterator it = m_pluginViews.begin(), end = m_pluginViews.end(); it != end; ++it)
+        (*it)->setWindowFrame(windowFrame);
+}
+
+#endif
+
 void WebPage::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
 {
     if (messageID.is<CoreIPC::MessageClassDrawingArea>()) {
@@ -697,6 +740,23 @@ void WebPage::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::Messag
             setIsInWindow(isInWindow);
             return;
         }
+#if PLATFORM(MAC)
+        case WebPageMessage::SetWindowIsVisible: {
+            bool windowIsVisible;
+            if (!arguments->decode(windowIsVisible))
+                return;
+            setWindowIsVisible(windowIsVisible);
+            return;
+        }
+        
+        case WebPageMessage::SetWindowFrame: {
+            IntRect windowFrame;
+            if (!arguments->decode(windowFrame))
+                return;
+            setWindowFrame(windowFrame);
+            return;
+        }
+#endif
         case WebPageMessage::MouseEvent: {
             WebMouseEvent event;
             if (!arguments->decode(event))
diff --git a/WebKit2/WebProcess/WebPage/WebPage.h b/WebKit2/WebProcess/WebPage/WebPage.h
index 1a674e6..779ec86 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.h
+++ b/WebKit2/WebProcess/WebPage/WebPage.h
@@ -62,6 +62,7 @@ namespace WebCore {
 namespace WebKit {
 
 class DrawingArea;
+class PluginView;
 class WebEvent;
 class WebFrame;
 class WebKeyboardEvent;
@@ -141,6 +142,11 @@ public:
     void exitAcceleratedCompositingMode();
 #endif
 
+#if PLATFORM(MAC)
+    void addPluginView(PluginView*);
+    void removePluginView(PluginView*);
+#endif
+
     static const WebEvent* currentEvent();
 
 private:
@@ -187,6 +193,11 @@ private:
     void didReceivePolicyDecision(WebFrame*, uint64_t listenerID, WebCore::PolicyAction policyAction);
     void setCustomUserAgent(const String&);
 
+#if PLATFORM(MAC)
+    void setWindowIsVisible(bool windowIsVisible);
+    void setWindowFrame(const WebCore::IntRect&);
+#endif
+
     void unapplyEditCommand(uint64_t commandID);
     void reapplyEditCommand(uint64_t commandID);
     void didRemoveEditCommand(uint64_t commandID);
@@ -200,6 +211,18 @@ private:
     RefPtr<DrawingArea> m_drawingArea;
 
     bool m_isInRedo;
+
+#if PLATFORM(MAC)
+    // Whether the containing window is visible or not.
+    bool m_windowIsVisible;
+
+    // The frame of the containing window.
+    WebCore::IntRect m_windowFrame;
+
+    // All plug-in views on this web page.
+    HashSet<PluginView*> m_pluginViews;
+#endif
+    
     HashMap<uint64_t, RefPtr<WebEditCommand> > m_editCommandMap;
 
     InjectedBundlePageEditorClient m_editorClient;

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list