OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/guest_view/guest_view_base.h" | 5 #include "chrome/browser/guest_view/guest_view_base.h" |
6 | 6 |
7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "chrome/browser/guest_view/ad_view/ad_view_guest.h" | 8 #include "chrome/browser/guest_view/ad_view/ad_view_guest.h" |
9 #include "chrome/browser/guest_view/guest_view_constants.h" | 9 #include "chrome/browser/guest_view/guest_view_constants.h" |
10 #include "chrome/browser/guest_view/guest_view_manager.h" | 10 #include "chrome/browser/guest_view/guest_view_manager.h" |
(...skipping 22 matching lines...) Expand all Loading... | |
33 } | 33 } |
34 | 34 |
35 GuestViewBase::Event::~Event() { | 35 GuestViewBase::Event::~Event() { |
36 } | 36 } |
37 | 37 |
38 scoped_ptr<base::DictionaryValue> GuestViewBase::Event::GetArguments() { | 38 scoped_ptr<base::DictionaryValue> GuestViewBase::Event::GetArguments() { |
39 return args_.Pass(); | 39 return args_.Pass(); |
40 } | 40 } |
41 | 41 |
42 GuestViewBase::GuestViewBase(WebContents* guest_web_contents, | 42 GuestViewBase::GuestViewBase(WebContents* guest_web_contents, |
43 const std::string& embedder_extension_id, | 43 const std::string& embedder_extension_id) |
44 const base::WeakPtr<GuestViewBase>& opener) | |
45 : guest_web_contents_(guest_web_contents), | 44 : guest_web_contents_(guest_web_contents), |
46 embedder_web_contents_(NULL), | 45 embedder_web_contents_(NULL), |
47 embedder_extension_id_(embedder_extension_id), | 46 embedder_extension_id_(embedder_extension_id), |
48 embedder_render_process_id_(0), | 47 embedder_render_process_id_(0), |
49 browser_context_(guest_web_contents->GetBrowserContext()), | 48 browser_context_(guest_web_contents->GetBrowserContext()), |
50 guest_instance_id_(guest_web_contents->GetEmbeddedInstanceID()), | 49 guest_instance_id_(guest_web_contents->GetEmbeddedInstanceID()), |
51 view_instance_id_(guestview::kInstanceIDNone), | 50 view_instance_id_(guestview::kInstanceIDNone), |
52 opener_(opener), | |
53 weak_ptr_factory_(this) { | 51 weak_ptr_factory_(this) { |
54 webcontents_guestview_map.Get().insert( | 52 webcontents_guestview_map.Get().insert( |
55 std::make_pair(guest_web_contents, this)); | 53 std::make_pair(guest_web_contents, this)); |
56 GuestViewManager::FromBrowserContext(browser_context_)-> | 54 GuestViewManager::FromBrowserContext(browser_context_)-> |
57 AddGuest(guest_instance_id_, guest_web_contents); | 55 AddGuest(guest_instance_id_, guest_web_contents); |
58 } | 56 } |
59 | 57 |
60 // static | 58 // static |
61 GuestViewBase* GuestViewBase::Create( | 59 GuestViewBase* GuestViewBase::Create( |
62 WebContents* guest_web_contents, | 60 WebContents* guest_web_contents, |
63 const std::string& embedder_extension_id, | 61 const std::string& embedder_extension_id, |
64 const std::string& view_type, | 62 const std::string& view_type) { |
65 const base::WeakPtr<GuestViewBase>& opener) { | |
66 if (view_type == "webview") { | 63 if (view_type == "webview") { |
67 return new WebViewGuest(guest_web_contents, embedder_extension_id, opener); | 64 return new WebViewGuest(guest_web_contents, embedder_extension_id); |
68 } else if (view_type == "adview") { | 65 } else if (view_type == "adview") { |
69 return new AdViewGuest(guest_web_contents, embedder_extension_id); | 66 return new AdViewGuest(guest_web_contents, embedder_extension_id); |
70 } | 67 } |
71 NOTREACHED(); | 68 NOTREACHED(); |
72 return NULL; | 69 return NULL; |
73 } | 70 } |
74 | 71 |
75 // static | 72 // static |
76 GuestViewBase* GuestViewBase::FromWebContents(WebContents* web_contents) { | 73 GuestViewBase* GuestViewBase::FromWebContents(WebContents* web_contents) { |
77 WebContentsGuestViewMap* guest_map = webcontents_guestview_map.Pointer(); | 74 WebContentsGuestViewMap* guest_map = webcontents_guestview_map.Pointer(); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
141 base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() { | 138 base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() { |
142 return weak_ptr_factory_.GetWeakPtr(); | 139 return weak_ptr_factory_.GetWeakPtr(); |
143 } | 140 } |
144 | 141 |
145 void GuestViewBase::Attach(content::WebContents* embedder_web_contents, | 142 void GuestViewBase::Attach(content::WebContents* embedder_web_contents, |
146 const base::DictionaryValue& args) { | 143 const base::DictionaryValue& args) { |
147 embedder_web_contents_ = embedder_web_contents; | 144 embedder_web_contents_ = embedder_web_contents; |
148 embedder_render_process_id_ = | 145 embedder_render_process_id_ = |
149 embedder_web_contents->GetRenderProcessHost()->GetID(); | 146 embedder_web_contents->GetRenderProcessHost()->GetID(); |
150 args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); | 147 args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); |
151 | 148 extra_params_.reset(args.DeepCopy()); |
152 std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_); | |
153 | 149 |
154 // GuestViewBase::Attach is called prior to initialization (and initial | 150 // GuestViewBase::Attach is called prior to initialization (and initial |
155 // navigation) of the guest in the content layer in order to permit mapping | 151 // navigation) of the guest in the content layer in order to permit mapping |
156 // the necessary associations between the <*view> element and its guest. This | 152 // the necessary associations between the <*view> element and its guest. This |
157 // is needed by the <webview> WebRequest API to allow intercepting resource | 153 // is needed by the <webview> WebRequest API to allow intercepting resource |
158 // requests during navigation. However, queued events should be fired after | 154 // requests during navigation. However, queued events should be fired after |
159 // content layer initialization in order to ensure that load events (such as | 155 // content layer initialization in order to ensure that load events (such as |
160 // 'loadstop') fire in embedder after the contentWindow is available. | 156 // 'loadstop') fire in embedder after the contentWindow is available. |
161 if (!in_extension()) | 157 if (!in_extension()) |
162 return; | 158 return; |
163 | 159 |
164 base::MessageLoop::current()->PostTask( | 160 base::MessageLoop::current()->PostTask( |
165 FROM_HERE, | 161 FROM_HERE, |
166 base::Bind(&GuestViewBase::SendQueuedEvents, | 162 base::Bind(&GuestViewBase::SendQueuedEvents, |
167 weak_ptr_factory_.GetWeakPtr())); | 163 weak_ptr_factory_.GetWeakPtr())); |
168 } | 164 } |
169 | 165 |
170 WebContents* GuestViewBase::GetOpener() const { | 166 void GuestViewBase::Destroy() { |
171 if (!opener_) | 167 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.
| |
172 return NULL; | 168 delete guest_web_contents(); |
173 return opener_->guest_web_contents(); | |
174 } | 169 } |
175 | 170 |
176 void GuestViewBase::SetOpener(WebContents* web_contents) { | 171 |
177 GuestViewBase* guest = FromWebContents(web_contents); | 172 void GuestViewBase::SetOpener(GuestViewBase* guest) { |
178 if (guest && guest->IsViewType(GetViewType())) { | 173 if (guest && guest->IsViewType(GetViewType())) { |
179 opener_ = guest->AsWeakPtr(); | 174 opener_ = guest->AsWeakPtr(); |
180 return; | 175 return; |
181 } | 176 } |
182 opener_ = base::WeakPtr<GuestViewBase>(); | 177 opener_ = base::WeakPtr<GuestViewBase>(); |
183 } | 178 } |
184 | 179 |
180 void GuestViewBase::RegisterDestructionCallback( | |
181 const DestructionCallback& callback) { | |
182 destruction_callback_ = callback; | |
183 } | |
184 | |
185 GuestViewBase::~GuestViewBase() { | 185 GuestViewBase::~GuestViewBase() { |
186 std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_); | 186 std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_); |
187 | 187 |
188 webcontents_guestview_map.Get().erase(guest_web_contents()); | 188 webcontents_guestview_map.Get().erase(guest_web_contents()); |
189 | 189 |
190 GuestViewManager::FromBrowserContext(browser_context_)-> | 190 GuestViewManager::FromBrowserContext(browser_context_)-> |
191 RemoveGuest(guest_instance_id_); | 191 RemoveGuest(guest_instance_id_); |
192 | 192 |
193 pending_events_.clear(); | 193 pending_events_.clear(); |
194 } | 194 } |
(...skipping 24 matching lines...) Expand all Loading... | |
219 embedder_extension_id_, | 219 embedder_extension_id_, |
220 event->name(), | 220 event->name(), |
221 args.Pass(), | 221 args.Pass(), |
222 extensions::EventRouter::USER_GESTURE_UNKNOWN, | 222 extensions::EventRouter::USER_GESTURE_UNKNOWN, |
223 info); | 223 info); |
224 } | 224 } |
225 | 225 |
226 void GuestViewBase::SendQueuedEvents() { | 226 void GuestViewBase::SendQueuedEvents() { |
227 if (!attached()) | 227 if (!attached()) |
228 return; | 228 return; |
229 | |
230 while (!pending_events_.empty()) { | 229 while (!pending_events_.empty()) { |
231 linked_ptr<Event> event_ptr = pending_events_.front(); | 230 linked_ptr<Event> event_ptr = pending_events_.front(); |
232 pending_events_.pop_front(); | 231 pending_events_.pop_front(); |
233 DispatchEvent(event_ptr.release()); | 232 DispatchEvent(event_ptr.release()); |
234 } | 233 } |
235 } | 234 } |
OLD | NEW |