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 288760855b5e064f67b123216310f84d2ddbbd15..f81727385789d2db1698dac9eac8e863e2dfc43e 100644 |
--- a/chrome/browser/guest_view/guest_view_base.cc |
+++ b/chrome/browser/guest_view/guest_view_base.cc |
@@ -40,8 +40,7 @@ scoped_ptr<base::DictionaryValue> GuestViewBase::Event::GetArguments() { |
} |
GuestViewBase::GuestViewBase(WebContents* guest_web_contents, |
- const std::string& embedder_extension_id, |
- const base::WeakPtr<GuestViewBase>& opener) |
+ const std::string& embedder_extension_id) |
: guest_web_contents_(guest_web_contents), |
embedder_web_contents_(NULL), |
embedder_extension_id_(embedder_extension_id), |
@@ -49,7 +48,6 @@ GuestViewBase::GuestViewBase(WebContents* guest_web_contents, |
browser_context_(guest_web_contents->GetBrowserContext()), |
guest_instance_id_(guest_web_contents->GetEmbeddedInstanceID()), |
view_instance_id_(guestview::kInstanceIDNone), |
- opener_(opener), |
weak_ptr_factory_(this) { |
webcontents_guestview_map.Get().insert( |
std::make_pair(guest_web_contents, this)); |
@@ -61,10 +59,9 @@ GuestViewBase::GuestViewBase(WebContents* guest_web_contents, |
GuestViewBase* GuestViewBase::Create( |
WebContents* guest_web_contents, |
const std::string& embedder_extension_id, |
- const std::string& view_type, |
- const base::WeakPtr<GuestViewBase>& opener) { |
+ const std::string& view_type) { |
if (view_type == "webview") { |
- return new WebViewGuest(guest_web_contents, embedder_extension_id, opener); |
+ return new WebViewGuest(guest_web_contents, embedder_extension_id); |
} else if (view_type == "adview") { |
return new AdViewGuest(guest_web_contents, embedder_extension_id); |
} |
@@ -148,8 +145,7 @@ void GuestViewBase::Attach(content::WebContents* embedder_web_contents, |
embedder_render_process_id_ = |
embedder_web_contents->GetRenderProcessHost()->GetID(); |
args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); |
- |
- std::pair<int, int> key(embedder_render_process_id_, guest_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 |
@@ -167,14 +163,13 @@ void GuestViewBase::Attach(content::WebContents* embedder_web_contents, |
weak_ptr_factory_.GetWeakPtr())); |
} |
-WebContents* GuestViewBase::GetOpener() const { |
- if (!opener_) |
- return NULL; |
- return opener_->guest_web_contents(); |
+void GuestViewBase::Destroy() { |
+ destruction_callback_.Run(guest_web_contents()); |
lazyboy
2014/05/12 23:00:20
Will destruction_callback_ be always set?
Prefer a
Fady Samuel
2014/05/13 18:59:02
Done.
|
+ delete guest_web_contents(); |
} |
-void GuestViewBase::SetOpener(WebContents* web_contents) { |
- GuestViewBase* guest = FromWebContents(web_contents); |
+ |
+void GuestViewBase::SetOpener(GuestViewBase* guest) { |
if (guest && guest->IsViewType(GetViewType())) { |
opener_ = guest->AsWeakPtr(); |
return; |
@@ -182,6 +177,11 @@ void GuestViewBase::SetOpener(WebContents* web_contents) { |
opener_ = base::WeakPtr<GuestViewBase>(); |
} |
+void GuestViewBase::RegisterDestructionCallback( |
+ const DestructionCallback& callback) { |
+ destruction_callback_ = callback; |
+} |
+ |
GuestViewBase::~GuestViewBase() { |
std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_); |
@@ -226,7 +226,6 @@ void GuestViewBase::DispatchEvent(Event* event) { |
void GuestViewBase::SendQueuedEvents() { |
if (!attached()) |
return; |
- |
while (!pending_events_.empty()) { |
linked_ptr<Event> event_ptr = pending_events_.front(); |
pending_events_.pop_front(); |