From 18bcc3c1e8ac29683e6d09a9c2d8b3037b0fb360 Mon Sep 17 00:00:00 2001 From: "agl@chromium.org" Date: Tue, 27 Jan 2009 21:39:15 +0000 Subject: POSIX: gfx::NativeViewId and CrossProcessEvent Create a couple new typedefs for porting work. Firstly, gfx::NativeViewId is a handle to a platform specific widget in the renderer process. For Windows, this is just a HWND as before. However, in other platforms the ids used in the renderer process will be something else. CrossProcessEvent is the type of a HANDLE to a Windows event object which is used across processes. Since we aren't going to support these sorts of events on non-Windows platforms, this will have to go away at some point. For now, however, this lets us build code without too many ifdefs all over the place. Review URL: http://codereview.chromium.org/18768 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8756 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/download/download_file.h | 4 +- chrome/browser/renderer_host/render_view_host.cc | 27 +++++++++--- chrome/browser/renderer_host/render_view_host.h | 3 +- .../browser/renderer_host/render_widget_helper.cc | 25 ++++++----- .../browser/renderer_host/render_widget_helper.h | 8 ++-- chrome/browser/renderer_host/render_widget_host.cc | 3 +- .../renderer_host/render_widget_host_view.h | 5 +-- chrome/browser/resource_message_filter.cc | 27 +++++++----- chrome/browser/resource_message_filter.h | 12 +++--- chrome/common/modal_dialog_event.h | 20 +++++++++ chrome/common/render_messages.h | 24 +++++++++++ chrome/common/render_messages_internal.h | 50 +++++++--------------- chrome/renderer/render_thread.cc | 16 ++++--- chrome/renderer/render_thread.h | 10 ++--- chrome/renderer/render_view.cc | 30 ++++--------- chrome/renderer/render_view.h | 12 ++---- chrome/renderer/render_widget.cc | 7 ++- chrome/renderer/render_widget.h | 9 ++-- chrome/renderer/renderer_glue.cc | 7 +-- chrome/renderer/webplugin_delegate_proxy.cc | 3 +- 20 files changed, 164 insertions(+), 138 deletions(-) create mode 100644 chrome/common/modal_dialog_event.h (limited to 'chrome') diff --git a/chrome/browser/download/download_file.h b/chrome/browser/download/download_file.h index ea74318..8811005 100644 --- a/chrome/browser/download/download_file.h +++ b/chrome/browser/download/download_file.h @@ -45,6 +45,7 @@ #include #include "base/basictypes.h" +#include "base/gfx/native_widget_types.h" #include "base/hash_tables.h" #include "base/lock.h" #include "base/ref_counted.h" @@ -196,7 +197,8 @@ class DownloadFileManager void OnShowDownloadInShell(const FilePath& full_path); // Handler to open or execute a downloaded file. void OnOpenDownloadInShell(const FilePath& full_path, - const std::wstring& url, HWND parent_window); + const std::wstring& url, + gfx::NativeView parent_window); // The download manager has provided a final name for a download. Sent from // the UI thread and run on the download thread. diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index adfebaa..5bd9af5 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -7,6 +7,7 @@ #include #include +#include "base/gfx/native_widget_types.h" #include "base/string_util.h" #include "base/waitable_event.h" #include "chrome/app/result_codes.h" @@ -129,7 +130,8 @@ bool RenderViewHost::CreateRenderView() { renderer_initialized_ = true; - HANDLE modal_dialog_event; +#if defined(OS_WIN) + HANDLE modal_dialog_event_handle; HANDLE renderer_process_handle = process()->process().handle(); if (renderer_process_handle == NULL) renderer_process_handle = GetCurrentProcess(); @@ -137,14 +139,21 @@ bool RenderViewHost::CreateRenderView() { BOOL result = DuplicateHandle(GetCurrentProcess(), modal_dialog_event_->handle(), renderer_process_handle, - &modal_dialog_event, + &modal_dialog_event_handle, SYNCHRONIZE, FALSE, 0); DCHECK(result) << "Couldn't duplicate the modal dialog handle for the renderer."; +#endif DCHECK(view()); - Send(new ViewMsg_New(view()->GetPluginHWND(), + + ModalDialogEvent modal_dialog_event; +#if defined(OS_WIN) + modal_dialog_event.event = modal_dialog_event_handle; +#endif + + Send(new ViewMsg_New(gfx::IdFromNativeView(view()->GetPluginHWND()), modal_dialog_event, delegate_->GetWebkitPrefs(), routing_id())); @@ -751,11 +760,17 @@ void RenderViewHost::Shutdown() { } void RenderViewHost::OnMsgCreateWindow(int route_id, - HANDLE modal_dialog_event) { + ModalDialogEvent modal_dialog_event) { RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); + base::WaitableEvent* waitable_event = new base::WaitableEvent( +#if defined(OS_WIN) + modal_dialog_event.event); +#else + true, false); +#endif + if (view) - view->CreateNewWindow(route_id, - new base::WaitableEvent(modal_dialog_event)); + view->CreateNewWindow(route_id, waitable_event); } void RenderViewHost::OnMsgCreateWidget(int route_id, bool activatable) { diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index f4c40ed..0c968e4 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -11,6 +11,7 @@ #include "base/scoped_ptr.h" #include "chrome/browser/renderer_host/render_view_host_delegate.h" #include "chrome/browser/renderer_host/render_widget_host.h" +#include "chrome/common/modal_dialog_event.h" #include "chrome/common/page_zoom.h" #ifdef CHROME_PERSONALIZATION #include "chrome/personalization/personalization.h" @@ -416,7 +417,7 @@ class RenderViewHost : public RenderWidgetHost { virtual void NotifyRendererResponsive(); // IPC message handlers. - void OnMsgCreateWindow(int route_id, HANDLE modal_dialog_event); + void OnMsgCreateWindow(int route_id, ModalDialogEvent modal_dialog_event); void OnMsgCreateWidget(int route_id, bool activatable); void OnMsgShowView(int route_id, WindowOpenDisposition disposition, diff --git a/chrome/browser/renderer_host/render_widget_helper.cc b/chrome/browser/renderer_host/render_widget_helper.cc index d92ff301..85da6dd 100644 --- a/chrome/browser/renderer_host/render_widget_helper.cc +++ b/chrome/browser/renderer_host/render_widget_helper.cc @@ -189,37 +189,36 @@ void RenderWidgetHelper::OnCrossSiteClosePageACK( void RenderWidgetHelper::CreateNewWindow(int opener_id, bool user_gesture, base::ProcessHandle render_process, - int* route_id -#if defined(OS_WIN) - , HANDLE* modal_dialog_event) { -#else - ) { -#endif + int* route_id, + ModalDialogEvent* modal_dialog_event) { if (!user_gesture && block_popups_) { *route_id = MSG_ROUTING_NONE; - *modal_dialog_event = NULL; +#if defined(OS_WIN) + modal_dialog_event->event = NULL; +#endif return; } *route_id = GetNextRoutingID(); + ModalDialogEvent modal_dialog_event_internal; #if defined(OS_WIN) HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL); + modal_dialog_event_internal.event = event; + BOOL result = DuplicateHandle(GetCurrentProcess(), event, render_process, - modal_dialog_event, + &modal_dialog_event->event, SYNCHRONIZE, FALSE, 0); DCHECK(result) << "Couldn't duplicate modal dialog event for the renderer."; +#endif // The easiest way to reach RenderViewHost is just to send a routed message. - ViewHostMsg_CreateWindowWithRoute msg(opener_id, *route_id, event); -#else - // TODO(port) figure out how the modal dialog event should work. - ViewHostMsg_CreateWindowWithRoute msg(opener_id, *route_id); -#endif + ViewHostMsg_CreateWindowWithRoute msg(opener_id, *route_id, + modal_dialog_event_internal); ui_loop_->PostTask(FROM_HERE, NewRunnableMethod( this, &RenderWidgetHelper::OnSimulateReceivedMessage, msg)); diff --git a/chrome/browser/renderer_host/render_widget_helper.h b/chrome/browser/renderer_host/render_widget_helper.h index b73ce03..83cedb0 100644 --- a/chrome/browser/renderer_host/render_widget_helper.h +++ b/chrome/browser/renderer_host/render_widget_helper.h @@ -12,6 +12,7 @@ #include "base/ref_counted.h" #include "base/lock.h" #include "base/waitable_event.h" +#include "chrome/common/modal_dialog_event.h" namespace IPC { class Message; @@ -109,11 +110,8 @@ class RenderWidgetHelper : void CreateNewWindow(int opener_id, bool user_gesture, base::ProcessHandle render_process, - int* route_id -#if defined(OS_WIN) - , HANDLE* modal_dialog_event -#endif - ); + int* route_id, + ModalDialogEvent* modal_dialog_event); void CreateNewWidget(int opener_id, bool activatable, int* route_id); private: diff --git a/chrome/browser/renderer_host/render_widget_host.cc b/chrome/browser/renderer_host/render_widget_host.cc index 865abbb..b3108b5 100644 --- a/chrome/browser/renderer_host/render_widget_host.cc +++ b/chrome/browser/renderer_host/render_widget_host.cc @@ -68,7 +68,8 @@ void RenderWidgetHost::Init() { // Send the ack along with the information on placement. HWND plugin_hwnd = view_->GetPluginHWND(); - Send(new ViewMsg_CreatingNew_ACK(routing_id_, plugin_hwnd)); + Send(new ViewMsg_CreatingNew_ACK(routing_id_, + gfx::IdFromNativeView(plugin_hwnd))); WasResized(); } diff --git a/chrome/browser/renderer_host/render_widget_host_view.h b/chrome/browser/renderer_host/render_widget_host_view.h index c07de07..33d971c 100644 --- a/chrome/browser/renderer_host/render_widget_host_view.h +++ b/chrome/browser/renderer_host/render_widget_host_view.h @@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_H_ #define CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_H_ +#include "base/gfx/native_widget_types.h" #include "base/shared_memory.h" #include "build/build_config.h" #include "chrome/common/render_messages.h" @@ -59,10 +60,8 @@ class RenderWidgetHostView { // Tells the View to size itself to the specified size. virtual void SetSize(const gfx::Size& size) = 0; -#if defined(OS_WIN) // Retrieves the HWND used to contain plugin HWNDs. - virtual HWND GetPluginHWND() = 0; -#endif + virtual gfx::NativeView GetPluginHWND() = 0; // Moves all plugin windows as described in the given list. virtual void MovePluginWindows( diff --git a/chrome/browser/resource_message_filter.cc b/chrome/browser/resource_message_filter.cc index e97c46c..753590c 100644 --- a/chrome/browser/resource_message_filter.cc +++ b/chrome/browser/resource_message_filter.cc @@ -5,6 +5,7 @@ #include "chrome/browser/resource_message_filter.h" #include "base/clipboard.h" +#include "base/gfx/native_widget_types.h" #include "base/histogram.h" #include "base/thread.h" #include "chrome/browser/chrome_plugin_browsing_context.h" @@ -244,10 +245,9 @@ bool ResourceMessageFilter::Send(IPC::Message* message) { return channel_->Send(message); } -void ResourceMessageFilter::OnMsgCreateWindow(int opener_id, - bool user_gesture, - int* route_id, - HANDLE* modal_dialog_event) { +void ResourceMessageFilter::OnMsgCreateWindow( + int opener_id, bool user_gesture, int* route_id, + ModalDialogEvent* modal_dialog_event) { render_widget_helper_->CreateNewWindow(opener_id, user_gesture, render_handle_, @@ -406,8 +406,8 @@ void ResourceMessageFilter::OnLoadFont(LOGFONT font) { } void ResourceMessageFilter::OnGetScreenInfo( - gfx::NativeView window, webkit_glue::ScreenInfo* results) { - *results = webkit_glue::GetScreenInfoHelper(window); + gfx::NativeViewId window, webkit_glue::ScreenInfo* results) { + *results = webkit_glue::GetScreenInfoHelper(gfx::NativeViewFromId(window)); } void ResourceMessageFilter::OnGetPlugins(bool refresh, @@ -474,20 +474,25 @@ void ResourceMessageFilter::OnClipboardReadHTML(std::wstring* markup, #if defined(OS_WIN) -void ResourceMessageFilter::OnGetWindowRect(HWND window, gfx::Rect *rect) { +void ResourceMessageFilter::OnGetWindowRect(gfx::NativeViewId window_id, + gfx::Rect* rect) { + HWND window = gfx::NativeViewFromId(window_id); RECT window_rect = {0}; GetWindowRect(window, &window_rect); *rect = window_rect; } -void ResourceMessageFilter::OnGetRootWindowRect(HWND window, gfx::Rect *rect) { +void ResourceMessageFilter::OnGetRootWindowRect(gfx::NativeViewId window_id, + gfx::Rect* rect) { + HWND window = gfx::NativeViewFromId(window_id); RECT window_rect = {0}; HWND root_window = ::GetAncestor(window, GA_ROOT); GetWindowRect(root_window, &window_rect); *rect = window_rect; } -void ResourceMessageFilter::OnGetRootWindowResizerRect(HWND window, gfx::Rect *rect) { +void ResourceMessageFilter::OnGetRootWindowResizerRect(gfx::NativeViewId window, + gfx::Rect* rect) { RECT window_rect = {0}; *rect = window_rect; } @@ -581,10 +586,12 @@ void ResourceMessageFilter::OnGetDefaultPrintSettingsReply( #if defined(OS_WIN) -void ResourceMessageFilter::OnScriptedPrint(HWND host_window, +void ResourceMessageFilter::OnScriptedPrint(gfx::NativeViewId host_window_id, int cookie, int expected_pages_count, IPC::Message* reply_msg) { + HWND host_window = gfx::NativeViewFromId(host_window_id); + scoped_refptr printer_query; print_job_manager_->PopPrinterQuery(cookie, &printer_query); if (!printer_query.get()) { diff --git a/chrome/browser/resource_message_filter.h b/chrome/browser/resource_message_filter.h index 09d42b6..026c232 100644 --- a/chrome/browser/resource_message_filter.h +++ b/chrome/browser/resource_message_filter.h @@ -82,7 +82,7 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, private: void OnMsgCreateWindow(int opener_id, bool user_gesture, int* route_id, - HANDLE* modal_dialog_event); + ModalDialogEvent* modal_dialog_event); void OnMsgCreateWidget(int opener_id, bool activatable, int* route_id); void OnRequestResource(const IPC::Message& msg, int request_id, const ViewHostMsg_Resource_Request& request); @@ -115,7 +115,7 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, void OnLoadFont(LOGFONT font); #endif - void OnGetScreenInfo(gfx::NativeView window, + void OnGetScreenInfo(gfx::NativeViewId window, webkit_glue::ScreenInfo* results); void OnGetPlugins(bool refresh, std::vector* plugins); void OnGetPluginPath(const GURL& url, @@ -142,9 +142,9 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, void OnClipboardReadAsciiText(std::string* result); void OnClipboardReadHTML(std::wstring* markup, GURL* src_url); #if defined(OS_WIN) - void OnGetWindowRect(HWND window, gfx::Rect *rect); - void OnGetRootWindowRect(HWND window, gfx::Rect *rect); - void OnGetRootWindowResizerRect(HWND window, gfx::Rect *rect); + void OnGetWindowRect(gfx::NativeViewId window, gfx::Rect *rect); + void OnGetRootWindowRect(gfx::NativeViewId window, gfx::Rect *rect); + void OnGetRootWindowResizerRect(gfx::NativeViewId window, gfx::Rect *rect); #endif void OnGetMimeTypeFromExtension(const std::wstring& ext, std::string* mime_type); @@ -168,7 +168,7 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, // A javascript code requested to print the current page. The renderer host // have to show to the user the print dialog and returns the selected print // settings. - void OnScriptedPrint(HWND host_window, + void OnScriptedPrint(gfx::NativeViewId host_window, int cookie, int expected_pages_count, IPC::Message* reply_msg); diff --git a/chrome/common/modal_dialog_event.h b/chrome/common/modal_dialog_event.h new file mode 100644 index 0000000..2a14c87 --- /dev/null +++ b/chrome/common/modal_dialog_event.h @@ -0,0 +1,20 @@ +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_COMMON_MODAL_DIALOG_EVENT_H_ +#define CHROME_COMMON_MODAL_DIALOG_EVENT_H_ + +// This structure is passed around where we need a modal dialog event, which +// is currently not plumbed on Mac & Linux. +// +// TODO(port) Fix this. This structure should probably go away and we should +// do the modal dialog event in some portable way. If you remove this, be +// sure to also remove the ParamTraits for it in resource_messages.h +struct ModalDialogEvent { +#if defined(OS_WIN) + HANDLE event; +#endif +}; + +#endif // CHROME_COMMON_MODAL_DIALOG_EVENT_H_ diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h index b0338b7..83dddb1 100644 --- a/chrome/common/render_messages.h +++ b/chrome/common/render_messages.h @@ -15,6 +15,7 @@ #include "chrome/common/filter_policy.h" #include "chrome/common/ipc_message.h" #include "chrome/common/ipc_message_utils.h" +#include "chrome/common/modal_dialog_event.h" #include "chrome/common/page_transition_types.h" #include "googleurl/src/gurl.h" #include "net/base/upload_data.h" @@ -1723,6 +1724,29 @@ struct ParamTraits { } }; +template<> +struct ParamTraits { + typedef ModalDialogEvent param_type; +#if defined(OS_WIN) + static void Write(Message* m, const param_type& p) { + WriteParam(m, p.event); + } + static bool Read(const Message* m, void** iter, param_type* p) { + return ReadParam(m, iter, &p->event); + } +#else + static void Write(Message* m, const param_type& p) { + } + static bool Read(const Message* m, void** iter, param_type* p) { + return true; + } +#endif + + static void Log(const param_type& p, std::wstring* l) { + l->append(L""); + } +}; + } // namespace IPC #endif // CHROME_COMMON_RENDER_MESSAGES_H_ diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index 1081e54..30c6469 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -13,6 +13,7 @@ #include "base/clipboard.h" #include "base/gfx/rect.h" +#include "base/gfx/native_widget_types.h" #include "base/shared_memory.h" #include "chrome/common/ipc_message_macros.h" #include "skia/include/SkBitmap.h" @@ -39,12 +40,14 @@ IPC_BEGIN_MESSAGES(View, 1) IPC_MESSAGE_CONTROL1(ViewMsg_SetNextPageID, int32 /* next_page_id */) -#if defined(OS_WIN) // Tells the renderer to create a new view. // This message is slightly different, the view it takes is the view to // create, the message itself is sent as a non-view control message. - IPC_MESSAGE_CONTROL4(ViewMsg_New, HWND, HANDLE, WebPreferences, int32) -#endif // defined(OS_WIN) + IPC_MESSAGE_CONTROL4(ViewMsg_New, + gfx::NativeViewId, /* parent window */ + ModalDialogEvent, /* model dialog box event */ + WebPreferences, + int32 /* view id */) // Tells the renderer to set its maximum cache size to the supplied value IPC_MESSAGE_CONTROL3(ViewMsg_SetCacheCapacities, @@ -61,13 +64,8 @@ IPC_BEGIN_MESSAGES(View, 1) // Reply in response to ViewHostMsg_ShowView or ViewHostMsg_ShowWidget. // similar to the new command, but used when the renderer created a view // first, and we need to update it -#if defined(OS_WIN) IPC_MESSAGE_ROUTED1(ViewMsg_CreatingNew_ACK, - HWND /* parent_hwnd */) -#else // defined(OS_WIN) - // On POSIX, we don't pass "window handles" between processes. - IPC_MESSAGE_ROUTED0(ViewMsg_CreatingNew_ACK) -#endif + gfx::NativeViewId /* parent_hwnd */) // Tells the render view to close. IPC_MESSAGE_ROUTED0(ViewMsg_Close) @@ -495,7 +493,6 @@ IPC_END_MESSAGES(View) // These are messages sent from the renderer to the browser process. IPC_BEGIN_MESSAGES(ViewHost, 2) -#if defined(OS_WIN) // Sent by the renderer when it is creating a new window. The browser creates // a tab for it and responds with a ViewMsg_CreatingNew_ACK. If route_id is // MSG_ROUTING_NONE, the view couldn't be created. modal_dialog_event is set @@ -504,16 +501,7 @@ IPC_BEGIN_MESSAGES(ViewHost, 2) int /* opener_id */, bool /* user_gesture */, int /* route_id */, - HANDLE /* modal_dialog_event */) -#else // defined(OS_WIN) - // On POSIX, we don't use the cross process events for modal dialogs. At some - // point, we won't use them on any platform, but for now we just define a - // message without the last parameter. - IPC_SYNC_MESSAGE_CONTROL2_1(ViewHostMsg_CreateWindow, - int /* opener_id */, - bool /* user_gesture */, - int /* route_id */) -#endif + ModalDialogEvent /* modal_dialog_event */) // Similar to ViewHostMsg_CreateView, except used for sub-widgets, like //