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 21 matching lines...) Expand all Loading... |
32 : name_(name), args_(args.Pass()) { | 32 : name_(name), args_(args.Pass()) { |
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(int guest_instance_id, |
43 const std::string& embedder_extension_id, | 43 WebContents* guest_web_contents, |
44 const base::WeakPtr<GuestViewBase>& opener) | 44 const std::string& embedder_extension_id) |
45 : guest_web_contents_(guest_web_contents), | 45 : guest_web_contents_(guest_web_contents), |
46 embedder_web_contents_(NULL), | 46 embedder_web_contents_(NULL), |
47 embedder_extension_id_(embedder_extension_id), | 47 embedder_extension_id_(embedder_extension_id), |
48 embedder_render_process_id_(0), | 48 embedder_render_process_id_(0), |
49 browser_context_(guest_web_contents->GetBrowserContext()), | 49 browser_context_(guest_web_contents->GetBrowserContext()), |
50 guest_instance_id_(guest_web_contents->GetEmbeddedInstanceID()), | 50 guest_instance_id_(guest_instance_id), |
51 view_instance_id_(guestview::kInstanceIDNone), | 51 view_instance_id_(guestview::kInstanceIDNone), |
52 opener_(opener), | |
53 weak_ptr_factory_(this) { | 52 weak_ptr_factory_(this) { |
54 webcontents_guestview_map.Get().insert( | 53 webcontents_guestview_map.Get().insert( |
55 std::make_pair(guest_web_contents, this)); | 54 std::make_pair(guest_web_contents, this)); |
56 GuestViewManager::FromBrowserContext(browser_context_)-> | 55 GuestViewManager::FromBrowserContext(browser_context_)-> |
57 AddGuest(guest_instance_id_, guest_web_contents); | 56 AddGuest(guest_instance_id_, guest_web_contents); |
58 } | 57 } |
59 | 58 |
60 // static | 59 // static |
61 GuestViewBase* GuestViewBase::Create( | 60 GuestViewBase* GuestViewBase::Create( |
| 61 int guest_instance_id, |
62 WebContents* guest_web_contents, | 62 WebContents* guest_web_contents, |
63 const std::string& embedder_extension_id, | 63 const std::string& embedder_extension_id, |
64 const std::string& view_type, | 64 const std::string& view_type) { |
65 const base::WeakPtr<GuestViewBase>& opener) { | |
66 if (view_type == "webview") { | 65 if (view_type == "webview") { |
67 return new WebViewGuest(guest_web_contents, embedder_extension_id, opener); | 66 return new WebViewGuest(guest_instance_id, |
| 67 guest_web_contents, |
| 68 embedder_extension_id); |
68 } else if (view_type == "adview") { | 69 } else if (view_type == "adview") { |
69 return new AdViewGuest(guest_web_contents, embedder_extension_id); | 70 return new AdViewGuest(guest_instance_id, |
| 71 guest_web_contents, |
| 72 embedder_extension_id); |
70 } | 73 } |
71 NOTREACHED(); | 74 NOTREACHED(); |
72 return NULL; | 75 return NULL; |
73 } | 76 } |
74 | 77 |
75 // static | 78 // static |
76 GuestViewBase* GuestViewBase::FromWebContents(WebContents* web_contents) { | 79 GuestViewBase* GuestViewBase::FromWebContents(WebContents* web_contents) { |
77 WebContentsGuestViewMap* guest_map = webcontents_guestview_map.Pointer(); | 80 WebContentsGuestViewMap* guest_map = webcontents_guestview_map.Pointer(); |
78 WebContentsGuestViewMap::iterator it = guest_map->find(web_contents); | 81 WebContentsGuestViewMap::iterator it = guest_map->find(web_contents); |
79 return it == guest_map->end() ? NULL : it->second; | 82 return it == guest_map->end() ? NULL : it->second; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() { | 144 base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() { |
142 return weak_ptr_factory_.GetWeakPtr(); | 145 return weak_ptr_factory_.GetWeakPtr(); |
143 } | 146 } |
144 | 147 |
145 void GuestViewBase::Attach(content::WebContents* embedder_web_contents, | 148 void GuestViewBase::Attach(content::WebContents* embedder_web_contents, |
146 const base::DictionaryValue& args) { | 149 const base::DictionaryValue& args) { |
147 embedder_web_contents_ = embedder_web_contents; | 150 embedder_web_contents_ = embedder_web_contents; |
148 embedder_render_process_id_ = | 151 embedder_render_process_id_ = |
149 embedder_web_contents->GetRenderProcessHost()->GetID(); | 152 embedder_web_contents->GetRenderProcessHost()->GetID(); |
150 args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); | 153 args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); |
151 | 154 extra_params_.reset(args.DeepCopy()); |
152 std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_); | |
153 | 155 |
154 // GuestViewBase::Attach is called prior to initialization (and initial | 156 // GuestViewBase::Attach is called prior to initialization (and initial |
155 // navigation) of the guest in the content layer in order to permit mapping | 157 // 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 | 158 // the necessary associations between the <*view> element and its guest. This |
157 // is needed by the <webview> WebRequest API to allow intercepting resource | 159 // is needed by the <webview> WebRequest API to allow intercepting resource |
158 // requests during navigation. However, queued events should be fired after | 160 // requests during navigation. However, queued events should be fired after |
159 // content layer initialization in order to ensure that load events (such as | 161 // content layer initialization in order to ensure that load events (such as |
160 // 'loadstop') fire in embedder after the contentWindow is available. | 162 // 'loadstop') fire in embedder after the contentWindow is available. |
161 if (!in_extension()) | 163 if (!in_extension()) |
162 return; | 164 return; |
163 | 165 |
164 base::MessageLoop::current()->PostTask( | 166 base::MessageLoop::current()->PostTask( |
165 FROM_HERE, | 167 FROM_HERE, |
166 base::Bind(&GuestViewBase::SendQueuedEvents, | 168 base::Bind(&GuestViewBase::SendQueuedEvents, |
167 weak_ptr_factory_.GetWeakPtr())); | 169 weak_ptr_factory_.GetWeakPtr())); |
168 } | 170 } |
169 | 171 |
170 WebContents* GuestViewBase::GetOpener() const { | 172 void GuestViewBase::Destroy() { |
171 if (!opener_) | 173 if (!destruction_callback_.is_null()) |
172 return NULL; | 174 destruction_callback_.Run(guest_web_contents()); |
173 return opener_->guest_web_contents(); | 175 delete guest_web_contents(); |
174 } | 176 } |
175 | 177 |
176 void GuestViewBase::SetOpener(WebContents* web_contents) { | 178 |
177 GuestViewBase* guest = FromWebContents(web_contents); | 179 void GuestViewBase::SetOpener(GuestViewBase* guest) { |
178 if (guest && guest->IsViewType(GetViewType())) { | 180 if (guest && guest->IsViewType(GetViewType())) { |
179 opener_ = guest->AsWeakPtr(); | 181 opener_ = guest->AsWeakPtr(); |
180 return; | 182 return; |
181 } | 183 } |
182 opener_ = base::WeakPtr<GuestViewBase>(); | 184 opener_ = base::WeakPtr<GuestViewBase>(); |
183 } | 185 } |
184 | 186 |
| 187 void GuestViewBase::RegisterDestructionCallback( |
| 188 const DestructionCallback& callback) { |
| 189 destruction_callback_ = callback; |
| 190 } |
| 191 |
185 GuestViewBase::~GuestViewBase() { | 192 GuestViewBase::~GuestViewBase() { |
186 std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_); | 193 std::pair<int, int> key(embedder_render_process_id_, guest_instance_id_); |
187 | 194 |
188 webcontents_guestview_map.Get().erase(guest_web_contents()); | 195 webcontents_guestview_map.Get().erase(guest_web_contents()); |
189 | 196 |
190 GuestViewManager::FromBrowserContext(browser_context_)-> | 197 GuestViewManager::FromBrowserContext(browser_context_)-> |
191 RemoveGuest(guest_instance_id_); | 198 RemoveGuest(guest_instance_id_); |
192 | 199 |
193 pending_events_.clear(); | 200 pending_events_.clear(); |
194 } | 201 } |
(...skipping 24 matching lines...) Expand all Loading... |
219 embedder_extension_id_, | 226 embedder_extension_id_, |
220 event->name(), | 227 event->name(), |
221 args.Pass(), | 228 args.Pass(), |
222 extensions::EventRouter::USER_GESTURE_UNKNOWN, | 229 extensions::EventRouter::USER_GESTURE_UNKNOWN, |
223 info); | 230 info); |
224 } | 231 } |
225 | 232 |
226 void GuestViewBase::SendQueuedEvents() { | 233 void GuestViewBase::SendQueuedEvents() { |
227 if (!attached()) | 234 if (!attached()) |
228 return; | 235 return; |
229 | |
230 while (!pending_events_.empty()) { | 236 while (!pending_events_.empty()) { |
231 linked_ptr<Event> event_ptr = pending_events_.front(); | 237 linked_ptr<Event> event_ptr = pending_events_.front(); |
232 pending_events_.pop_front(); | 238 pending_events_.pop_front(); |
233 DispatchEvent(event_ptr.release()); | 239 DispatchEvent(event_ptr.release()); |
234 } | 240 } |
235 } | 241 } |
OLD | NEW |