Index: chrome/browser/guest_view/guest_view_base.cc |
diff --git a/chrome/browser/guest_view/guest_view_base.cc b/chrome/browser/guest_view/guest_view_base.cc |
index 1c09be1cc2165918651a5bae984a929373b59af8..da82d4e3c2112dab937ee60db811114bf922aad0 100644 |
--- a/chrome/browser/guest_view/guest_view_base.cc |
+++ b/chrome/browser/guest_view/guest_view_base.cc |
@@ -66,17 +66,25 @@ class GuestViewBase::EmbedderWebContentsObserver : public WebContentsObserver { |
DISALLOW_COPY_AND_ASSIGN(EmbedderWebContentsObserver); |
}; |
-GuestViewBase::GuestViewBase(int guest_instance_id, |
- WebContents* guest_web_contents, |
- const std::string& embedder_extension_id) |
- : WebContentsObserver(guest_web_contents), |
- embedder_web_contents_(NULL), |
- embedder_extension_id_(embedder_extension_id), |
+GuestViewBase::GuestViewBase(int guest_instance_id) |
+ : embedder_web_contents_(NULL), |
embedder_render_process_id_(0), |
- browser_context_(guest_web_contents->GetBrowserContext()), |
+ browser_context_(NULL), |
guest_instance_id_(guest_instance_id), |
view_instance_id_(guestview::kInstanceIDNone), |
+ initialized_(false), |
weak_ptr_factory_(this) { |
+} |
+ |
+void GuestViewBase::Init(WebContents* guest_web_contents, |
+ const std::string& embedder_extension_id) { |
+ if (initialized_) |
+ return; |
+ initialized_ = true; |
+ browser_context_ = guest_web_contents->GetBrowserContext(); |
+ embedder_extension_id_ = embedder_extension_id; |
+ |
+ WebContentsObserver::Observe(guest_web_contents); |
guest_web_contents->SetDelegate(this); |
webcontents_guestview_map.Get().insert( |
std::make_pair(guest_web_contents, this)); |
@@ -155,32 +163,6 @@ bool GuestViewBase::IsDragAndDropEnabled() const { |
return false; |
} |
-void GuestViewBase::Attach(content::WebContents* embedder_web_contents, |
- const base::DictionaryValue& args) { |
- embedder_web_contents_ = embedder_web_contents; |
- embedder_web_contents_observer_.reset( |
- new EmbedderWebContentsObserver(this)); |
- embedder_render_process_id_ = |
- embedder_web_contents->GetRenderProcessHost()->GetID(); |
- args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); |
- extra_params_.reset(args.DeepCopy()); |
- |
- // GuestViewBase::Attach is called prior to initialization (and initial |
- // navigation) of the guest in the content layer in order to permit mapping |
- // the necessary associations between the <*view> element and its guest. This |
- // is needed by the <webview> WebRequest API to allow intercepting resource |
- // requests during navigation. However, queued events should be fired after |
- // content layer initialization in order to ensure that load events (such as |
- // 'loadstop') fire in embedder after the contentWindow is available. |
- if (!in_extension()) |
- return; |
- |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&GuestViewBase::SendQueuedEvents, |
- weak_ptr_factory_.GetWeakPtr())); |
-} |
- |
void GuestViewBase::Destroy() { |
WillDestroy(); |
if (!destruction_callback_.is_null()) |
@@ -188,6 +170,12 @@ void GuestViewBase::Destroy() { |
delete guest_web_contents(); |
} |
+void GuestViewBase::DidAttach() { |
+ // Give the derived class an opportunity to perform some actions. |
+ DidAttachToEmbedder(); |
+ |
+ SendQueuedEvents(); |
+} |
void GuestViewBase::SetOpener(GuestViewBase* guest) { |
if (guest && guest->IsViewType(GetViewType())) { |
@@ -202,6 +190,19 @@ void GuestViewBase::RegisterDestructionCallback( |
destruction_callback_ = callback; |
} |
+void GuestViewBase::WillAttach(content::WebContents* embedder_web_contents, |
+ const base::DictionaryValue& extra_params) { |
+ embedder_web_contents_ = embedder_web_contents; |
+ embedder_web_contents_observer_.reset( |
+ new EmbedderWebContentsObserver(this)); |
+ embedder_render_process_id_ = |
+ embedder_web_contents->GetRenderProcessHost()->GetID(); |
+ extra_params.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); |
+ extra_params_.reset(extra_params.DeepCopy()); |
+ |
+ WillAttachToEmbedder(); |
+} |
+ |
void GuestViewBase::DidStopLoading(content::RenderViewHost* render_view_host) { |
if (!IsDragAndDropEnabled()) { |
const char script[] = "window.addEventListener('dragstart', function() { " |