diff options
author | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-15 22:25:11 +0000 |
---|---|---|
committer | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-15 22:25:11 +0000 |
commit | 1c4947ffee0b7f5672737b542eb6adf466fcb223 (patch) | |
tree | ca2b1631479523a3a397fac842fe0870f422193f /chrome/browser | |
parent | c0ce93d64e2374f29acf2130c5324dc54762f0fa (diff) | |
download | chromium_src-1c4947ffee0b7f5672737b542eb6adf466fcb223.zip chromium_src-1c4947ffee0b7f5672737b542eb6adf466fcb223.tar.gz chromium_src-1c4947ffee0b7f5672737b542eb6adf466fcb223.tar.bz2 |
WaitableEvent is the replacement for Windows events. Previously in the code, a HANDLE from CreateEvent was used for signaling, both within a process and across processes.
WaitableEvent is the cross platform replacement for this. To convert:
* HANDLE -> base::WaitableEvent*
* ScopedHandle -> scoped_ptr<base::WaitableEvent>
* CreateEvent -> new base::WaitableEvent
* SetEvent -> base::WaitableEvent::Signal
* ResetEvent -> base::WaitableEvent::Reset
* ObjectWatcher -> base::WaitableEventWatcher
* WaitForMultipleObjects -> static base::WaitableEvent::WaitMany
ObjectWatcher remains for Windows specific code. WaitableEventWatcher has an identical interface save,
* It uses WaitableEvents, not HANDLEs
* It returns void from StartWatching and StopWatcher, rather than errors. System internal errors are fatal to the address space
IMPORTANT: There are semantic differences between the different platforms. WaitableEvents on Windows are implemented on top of events. Windows events work across process and this is used mostly for modal dialog support. Windows events can be duplicated with DuplicateHandle.
On other platforms, WaitableEvent works only within a single process. In the future we shall have to replace the current uses of cross-process events with IPCs.
BEWARE: HANDLE, on Windows, is a void *. Since any pointer type coerces to void *, you can pass a WaitableEvent * where a HANDLE is expected without any build-time errors.
Review URL: http://codereview.chromium.org/16554
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8126 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/browser_process.h | 5 | ||||
-rw-r--r-- | chrome/browser/browser_process_impl.cc | 3 | ||||
-rw-r--r-- | chrome/browser/browser_process_impl.h | 4 | ||||
-rw-r--r-- | chrome/browser/browser_shutdown.cc | 3 | ||||
-rw-r--r-- | chrome/browser/render_view_host.cc | 26 | ||||
-rw-r--r-- | chrome/browser/render_view_host.h | 12 | ||||
-rw-r--r-- | chrome/browser/render_view_host_delegate.h | 9 | ||||
-rw-r--r-- | chrome/browser/render_view_host_manager.cc | 10 | ||||
-rw-r--r-- | chrome/browser/render_view_host_manager.h | 4 | ||||
-rw-r--r-- | chrome/browser/tab_contents/web_contents.cc | 2 | ||||
-rw-r--r-- | chrome/browser/tab_contents/web_contents.h | 6 | ||||
-rw-r--r-- | chrome/browser/tab_contents/web_contents_unittest.cc | 6 | ||||
-rw-r--r-- | chrome/browser/tab_contents/web_contents_view.cc | 3 | ||||
-rw-r--r-- | chrome/browser/tab_contents/web_contents_view.h | 11 | ||||
-rw-r--r-- | chrome/browser/tab_contents/web_contents_view_win.cc | 2 | ||||
-rw-r--r-- | chrome/browser/tab_contents/web_contents_view_win.h | 2 |
16 files changed, 69 insertions, 39 deletions
diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h index 18ce8be..adff28b 100644 --- a/chrome/browser/browser_process.h +++ b/chrome/browser/browser_process.h @@ -36,6 +36,7 @@ class SuspendController; namespace base { class Thread; +class WaitableEvent; } namespace sandbox { class BrokerServices; @@ -128,10 +129,10 @@ class BrowserProcess { ResourceDispatcherHost* rdh = resource_dispatcher_host(); return rdh ? rdh->download_request_manager() : NULL; } +#endif // Returns an event that is signaled when the browser shutdown. - virtual HANDLE shutdown_event() = 0; -#endif + virtual base::WaitableEvent* shutdown_event() = 0; // Returns a reference to the user-data-dir based profiles vector. std::vector<std::wstring>& user_data_dir_profiles() { diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 904de03..bccf10b 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc @@ -7,6 +7,7 @@ #include "base/command_line.h" #include "base/path_service.h" #include "base/thread.h" +#include "base/waitable_event.h" #include "chrome/browser/automation/automation_provider_list.h" #include "chrome/browser/browser_trial.h" #include "chrome/browser/chrome_thread.h" @@ -127,7 +128,7 @@ BrowserProcessImpl::BrowserProcessImpl(CommandLine& command_line) memory_model_ = MEDIUM_MEMORY_MODEL; } - shutdown_event_ = ::CreateEvent(NULL, TRUE, FALSE, NULL); + shutdown_event_ = new base::WaitableEvent(true, false); } BrowserProcessImpl::~BrowserProcessImpl() { diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h index 6f51102..3b8732c 100644 --- a/chrome/browser/browser_process_impl.h +++ b/chrome/browser/browser_process_impl.h @@ -167,7 +167,7 @@ class BrowserProcessImpl : public BrowserProcess, public NonThreadSafe { return memory_model_; } - virtual HANDLE shutdown_event() { return shutdown_event_; } + virtual base::WaitableEvent* shutdown_event() { return shutdown_event_; } private: void CreateResourceDispatcherHost(); @@ -242,7 +242,7 @@ class BrowserProcessImpl : public BrowserProcess, public NonThreadSafe { bool using_new_frames_; // An event that notifies when we are shutting-down. - HANDLE shutdown_event_; + base::WaitableEvent* shutdown_event_; DISALLOW_EVIL_CONSTRUCTORS(BrowserProcessImpl); }; diff --git a/chrome/browser/browser_shutdown.cc b/chrome/browser/browser_shutdown.cc index e192688..e0417fa 100644 --- a/chrome/browser/browser_shutdown.cc +++ b/chrome/browser/browser_shutdown.cc @@ -9,6 +9,7 @@ #include "base/path_service.h" #include "base/string_util.h" #include "base/time.h" +#include "base/waitable_event.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/first_run.h" #include "chrome/browser/jankometer.h" @@ -86,7 +87,7 @@ void Shutdown() { DCHECK(g_browser_process); // Notifies we are going away. - ::SetEvent(g_browser_process->shutdown_event()); + g_browser_process->shutdown_event()->Signal(); PluginService* plugin_service = PluginService::GetInstance(); if (plugin_service) { diff --git a/chrome/browser/render_view_host.cc b/chrome/browser/render_view_host.cc index 5ace177..399beee 100644 --- a/chrome/browser/render_view_host.cc +++ b/chrome/browser/render_view_host.cc @@ -8,6 +8,7 @@ #include <vector> #include "base/string_util.h" +#include "base/waitable_event.h" #include "chrome/app/result_codes.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/cross_site_request_manager.h" @@ -74,7 +75,7 @@ RenderViewHost* RenderViewHost::FromID(int render_process_id, RenderViewHost::RenderViewHost(SiteInstance* instance, RenderViewHostDelegate* delegate, int routing_id, - HANDLE modal_dialog_event) + base::WaitableEvent* modal_dialog_event) : RenderWidgetHost(instance->GetProcess(), routing_id), instance_(instance), enable_dom_ui_bindings_(false), @@ -93,9 +94,9 @@ RenderViewHost::RenderViewHost(SiteInstance* instance, DCHECK(instance_); DCHECK(delegate_); if (modal_dialog_event == NULL) - modal_dialog_event = CreateEvent(NULL, TRUE, FALSE, NULL); + modal_dialog_event = new base::WaitableEvent(true, false); - modal_dialog_event_.Set(modal_dialog_event); + modal_dialog_event_.reset(modal_dialog_event); #ifdef CHROME_PERSONALIZATION personalization_ = Personalization::CreateHostPersonalization(this); #endif @@ -134,7 +135,7 @@ bool RenderViewHost::CreateRenderView() { renderer_process_handle = GetCurrentProcess(); BOOL result = DuplicateHandle(GetCurrentProcess(), - modal_dialog_event_.Get(), + modal_dialog_event_->handle(), renderer_process_handle, &modal_dialog_event, SYNCHRONIZE, @@ -498,7 +499,7 @@ void RenderViewHost::JavaScriptMessageBoxClosed(IPC::Message* reply_msg, } if (--modal_dialog_count_ == 0) - ResetEvent(modal_dialog_event_.Get()); + modal_dialog_event_->Reset(); ViewHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg, success, prompt); Send(reply_msg); } @@ -509,7 +510,7 @@ void RenderViewHost::ModalHTMLDialogClosed(IPC::Message* reply_msg, StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); if (--modal_dialog_count_ == 0) - ResetEvent(modal_dialog_event_.Get()); + modal_dialog_event_->Reset(); ViewHostMsg_ShowModalHTMLDialog::WriteReplyParams(reply_msg, json_retval); Send(reply_msg); @@ -742,7 +743,7 @@ void RenderViewHost::Shutdown() { // If we are being run modally (see RunModal), then we need to cleanup. if (run_modal_reply_msg_) { if (--modal_dialog_count_ == 0) - ResetEvent(modal_dialog_event_.Get()); + modal_dialog_event_->Reset(); Send(run_modal_reply_msg_); run_modal_reply_msg_ = NULL; } @@ -753,7 +754,8 @@ void RenderViewHost::OnMsgCreateWindow(int route_id, HANDLE modal_dialog_event) { RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); if (view) - view->CreateNewWindow(route_id, modal_dialog_event); + view->CreateNewWindow(route_id, + new base::WaitableEvent(modal_dialog_event)); } void RenderViewHost::OnMsgCreateWidget(int route_id, bool activatable) { @@ -781,7 +783,7 @@ void RenderViewHost::OnMsgShowWidget(int route_id, void RenderViewHost::OnMsgRunModal(IPC::Message* reply_msg) { DCHECK(!run_modal_reply_msg_); if (modal_dialog_count_++ == 0) - SetEvent(modal_dialog_event_.Get()); + modal_dialog_event_->Reset(); run_modal_reply_msg_ = reply_msg; // TODO(darin): Bug 1107929: Need to inform our delegate to show this view in @@ -1085,7 +1087,7 @@ void RenderViewHost::OnMsgRunJavaScriptMessage( IPC::Message* reply_msg) { StopHangMonitorTimeout(); if (modal_dialog_count_++ == 0) - SetEvent(modal_dialog_event_.Get()); + modal_dialog_event_->Signal(); bool did_suppress_message = false; delegate_->RunJavaScriptMessage(message, default_prompt, flags, reply_msg, &are_javascript_messages_suppressed_); @@ -1095,7 +1097,7 @@ void RenderViewHost::OnMsgRunBeforeUnloadConfirm(const std::wstring& message, IPC::Message* reply_msg) { StopHangMonitorTimeout(); if (modal_dialog_count_++ == 0) - SetEvent(modal_dialog_event_.Get()); + modal_dialog_event_->Signal(); delegate_->RunBeforeUnloadConfirm(message, reply_msg); } @@ -1104,7 +1106,7 @@ void RenderViewHost::OnMsgShowModalHTMLDialog( IPC::Message* reply_msg) { StopHangMonitorTimeout(); if (modal_dialog_count_++ == 0) - SetEvent(modal_dialog_event_.Get()); + modal_dialog_event_->Signal(); delegate_->ShowModalHTMLDialog(url, width, height, json_arguments, reply_msg); } diff --git a/chrome/browser/render_view_host.h b/chrome/browser/render_view_host.h index f95720e..7b0ef7a 100644 --- a/chrome/browser/render_view_host.h +++ b/chrome/browser/render_view_host.h @@ -8,7 +8,7 @@ #include <string> #include <vector> -#include "base/scoped_handle.h" +#include "base/scoped_ptr.h" #include "chrome/browser/render_view_host_delegate.h" #include "chrome/browser/render_widget_host.h" #include "chrome/common/page_zoom.h" @@ -33,6 +33,10 @@ struct WebDropData; struct WebPreferences; enum WindowOpenDisposition; +namespace base { +class WaitableEvent; +} + namespace gfx { class Point; } @@ -86,7 +90,7 @@ class RenderViewHost : public RenderWidgetHost { explicit RenderViewHost(SiteInstance* instance, RenderViewHostDelegate* delegate, int routing_id, - HANDLE modal_dialog_event); + base::WaitableEvent* modal_dialog_event); virtual ~RenderViewHost(); SiteInstance* site_instance() const { return instance_; } @@ -578,7 +582,7 @@ class RenderViewHost : public RenderWidgetHost { // Handle to an event that's set when the page is showing a modal dialog box // (or equivalent constrained window). The renderer and plugin processes // check this to know if they should pump messages/tasks then. - ScopedHandle modal_dialog_event_; + scoped_ptr<base::WaitableEvent> modal_dialog_event_; // Multiple dialog boxes can be shown before the first one is finished, // so we keep a counter to know when we can reset the modal dialog event. @@ -618,7 +622,7 @@ class RenderViewHostFactory { SiteInstance* instance, RenderViewHostDelegate* delegate, int routing_id, - HANDLE modal_dialog_event) = 0; + base::WaitableEvent* modal_dialog_event) = 0; }; #endif // CHROME_BROWSER_RENDER_VIEW_HOST_H__ diff --git a/chrome/browser/render_view_host_delegate.h b/chrome/browser/render_view_host_delegate.h index 1fd0c41..34aba46 100644 --- a/chrome/browser/render_view_host_delegate.h +++ b/chrome/browser/render_view_host_delegate.h @@ -22,6 +22,10 @@ class WebContents; struct WebDropData; enum WindowOpenDisposition; +namespace base { +class WaitableEvent; +} + namespace IPC { class Message; } @@ -56,7 +60,10 @@ class RenderViewHostDelegate { // // Note: this is not called "CreateWindow" because that will clash with // the Windows function which is actually a #define. - virtual void CreateNewWindow(int route_id, HANDLE modal_dialog_event) = 0; + // + // NOTE: this takes ownership of @modal_dialog_event + virtual void CreateNewWindow(int route_id, + base::WaitableEvent* modal_dialog_event) = 0; // The page is trying to open a new widget (e.g. a select popup). The // widget should be created associated with the given route, but it should diff --git a/chrome/browser/render_view_host_manager.cc b/chrome/browser/render_view_host_manager.cc index f7edacf..622df9e 100644 --- a/chrome/browser/render_view_host_manager.cc +++ b/chrome/browser/render_view_host_manager.cc @@ -15,6 +15,10 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/notification_service.h" +namespace base { +class WaitableEvent; +} + RenderViewHostManager::RenderViewHostManager( RenderViewHostFactory* render_view_factory, RenderViewHostDelegate* render_view_delegate, @@ -37,7 +41,7 @@ RenderViewHostManager::~RenderViewHostManager() { void RenderViewHostManager::Init(Profile* profile, SiteInstance* site_instance, int routing_id, - HANDLE modal_dialog_event) { + base::WaitableEvent* modal_dialog_event) { // Create a RenderViewHost, once we have an instance. It is important to // immediately give this SiteInstance to a RenderViewHost so that it is // ref counted. @@ -55,7 +59,7 @@ void RenderViewHostManager::Shutdown() { render_view_host_->Shutdown(); render_view_host_ = NULL; } - + RenderViewHost* RenderViewHostManager::Navigate(const NavigationEntry& entry) { RenderViewHost* dest_render_view_host = UpdateRendererStateNavigate(entry); if (!dest_render_view_host) @@ -347,7 +351,7 @@ bool RenderViewHostManager::CreatePendingRenderView(SiteInstance* instance) { RenderViewHost* RenderViewHostManager::CreateRenderViewHost( SiteInstance* instance, int routing_id, - HANDLE modal_dialog_event) { + base::WaitableEvent* modal_dialog_event) { if (render_view_factory_) { return render_view_factory_->CreateRenderViewHost( instance, render_view_delegate_, routing_id, modal_dialog_event); diff --git a/chrome/browser/render_view_host_manager.h b/chrome/browser/render_view_host_manager.h index 3c2f61d..ee0e16b 100644 --- a/chrome/browser/render_view_host_manager.h +++ b/chrome/browser/render_view_host_manager.h @@ -69,7 +69,7 @@ class RenderViewHostManager { void Init(Profile* profile, SiteInstance* site_instance, int routing_id, - HANDLE modal_dialog_event); + base::WaitableEvent* modal_dialog_event); // Schedules all RenderViewHosts for destruction. void Shutdown(); @@ -179,7 +179,7 @@ class RenderViewHostManager { // factory is NULL). RenderViewHost* CreateRenderViewHost(SiteInstance* instance, int routing_id, - HANDLE modal_dialog_event); + base::WaitableEvent* modal_dialog_event); // Replaces the currently shown render_view_host_ with the RenderViewHost in // the field pointed to by |new_render_view_host|, and then NULLs the field. diff --git a/chrome/browser/tab_contents/web_contents.cc b/chrome/browser/tab_contents/web_contents.cc index 77faa55..638d370 100644 --- a/chrome/browser/tab_contents/web_contents.cc +++ b/chrome/browser/tab_contents/web_contents.cc @@ -178,7 +178,7 @@ WebContents::WebContents(Profile* profile, SiteInstance* site_instance, RenderViewHostFactory* render_view_factory, int routing_id, - HANDLE modal_dialog_event) + base::WaitableEvent* modal_dialog_event) : TabContents(TAB_CONTENTS_WEB), view_(new WebContentsViewWin(this)), ALLOW_THIS_IN_INITIALIZER_LIST( diff --git a/chrome/browser/tab_contents/web_contents.h b/chrome/browser/tab_contents/web_contents.h index 7b44e79..86ce3bf 100644 --- a/chrome/browser/tab_contents/web_contents.h +++ b/chrome/browser/tab_contents/web_contents.h @@ -24,6 +24,10 @@ class RenderViewHostFactory; class RenderWidgetHost; class WebContentsView; +namespace base { +class WaitableEvent; +} + // WebContents represents the contents of a tab that shows web pages. It embeds // a RenderViewHost (via RenderViewHostManager) to actually display the page. class WebContents : public TabContents, @@ -41,7 +45,7 @@ class WebContents : public TabContents, SiteInstance* instance, RenderViewHostFactory* render_view_factory, int routing_id, - HANDLE modal_dialog_event); + base::WaitableEvent* modal_dialog_event); static void RegisterUserPrefs(PrefService* prefs); diff --git a/chrome/browser/tab_contents/web_contents_unittest.cc b/chrome/browser/tab_contents/web_contents_unittest.cc index df018c1..fbb3ad6 100644 --- a/chrome/browser/tab_contents/web_contents_unittest.cc +++ b/chrome/browser/tab_contents/web_contents_unittest.cc @@ -82,7 +82,7 @@ class TestRenderViewHost : public RenderViewHost { SiteInstance* instance, RenderViewHostDelegate* delegate, int routing_id, - HANDLE modal_dialog_event) + base::WaitableEvent* modal_dialog_event) : RenderViewHost(instance, delegate, routing_id, modal_dialog_event), is_loading(false), is_created(false), @@ -156,7 +156,7 @@ class TestRenderViewHostFactory : public RenderViewHostFactory { SiteInstance* instance, RenderViewHostDelegate* delegate, int routing_id, - HANDLE modal_dialog_event) { + base::WaitableEvent* modal_dialog_event) { return new TestRenderViewHost( instance, delegate, routing_id, modal_dialog_event); } @@ -217,7 +217,7 @@ class TestWebContents : public WebContents { RenderViewHost* CreateRenderViewHost(SiteInstance* instance, RenderViewHostDelegate* delegate, int routing_id, - HANDLE modal_dialog_event) { + base::WaitableEvent* modal_dialog_event) { return new TestRenderViewHost( instance, delegate, routing_id, modal_dialog_event); } diff --git a/chrome/browser/tab_contents/web_contents_view.cc b/chrome/browser/tab_contents/web_contents_view.cc index d95fd78..c3c8e8b 100644 --- a/chrome/browser/tab_contents/web_contents_view.cc +++ b/chrome/browser/tab_contents/web_contents_view.cc @@ -16,7 +16,8 @@ void WebContentsView::RenderWidgetHostDestroyed(RenderWidgetHost* host) { } } -void WebContentsView::CreateNewWindow(int route_id, HANDLE modal_dialog_event) { +void WebContentsView::CreateNewWindow(int route_id, + base::WaitableEvent* modal_dialog_event) { // Save the created window associated with the route so we can show it later. pending_contents_[route_id] = CreateNewWindowInternal(route_id, modal_dialog_event); diff --git a/chrome/browser/tab_contents/web_contents_view.h b/chrome/browser/tab_contents/web_contents_view.h index 232b449..dc5362c 100644 --- a/chrome/browser/tab_contents/web_contents_view.h +++ b/chrome/browser/tab_contents/web_contents_view.h @@ -24,6 +24,10 @@ class WebContents; struct WebDropData; class WebKeyboardEvent; +namespace base { +class WaitableEvent; +} + // The WebContentsView is an interface that is implemented by the platform- // dependent web contents views. The WebContents uses this interface to talk to // them. View-related messages will also get forwarded directly to this class @@ -152,8 +156,8 @@ class WebContentsView : public RenderViewHostDelegate::View { // created objects so that they can be associated with the given routes. When // they are shown later, we'll look them up again and pass the objects to // the Show functions rather than the route ID. - virtual WebContents* CreateNewWindowInternal(int route_id, - HANDLE modal_dialog_event) = 0; + virtual WebContents* CreateNewWindowInternal + (int route_id, base::WaitableEvent* modal_dialog_event) = 0; virtual RenderWidgetHostView* CreateNewWidgetInternal(int route_id, bool activatable) = 0; virtual void ShowCreatedWindowInternal(WebContents* new_web_contents, @@ -167,7 +171,8 @@ class WebContentsView : public RenderViewHostDelegate::View { // We implement these functions on RenderViewHostDelegate::View directly and // do some book-keeping associated with the request. The request is then // forwarded to *Internal which does platform-specific work. - virtual void CreateNewWindow(int route_id, HANDLE modal_dialog_event); + virtual void CreateNewWindow(int route_id, + base::WaitableEvent* modal_dialog_event); virtual void CreateNewWidget(int route_id, bool activatable); virtual void ShowCreatedWindow(int route_id, WindowOpenDisposition disposition, diff --git a/chrome/browser/tab_contents/web_contents_view_win.cc b/chrome/browser/tab_contents/web_contents_view_win.cc index ab244cc..29af1f6 100644 --- a/chrome/browser/tab_contents/web_contents_view_win.cc +++ b/chrome/browser/tab_contents/web_contents_view_win.cc @@ -326,7 +326,7 @@ void WebContentsViewWin::ShowContextMenu( WebContents* WebContentsViewWin::CreateNewWindowInternal( int route_id, - HANDLE modal_dialog_event) { + base::WaitableEvent* modal_dialog_event) { // Create the new web contents. This will automatically create the new // WebContentsView. In the future, we may want to create the view separately. WebContents* new_contents = diff --git a/chrome/browser/tab_contents/web_contents_view_win.h b/chrome/browser/tab_contents/web_contents_view_win.h index 137674a..a94b601 100644 --- a/chrome/browser/tab_contents/web_contents_view_win.h +++ b/chrome/browser/tab_contents/web_contents_view_win.h @@ -48,7 +48,7 @@ class WebContentsViewWin : public WebContentsView, // Backend implementation of RenderViewHostDelegate::View. virtual WebContents* CreateNewWindowInternal( - int route_id, HANDLE modal_dialog_event); + int route_id, base::WaitableEvent* modal_dialog_event); virtual RenderWidgetHostView* CreateNewWidgetInternal(int route_id, bool activatable); virtual void ShowCreatedWindowInternal(WebContents* new_web_contents, |