Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: extensions/browser/guest_view/guest_view_manager.cc

Issue 1066563006: GuestView: Move GuestViewManager extension dependencies to ExtensionsGuestViewManagerDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@extensions_guest_view_message_filter
Patch Set: Fixed more tests Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698