From a80fe40f562a2243f34d5514117c018c4c835441 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 4 Apr 2014 22:04:42 +0800 Subject: [PATCH] Synchronous event should be bound to WebContents. This allows us to reply to synchronous message for arbitrary WebContents. --- atom/browser/api/atom_api_event.cc | 11 +++++---- atom/browser/api/atom_api_event.h | 16 ++++++-------- atom/browser/api/atom_browser_bindings.cc | 2 +- atom/browser/api/atom_browser_bindings.h | 8 ++++--- atom/browser/native_window.cc | 27 ++++++++++++++--------- atom/browser/native_window.h | 10 ++++----- 6 files changed, 39 insertions(+), 35 deletions(-) diff --git a/atom/browser/api/atom_api_event.cc b/atom/browser/api/atom_api_event.cc index ec074bb28c51..b1f14066770f 100644 --- a/atom/browser/api/atom_api_event.cc +++ b/atom/browser/api/atom_api_event.cc @@ -4,10 +4,10 @@ #include "atom/browser/api/atom_api_event.h" -#include "atom/browser/native_window.h" #include "atom/common/api/api_messages.h" #include "atom/common/v8/node_common.h" #include "atom/common/v8/native_type_conversions.h" +#include "content/public/browser/web_contents.h" namespace atom { @@ -22,8 +22,6 @@ Event::Event() } Event::~Event() { - if (sender_ != NULL) - sender_->RemoveObserver(this); } // static @@ -44,16 +42,17 @@ v8::Handle Event::CreateV8Object() { return t->NewInstance(0, NULL); } -void Event::SetSenderAndMessage(NativeWindow* sender, IPC::Message* message) { +void Event::SetSenderAndMessage(content::WebContents* sender, + IPC::Message* message) { DCHECK(!sender_); DCHECK(!message_); sender_ = sender; message_ = message; - sender_->AddObserver(this); + Observe(sender); } -void Event::OnWindowClosed() { +void Event::WebContentsDestroyed(content::WebContents* web_contents) { sender_ = NULL; message_ = NULL; } diff --git a/atom/browser/api/atom_api_event.h b/atom/browser/api/atom_api_event.h index 315b39539200..1bbcb4a2df08 100644 --- a/atom/browser/api/atom_api_event.h +++ b/atom/browser/api/atom_api_event.h @@ -5,11 +5,11 @@ #ifndef ATOM_BROWSER_API_ATOM_API_EVENT_H_ #define ATOM_BROWSER_API_ATOM_API_EVENT_H_ +#include "atom/common/v8/scoped_persistent.h" #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/strings/string16.h" -#include "atom/browser/native_window_observer.h" -#include "atom/common/v8/scoped_persistent.h" +#include "content/public/browser/web_contents_observer.h" #include "vendor/node/src/node_object_wrap.h" namespace IPC { @@ -18,12 +18,10 @@ class Message; namespace atom { -class NativeWindow; - namespace api { class Event : public node::ObjectWrap, - public NativeWindowObserver { + public content::WebContentsObserver { public: virtual ~Event(); @@ -31,7 +29,7 @@ class Event : public node::ObjectWrap, static v8::Handle CreateV8Object(); // Pass the sender and message to be replied. - void SetSenderAndMessage(NativeWindow* sender, IPC::Message* message); + void SetSenderAndMessage(content::WebContents* sender, IPC::Message* message); // Whether event.preventDefault() is called. bool prevent_default() const { return prevent_default_; } @@ -39,8 +37,8 @@ class Event : public node::ObjectWrap, protected: Event(); - // NativeWindowObserver implementations: - virtual void OnWindowClosed() OVERRIDE; + // content::WebContentsObserver implementations: + virtual void WebContentsDestroyed(content::WebContents*) OVERRIDE; private: static void New(const v8::FunctionCallbackInfo& args); @@ -52,7 +50,7 @@ class Event : public node::ObjectWrap, static ScopedPersistent constructor_template_; // Replyer for the synchronous messages. - NativeWindow* sender_; + content::WebContents* sender_; IPC::Message* message_; bool prevent_default_; diff --git a/atom/browser/api/atom_browser_bindings.cc b/atom/browser/api/atom_browser_bindings.cc index 825fefa6297c..94c925f8a0b7 100644 --- a/atom/browser/api/atom_browser_bindings.cc +++ b/atom/browser/api/atom_browser_bindings.cc @@ -57,7 +57,7 @@ void AtomBrowserBindings::OnRendererMessageSync( int routing_id, const string16& channel, const base::ListValue& args, - NativeWindow* sender, + content::WebContents* sender, IPC::Message* message) { v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); diff --git a/atom/browser/api/atom_browser_bindings.h b/atom/browser/api/atom_browser_bindings.h index 026cbaf40f33..e015206322a8 100644 --- a/atom/browser/api/atom_browser_bindings.h +++ b/atom/browser/api/atom_browser_bindings.h @@ -13,14 +13,16 @@ namespace base { class ListValue; } +namespace content { +class WebContents; +} + namespace IPC { class Message; } namespace atom { -class NativeWindow; - class AtomBrowserBindings : public AtomBindings { public: AtomBrowserBindings(); @@ -37,7 +39,7 @@ class AtomBrowserBindings : public AtomBindings { int routing_id, const string16& channel, const base::ListValue& args, - NativeWindow* sender, + content::WebContents* sender, IPC::Message* message); private: diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 5c50d1f75a40..6f6f163a1eac 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -8,6 +8,17 @@ #include #include +#include "atom/browser/api/atom_browser_bindings.h" +#include "atom/browser/atom_browser_context.h" +#include "atom/browser/atom_browser_main_parts.h" +#include "atom/browser/atom_javascript_dialog_manager.h" +#include "atom/browser/browser.h" +#include "atom/browser/devtools_delegate.h" +#include "atom/browser/devtools_web_contents_observer.h" +#include "atom/browser/window_list.h" +#include "atom/common/api/api_messages.h" +#include "atom/common/atom_version.h" +#include "atom/common/options_switches.h" #include "base/command_line.h" #include "base/file_util.h" #include "base/prefs/pref_service.h" @@ -15,13 +26,6 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" -#include "atom/browser/api/atom_browser_bindings.h" -#include "atom/browser/atom_browser_context.h" -#include "atom/browser/atom_browser_main_parts.h" -#include "atom/browser/atom_javascript_dialog_manager.h" -#include "atom/browser/browser.h" -#include "atom/browser/devtools_delegate.h" -#include "atom/browser/window_list.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/invalidate_type.h" #include "content/public/browser/navigation_entry.h" @@ -33,9 +37,6 @@ #include "content/public/browser/render_widget_host_view.h" #include "content/public/browser/web_contents_view.h" #include "content/public/common/renderer_preferences.h" -#include "atom/common/api/api_messages.h" -#include "atom/common/atom_version.h" -#include "atom/common/options_switches.h" #include "ipc/ipc_message_macros.h" #include "ui/gfx/codec/png_codec.h" #include "ui/gfx/point.h" @@ -194,8 +195,12 @@ bool NativeWindow::HasModalDialog() { void NativeWindow::OpenDevTools() { if (devtools_window_) { devtools_window_->Focus(true); + devtools_web_contents_observer_.reset(new DevToolsWebContentsObserver( + this, devtools_window_->GetWebContents())); } else { inspectable_web_contents()->ShowDevTools(); + devtools_web_contents_observer_.reset(new DevToolsWebContentsObserver( + this, GetDevToolsWebContents())); #if defined(OS_MACOSX) // Temporary fix for flashing devtools, try removing this after upgraded to // Chrome 32. @@ -559,7 +564,7 @@ void NativeWindow::OnRendererMessageSync(const string16& channel, GetWebContents()->GetRoutingID(), channel, args, - this, + GetWebContents(), reply_msg); } diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index c77549cb2174..3028da12d534 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -41,14 +41,11 @@ class Rect; class Size; } -namespace IPC { -class Message; -} - namespace atom { class AtomJavaScriptDialogManager; class DevToolsDelegate; +class DevToolsWebContentsObserver; struct DraggableRegion; class NativeWindow : public brightray::DefaultWebContentsDelegate, @@ -288,8 +285,11 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, base::WeakPtrFactory weak_factory_; base::WeakPtr devtools_window_; - scoped_ptr devtools_delegate_; + + // WebContentsObserver for the WebContents of devtools. + scoped_ptr devtools_web_contents_observer_; + scoped_ptr dialog_manager_; scoped_ptr inspectable_web_contents_;