diff options
-rw-r--r-- | chrome/browser/resource_message_filter.cc | 6 | ||||
-rw-r--r-- | chrome/browser/resource_message_filter.h | 1 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 8 | ||||
-rw-r--r-- | chrome/renderer/render_widget.cc | 5 | ||||
-rw-r--r-- | chrome/renderer/render_widget.h | 1 | ||||
-rw-r--r-- | webkit/glue/chrome_client_impl.cc | 9 | ||||
-rw-r--r-- | webkit/glue/webwidget_delegate.h | 7 | ||||
-rw-r--r-- | webkit/tools/test_shell/mac/test_webview_delegate.mm | 27 | ||||
-rw-r--r-- | webkit/tools/test_shell/test_webview_delegate.h | 1 | ||||
-rw-r--r-- | webkit/tools/test_shell/test_webview_delegate_gtk.cc | 6 | ||||
-rw-r--r-- | webkit/tools/test_shell/test_webview_delegate_win.cc | 6 |
11 files changed, 74 insertions, 3 deletions
diff --git a/chrome/browser/resource_message_filter.cc b/chrome/browser/resource_message_filter.cc index f31cf41..7a91075 100644 --- a/chrome/browser/resource_message_filter.cc +++ b/chrome/browser/resource_message_filter.cc @@ -139,6 +139,7 @@ bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& message) { OnClipboardReadHTML) IPC_MESSAGE_HANDLER(ViewHostMsg_GetWindowRect, OnGetWindowRect) IPC_MESSAGE_HANDLER(ViewHostMsg_GetRootWindowRect, OnGetRootWindowRect) + IPC_MESSAGE_HANDLER(ViewHostMsg_GetRootWindowResizerRect, OnGetRootWindowResizerRect) IPC_MESSAGE_HANDLER(ViewHostMsg_GetMimeTypeFromExtension, OnGetMimeTypeFromExtension) IPC_MESSAGE_HANDLER(ViewHostMsg_GetMimeTypeFromFile, @@ -464,6 +465,11 @@ void ResourceMessageFilter::OnGetRootWindowRect(HWND window, gfx::Rect *rect) { *rect = window_rect; } +void ResourceMessageFilter::OnGetRootWindowResizerRect(HWND window, gfx::Rect *rect) { + RECT window_rect = {0}; + *rect = window_rect; +} + void ResourceMessageFilter::OnGetMimeTypeFromExtension( const std::wstring& ext, std::string* mime_type) { net::GetMimeTypeFromExtension(ext, mime_type); diff --git a/chrome/browser/resource_message_filter.h b/chrome/browser/resource_message_filter.h index 4630cdb..0fd3cce 100644 --- a/chrome/browser/resource_message_filter.h +++ b/chrome/browser/resource_message_filter.h @@ -129,6 +129,7 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, void OnClipboardReadHTML(std::wstring* markup, GURL* src_url); void OnGetWindowRect(HWND window, gfx::Rect *rect); void OnGetRootWindowRect(HWND window, gfx::Rect *rect); + void OnGetRootWindowResizerRect(HWND window, gfx::Rect *rect); void OnGetMimeTypeFromExtension(const std::wstring& ext, std::string* mime_type); void OnGetMimeTypeFromFile(const std::wstring& file_path, diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index 02e910d..0d4076c 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -1069,11 +1069,17 @@ IPC_BEGIN_MESSAGES(ViewHost, 2) IPC_MESSAGE_ROUTED1(ViewHostMsg_UnloadListenerChanged, bool /* has_listener */) - // Returns the window location of the window this widget is embeded in. + // Returns the window location of the window this widget is embeded. IPC_SYNC_MESSAGE_ROUTED1_1(ViewHostMsg_GetRootWindowRect, HWND /* window */, gfx::Rect /* Out: Window location */) + // Returns the resizer box location in the window this widget is embeded. + // Important for Mac OS X, but not Win or Linux. + IPC_SYNC_MESSAGE_ROUTED1_1(ViewHostMsg_GetRootWindowResizerRect, + HWND /* window */, + gfx::Rect /* Out: Window location */) + // Queries the browser for suggestion for autofill in a form input field. IPC_MESSAGE_ROUTED4(ViewHostMsg_QueryFormFieldAutofill, std::wstring /* field name */, diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc index 4c00b27..c94f769 100644 --- a/chrome/renderer/render_widget.cc +++ b/chrome/renderer/render_widget.cc @@ -657,6 +657,11 @@ void RenderWidget::GetRootWindowRect(WebWidget* webwidget, gfx::Rect* rect) { Send(new ViewHostMsg_GetRootWindowRect(routing_id_, host_window_, rect)); } +void RenderWidget::GetRootWindowResizerRect(WebWidget* webwidget, + gfx::Rect* rect) { + Send(new ViewHostMsg_GetRootWindowResizerRect(routing_id_, host_window_, rect)); +} + void RenderWidget::OnImeSetInputMode(bool is_active) { // To prevent this renderer process from sending unnecessary IPC messages to // a browser process, we permit the renderer process to send IPC messages diff --git a/chrome/renderer/render_widget.h b/chrome/renderer/render_widget.h index 55e4d7e..e3a750e 100644 --- a/chrome/renderer/render_widget.h +++ b/chrome/renderer/render_widget.h @@ -76,6 +76,7 @@ class RenderWidget : public IPC::Channel::Listener, virtual void GetWindowRect(WebWidget* webwidget, gfx::Rect* rect); virtual void SetWindowRect(WebWidget* webwidget, const gfx::Rect& rect); virtual void GetRootWindowRect(WebWidget* webwidget, gfx::Rect* rect); + virtual void GetRootWindowResizerRect(WebWidget* webwidget, gfx::Rect* rect); virtual void DidMove(WebWidget* webwidget, const WebPluginGeometry& move); virtual void RunModal(WebWidget* webwidget) {} virtual bool IsHidden() { return is_hidden_; } diff --git a/webkit/glue/chrome_client_impl.cc b/webkit/glue/chrome_client_impl.cc index daf9432..edb9ed7 100644 --- a/webkit/glue/chrome_client_impl.cc +++ b/webkit/glue/chrome_client_impl.cc @@ -353,8 +353,15 @@ bool ChromeClientImpl::tabsToLinks() const { } WebCore::IntRect ChromeClientImpl::windowResizerRect() const { - // TODO(mbelshe): implement me WebCore::IntRect rv; + if (webview_->delegate()) { + gfx::Rect resizer_rect; + webview_->delegate()->GetRootWindowResizerRect(webview_, &resizer_rect); + rv = WebCore::IntRect(resizer_rect.x(), + resizer_rect.y(), + resizer_rect.width(), + resizer_rect.height()); + } return rv; } diff --git a/webkit/glue/webwidget_delegate.h b/webkit/glue/webwidget_delegate.h index 45d0dcc..3302c5d 100644 --- a/webkit/glue/webwidget_delegate.h +++ b/webkit/glue/webwidget_delegate.h @@ -63,9 +63,14 @@ class WebWidgetDelegate { // synchronously? virtual void SetWindowRect(WebWidget* webwidget, const gfx::Rect& rect) = 0; - // Returns the rectangle of the window in which this WebWidget is embeded in. + // Returns the rectangle of the window in which this WebWidget is embeded. virtual void GetRootWindowRect(WebWidget* webwidget, gfx::Rect* rect) = 0; + // Returns the resizer rectangle of the window this WebWidget is in. This + // is used on Mac to determine if a scrollbar is over the in-window resize + // area at the bottom right corner. + virtual void GetRootWindowResizerRect(WebWidget* webwidget, gfx::Rect* rect) = 0; + // Keeps track of the necessary window move for a plugin window that resulted // from a scroll operation. That way, all plugin windows can be moved at the // same time as each other and the page. diff --git a/webkit/tools/test_shell/mac/test_webview_delegate.mm b/webkit/tools/test_shell/mac/test_webview_delegate.mm index 7373cb6..3672f05 100644 --- a/webkit/tools/test_shell/mac/test_webview_delegate.mm +++ b/webkit/tools/test_shell/mac/test_webview_delegate.mm @@ -96,6 +96,33 @@ void TestWebViewDelegate::GetRootWindowRect(WebWidget* webwidget, } } +@interface NSWindow(OSInternals) +- (NSRect)_growBoxRect; +@end + +void TestWebViewDelegate::GetRootWindowResizerRect(WebWidget* webwidget, + gfx::Rect* out_rect) { + NSRect resize_rect = NSMakeRect(0, 0, 0, 0); + if (WebWidgetHost* host = GetHostForWidget(webwidget)) { + NSView *view = host->view_handle(); + NSWindow* window = [view window]; + resize_rect = [window _growBoxRect]; + // The scrollbar assumes that the resizer goes all the way down to the + // bottom corner, so we ignore any y offset to the rect itself and use the + // entire bottom corner. There will be an offset If the window is created + // with |NSTexturedBackgroundWindowMask|, and currently TestShell makes its + // windows with that flag. + resize_rect.origin.y = 0; + // Convert to view coordinates from window coordinates. + resize_rect = [view convertRect:resize_rect fromView:nil]; + // Flip the rect in view coordinates + resize_rect.origin.y = + [view frame].size.height - resize_rect.origin.y - + resize_rect.size.height; + } + *out_rect = gfx::Rect(NSRectToCGRect(resize_rect)); +} + void TestWebViewDelegate::RunModal(WebWidget* webwidget) { NOTIMPLEMENTED(); } diff --git a/webkit/tools/test_shell/test_webview_delegate.h b/webkit/tools/test_shell/test_webview_delegate.h index 48c0930..df214bd 100644 --- a/webkit/tools/test_shell/test_webview_delegate.h +++ b/webkit/tools/test_shell/test_webview_delegate.h @@ -210,6 +210,7 @@ class TestWebViewDelegate : public base::RefCounted<TestWebViewDelegate>, virtual void GetWindowRect(WebWidget* webwidget, gfx::Rect* rect); virtual void SetWindowRect(WebWidget* webwidget, const gfx::Rect& rect); virtual void GetRootWindowRect(WebWidget *,gfx::Rect *); + virtual void GetRootWindowResizerRect(WebWidget* webwidget, gfx::Rect* rect); virtual void DidMove(WebWidget* webwidget, const WebPluginGeometry& move); virtual void RunModal(WebWidget* webwidget); virtual bool IsHidden(); diff --git a/webkit/tools/test_shell/test_webview_delegate_gtk.cc b/webkit/tools/test_shell/test_webview_delegate_gtk.cc index bbd586b..0874429 100644 --- a/webkit/tools/test_shell/test_webview_delegate_gtk.cc +++ b/webkit/tools/test_shell/test_webview_delegate_gtk.cc @@ -140,6 +140,12 @@ void TestWebViewDelegate::GetRootWindowRect(WebWidget* webwidget, } } +void TestWebViewDelegate::GetRootWindowResizerRect(WebWidget* webwidget, + gfx::Rect* out_rect) { + // Not necessary on Linux. + *out_rect = gfx::Rect(); +} + void TestWebViewDelegate::RunModal(WebWidget* webwidget) { NOTIMPLEMENTED(); } diff --git a/webkit/tools/test_shell/test_webview_delegate_win.cc b/webkit/tools/test_shell/test_webview_delegate_win.cc index 9826488..c17e2fa 100644 --- a/webkit/tools/test_shell/test_webview_delegate_win.cc +++ b/webkit/tools/test_shell/test_webview_delegate_win.cc @@ -131,6 +131,12 @@ void TestWebViewDelegate::GetRootWindowRect(WebWidget* webwidget, } } +void TestWebViewDelegate::GetRootWindowResizerRect(WebWidget* webwidget, + gfx::Rect* out_rect) { + // Not necessary on Windows. + *out_rect = gfx::Rect(); +} + void TestWebViewDelegate::RunModal(WebWidget* webwidget) { Show(webwidget, NEW_WINDOW); |