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 "extensions/browser/guest_view/guest_view_manager.h" | 5 #include "extensions/browser/guest_view/guest_view_manager.h" |
6 | 6 |
7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
8 #include "content/public/browser/browser_context.h" | 8 #include "content/public/browser/browser_context.h" |
9 #include "content/public/browser/render_frame_host.h" | 9 #include "content/public/browser/render_frame_host.h" |
10 #include "content/public/browser/render_process_host.h" | 10 #include "content/public/browser/render_process_host.h" |
11 #include "content/public/browser/render_view_host.h" | 11 #include "content/public/browser/render_view_host.h" |
12 #include "content/public/browser/user_metrics.h" | 12 #include "content/public/browser/user_metrics.h" |
13 #include "content/public/browser/web_contents_observer.h" | 13 #include "content/public/browser/web_contents_observer.h" |
14 #include "content/public/common/child_process_host.h" | 14 #include "content/public/common/child_process_host.h" |
15 #include "content/public/common/result_codes.h" | 15 #include "content/public/common/result_codes.h" |
16 #include "content/public/common/url_constants.h" | 16 #include "content/public/common/url_constants.h" |
17 #include "extensions/browser/guest_view/app_view/app_view_guest.h" | |
18 #include "extensions/browser/guest_view/extension_options/extension_options_gues
t.h" | |
19 #include "extensions/browser/guest_view/extension_view/extension_view_guest.h" | |
20 #include "extensions/browser/guest_view/guest_view_base.h" | 17 #include "extensions/browser/guest_view/guest_view_base.h" |
| 18 #include "extensions/browser/guest_view/guest_view_manager_delegate.h" |
21 #include "extensions/browser/guest_view/guest_view_manager_factory.h" | 19 #include "extensions/browser/guest_view/guest_view_manager_factory.h" |
22 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_gues
t.h" | |
23 #include "extensions/browser/guest_view/surface_worker/surface_worker_guest.h" | |
24 #include "extensions/browser/guest_view/web_view/web_view_guest.h" | |
25 #include "extensions/browser/process_manager.h" | |
26 #include "extensions/browser/process_map.h" | |
27 #include "extensions/common/features/feature.h" | |
28 #include "extensions/common/features/feature_provider.h" | |
29 #include "extensions/common/guest_view/guest_view_constants.h" | 20 #include "extensions/common/guest_view/guest_view_constants.h" |
30 #include "net/base/escape.h" | 21 #include "net/base/escape.h" |
31 #include "url/gurl.h" | 22 #include "url/gurl.h" |
32 | 23 |
33 using content::BrowserContext; | 24 using content::BrowserContext; |
34 using content::SiteInstance; | 25 using content::SiteInstance; |
35 using content::WebContents; | 26 using content::WebContents; |
| 27 using guestview::GuestViewManagerDelegate; |
36 | 28 |
37 namespace extensions { | 29 namespace extensions { |
38 | 30 |
39 // static | 31 // static |
40 GuestViewManagerFactory* GuestViewManager::factory_ = nullptr; | 32 GuestViewManagerFactory* GuestViewManager::factory_ = nullptr; |
41 | 33 |
42 GuestViewManager::GuestViewManager(content::BrowserContext* context) | 34 GuestViewManager::GuestViewManager( |
43 : current_instance_id_(0), last_instance_id_removed_(0), context_(context) { | 35 content::BrowserContext* context, |
| 36 scoped_ptr<GuestViewManagerDelegate> delegate) |
| 37 : current_instance_id_(0), |
| 38 last_instance_id_removed_(0), |
| 39 context_(context), |
| 40 delegate_(delegate.Pass()) { |
44 } | 41 } |
45 | 42 |
46 GuestViewManager::~GuestViewManager() {} | 43 GuestViewManager::~GuestViewManager() {} |
47 | 44 |
48 // static | 45 // static |
49 GuestViewManager* GuestViewManager::FromBrowserContext( | 46 GuestViewManager* GuestViewManager::CreateWithDelegate( |
50 BrowserContext* context) { | 47 BrowserContext* context, |
51 GuestViewManager* guest_manager = | 48 scoped_ptr<GuestViewManagerDelegate> delegate) { |
52 static_cast<GuestViewManager*>(context->GetUserData( | 49 GuestViewManager* guest_manager = FromBrowserContext(context); |
53 guestview::kGuestViewManagerKeyName)); | |
54 if (!guest_manager) { | 50 if (!guest_manager) { |
55 if (factory_) { | 51 if (factory_) { |
56 guest_manager = factory_->CreateGuestViewManager(context); | 52 guest_manager = |
| 53 factory_->CreateGuestViewManager(context, delegate.Pass()); |
57 } else { | 54 } else { |
58 guest_manager = new GuestViewManager(context); | 55 guest_manager = new GuestViewManager(context, delegate.Pass()); |
59 } | 56 } |
60 context->SetUserData(guestview::kGuestViewManagerKeyName, guest_manager); | 57 context->SetUserData(guestview::kGuestViewManagerKeyName, guest_manager); |
61 } | 58 } |
62 return guest_manager; | 59 return guest_manager; |
63 } | 60 } |
64 | 61 |
65 // static | 62 // static |
66 GuestViewManager* GuestViewManager::FromBrowserContextIfAvailable( | 63 GuestViewManager* GuestViewManager::FromBrowserContext( |
67 BrowserContext* context) { | 64 BrowserContext* context) { |
68 return static_cast<GuestViewManager*>(context->GetUserData( | 65 return static_cast<GuestViewManager*>(context->GetUserData( |
69 guestview::kGuestViewManagerKeyName)); | 66 guestview::kGuestViewManagerKeyName)); |
70 } | 67 } |
71 | 68 |
72 content::WebContents* GuestViewManager::GetGuestByInstanceIDSafely( | 69 content::WebContents* GuestViewManager::GetGuestByInstanceIDSafely( |
73 int guest_instance_id, | 70 int guest_instance_id, |
74 int embedder_render_process_id) { | 71 int embedder_render_process_id) { |
75 if (!CanEmbedderAccessInstanceIDMaybeKill(embedder_render_process_id, | 72 if (!CanEmbedderAccessInstanceIDMaybeKill(embedder_render_process_id, |
76 guest_instance_id)) { | 73 guest_instance_id)) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 | 112 |
116 const ElementInstanceKey& key = reverse_it->second; | 113 const ElementInstanceKey& key = reverse_it->second; |
117 | 114 |
118 auto it = instance_id_map_.find(key); | 115 auto it = instance_id_map_.find(key); |
119 DCHECK(it != instance_id_map_.end()); | 116 DCHECK(it != instance_id_map_.end()); |
120 | 117 |
121 reverse_instance_id_map_.erase(reverse_it); | 118 reverse_instance_id_map_.erase(reverse_it); |
122 instance_id_map_.erase(it); | 119 instance_id_map_.erase(it); |
123 } | 120 } |
124 | 121 |
| 122 bool GuestViewManager::IsOwnedByExtension(GuestViewBase* guest) { |
| 123 return delegate_->IsOwnedByExtension(guest); |
| 124 } |
| 125 |
125 int GuestViewManager::GetNextInstanceID() { | 126 int GuestViewManager::GetNextInstanceID() { |
126 return ++current_instance_id_; | 127 return ++current_instance_id_; |
127 } | 128 } |
128 | 129 |
129 void GuestViewManager::CreateGuest(const std::string& view_type, | 130 void GuestViewManager::CreateGuest(const std::string& view_type, |
130 content::WebContents* owner_web_contents, | 131 content::WebContents* owner_web_contents, |
131 const base::DictionaryValue& create_params, | 132 const base::DictionaryValue& create_params, |
132 const WebContentsCreatedCallback& callback) { | 133 const WebContentsCreatedCallback& callback) { |
133 GuestViewBase* guest = CreateGuestInternal(owner_web_contents, view_type); | 134 GuestViewBase* guest = CreateGuestInternal(owner_web_contents, view_type); |
134 if (!guest) { | 135 if (!guest) { |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 | 254 |
254 auto it = guest_view_registry_.find(view_type); | 255 auto it = guest_view_registry_.find(view_type); |
255 if (it == guest_view_registry_.end()) { | 256 if (it == guest_view_registry_.end()) { |
256 NOTREACHED(); | 257 NOTREACHED(); |
257 return nullptr; | 258 return nullptr; |
258 } | 259 } |
259 | 260 |
260 return it->second.Run(owner_web_contents); | 261 return it->second.Run(owner_web_contents); |
261 } | 262 } |
262 | 263 |
263 // static | |
264 void GuestViewManager::RegisterGuestViewTypes() { | 264 void GuestViewManager::RegisterGuestViewTypes() { |
265 RegisterGuestViewType<AppViewGuest>(); | 265 delegate_->RegisterAdditionalGuestViewTypes(); |
266 RegisterGuestViewType<ExtensionOptionsGuest>(); | |
267 RegisterGuestViewType<ExtensionViewGuest>(); | |
268 RegisterGuestViewType<MimeHandlerViewGuest>(); | |
269 RegisterGuestViewType<SurfaceWorkerGuest>(); | |
270 RegisterGuestViewType<WebViewGuest>(); | |
271 } | 266 } |
272 | 267 |
273 bool GuestViewManager::IsGuestAvailableToContext( | 268 bool GuestViewManager::IsGuestAvailableToContext(GuestViewBase* guest) { |
274 GuestViewBase* guest, | 269 return delegate_->IsGuestAvailableToContext(guest); |
275 std::string* owner_extension_id) { | 270 } |
276 const Feature* feature = | |
277 FeatureProvider::GetAPIFeature(guest->GetAPINamespace()); | |
278 CHECK(feature); | |
279 | 271 |
280 ProcessMap* process_map = ProcessMap::Get(context_); | 272 void GuestViewManager::DispatchEvent(const std::string& event_name, |
281 CHECK(process_map); | 273 scoped_ptr<base::DictionaryValue> args, |
282 | 274 GuestViewBase* guest, |
283 const Extension* owner_extension = ProcessManager::Get(context_)-> | 275 int instance_id) { |
284 GetExtensionForWebContents(guest->owner_web_contents()); | 276 delegate_->DispatchEvent(event_name, args.Pass(), guest, instance_id); |
285 *owner_extension_id = owner_extension ? owner_extension->id() : std::string(); | |
286 | |
287 // Ok for |owner_extension| to be nullptr, the embedder might be WebUI. | |
288 Feature::Availability availability = feature->IsAvailableToContext( | |
289 owner_extension, | |
290 process_map->GetMostLikelyContextType( | |
291 owner_extension, | |
292 guest->owner_web_contents()->GetRenderProcessHost()->GetID()), | |
293 guest->GetOwnerSiteURL()); | |
294 | |
295 return availability.is_available(); | |
296 } | 277 } |
297 | 278 |
298 content::WebContents* GuestViewManager::GetGuestByInstanceID( | 279 content::WebContents* GuestViewManager::GetGuestByInstanceID( |
299 int guest_instance_id) { | 280 int guest_instance_id) { |
300 auto it = guest_web_contents_by_instance_id_.find(guest_instance_id); | 281 auto it = guest_web_contents_by_instance_id_.find(guest_instance_id); |
301 if (it == guest_web_contents_by_instance_id_.end()) | 282 if (it == guest_web_contents_by_instance_id_.end()) |
302 return nullptr; | 283 return nullptr; |
303 return it->second; | 284 return it->second; |
304 } | 285 } |
305 | 286 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 return element_instance_id < other.element_instance_id; | 366 return element_instance_id < other.element_instance_id; |
386 } | 367 } |
387 | 368 |
388 bool GuestViewManager::ElementInstanceKey::operator==( | 369 bool GuestViewManager::ElementInstanceKey::operator==( |
389 const GuestViewManager::ElementInstanceKey& other) const { | 370 const GuestViewManager::ElementInstanceKey& other) const { |
390 return (embedder_process_id == other.embedder_process_id) && | 371 return (embedder_process_id == other.embedder_process_id) && |
391 (element_instance_id == other.element_instance_id); | 372 (element_instance_id == other.element_instance_id); |
392 } | 373 } |
393 | 374 |
394 } // namespace extensions | 375 } // namespace extensions |
OLD | NEW |