[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