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 a6ea195dd6c32a5e0b2e8a4c9d60affc8fefaf3d..6c8064c66dba3458ddd07cf1a44848a33cd8a51d 100644 |
--- a/chrome/browser/guest_view/guest_view_base.cc |
+++ b/chrome/browser/guest_view/guest_view_base.cc |
@@ -44,7 +44,8 @@ scoped_ptr<base::DictionaryValue> GuestViewBase::Event::GetArguments() { |
} |
GuestViewBase::GuestViewBase(WebContents* guest_web_contents, |
- const std::string& embedder_extension_id) |
+ const std::string& embedder_extension_id, |
+ const base::WeakPtr<GuestViewBase>& opener) |
: guest_web_contents_(guest_web_contents), |
embedder_web_contents_(NULL), |
embedder_extension_id_(embedder_extension_id), |
@@ -52,17 +53,20 @@ 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)); |
} |
// static |
-GuestViewBase* GuestViewBase::Create(WebContents* guest_web_contents, |
- const std::string& embedder_extension_id, |
- const std::string& view_type) { |
+GuestViewBase* GuestViewBase::Create( |
+ WebContents* guest_web_contents, |
+ const std::string& embedder_extension_id, |
+ const std::string& view_type, |
+ const base::WeakPtr<GuestViewBase>& opener) { |
if (view_type == "webview") { |
- return new WebViewGuest(guest_web_contents, embedder_extension_id); |
+ return new WebViewGuest(guest_web_contents, embedder_extension_id, opener); |
} else if (view_type == "adview") { |
return new AdViewGuest(guest_web_contents, embedder_extension_id); |
} |
@@ -128,6 +132,10 @@ void GuestViewBase::GetDefaultContentSettingRules( |
incognito)); |
} |
+base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() { |
+ return weak_ptr_factory_.GetWeakPtr(); |
+} |
+ |
void GuestViewBase::Attach(content::WebContents* embedder_web_contents, |
const base::DictionaryValue& args) { |
embedder_web_contents_ = embedder_web_contents; |
@@ -154,6 +162,21 @@ 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::SetOpener(WebContents* web_contents) { |
+ GuestViewBase* guest = FromWebContents(web_contents); |
+ if (guest) { |
+ opener_ = guest->AsWeakPtr(); |
+ return; |
+ } |
+ opener_ = base::WeakPtr<GuestViewBase>(); |
+} |
+ |
GuestViewBase::~GuestViewBase() { |
std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_); |
embedder_guestview_map.Get().erase(key); |