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/extension_host.h" | 5 #include "extensions/browser/extension_host.h" |
6 | 6 |
7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
10 #include "base/metrics/histogram_macros.h" | 10 #include "base/metrics/histogram_macros.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 | 43 |
44 using content::BrowserContext; | 44 using content::BrowserContext; |
45 using content::OpenURLParams; | 45 using content::OpenURLParams; |
46 using content::RenderProcessHost; | 46 using content::RenderProcessHost; |
47 using content::RenderViewHost; | 47 using content::RenderViewHost; |
48 using content::SiteInstance; | 48 using content::SiteInstance; |
49 using content::WebContents; | 49 using content::WebContents; |
50 | 50 |
51 namespace extensions { | 51 namespace extensions { |
52 | 52 |
53 namespace { | |
54 | |
55 // Singleton which wraps our current ExtensionHostQueue implementation. | |
56 struct QueueWrapper { | |
57 QueueWrapper() : queue(new SerialExtensionHostQueue()) {} | |
58 scoped_ptr<ExtensionHostQueue> queue; | |
59 }; | |
60 base::LazyInstance<QueueWrapper> g_queue_wrapper = LAZY_INSTANCE_INITIALIZER; | |
61 | |
62 } // namespace | |
63 | |
64 ExtensionHost::ExtensionHost(const Extension* extension, | 53 ExtensionHost::ExtensionHost(const Extension* extension, |
65 SiteInstance* site_instance, | 54 SiteInstance* site_instance, |
66 const GURL& url, | 55 const GURL& url, |
67 ViewType host_type) | 56 ViewType host_type) |
68 : delegate_(ExtensionsBrowserClient::Get()->CreateExtensionHostDelegate()), | 57 : delegate_(ExtensionsBrowserClient::Get()->CreateExtensionHostDelegate()), |
69 extension_(extension), | 58 extension_(extension), |
70 extension_id_(extension->id()), | 59 extension_id_(extension->id()), |
71 browser_context_(site_instance->GetBrowserContext()), | 60 browser_context_(site_instance->GetBrowserContext()), |
72 render_view_host_(nullptr), | 61 render_view_host_(nullptr), |
73 did_stop_loading_(false), | 62 did_stop_loading_(false), |
(...skipping 29 matching lines...) Expand all Loading... |
103 load_start_.get()) { | 92 load_start_.get()) { |
104 UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageActiveTime2", | 93 UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageActiveTime2", |
105 load_start_->Elapsed()); | 94 load_start_->Elapsed()); |
106 } | 95 } |
107 content::NotificationService::current()->Notify( | 96 content::NotificationService::current()->Notify( |
108 extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, | 97 extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, |
109 content::Source<BrowserContext>(browser_context_), | 98 content::Source<BrowserContext>(browser_context_), |
110 content::Details<ExtensionHost>(this)); | 99 content::Details<ExtensionHost>(this)); |
111 FOR_EACH_OBSERVER(ExtensionHostObserver, observer_list_, | 100 FOR_EACH_OBSERVER(ExtensionHostObserver, observer_list_, |
112 OnExtensionHostDestroyed(this)); | 101 OnExtensionHostDestroyed(this)); |
113 g_queue_wrapper.Get().queue->Remove(this); | 102 delegate_->GetExtensionHostQueue()->Remove(this); |
114 // Immediately stop observing |host_contents_| because its destruction events | 103 // Immediately stop observing |host_contents_| because its destruction events |
115 // (like DidStopLoading, it turns out) can call back into ExtensionHost | 104 // (like DidStopLoading, it turns out) can call back into ExtensionHost |
116 // re-entrantly, when anything declared after |host_contents_| has already | 105 // re-entrantly, when anything declared after |host_contents_| has already |
117 // been destroyed. | 106 // been destroyed. |
118 content::WebContentsObserver::Observe(nullptr); | 107 content::WebContentsObserver::Observe(nullptr); |
119 } | 108 } |
120 | 109 |
121 content::RenderProcessHost* ExtensionHost::render_process_host() const { | 110 content::RenderProcessHost* ExtensionHost::render_process_host() const { |
122 return render_view_host()->GetProcess(); | 111 return render_view_host()->GetProcess(); |
123 } | 112 } |
124 | 113 |
125 RenderViewHost* ExtensionHost::render_view_host() const { | 114 RenderViewHost* ExtensionHost::render_view_host() const { |
126 // TODO(mpcomplete): This can be null. How do we handle that? | 115 // TODO(mpcomplete): This can be null. How do we handle that? |
127 return render_view_host_; | 116 return render_view_host_; |
128 } | 117 } |
129 | 118 |
130 bool ExtensionHost::IsRenderViewLive() const { | 119 bool ExtensionHost::IsRenderViewLive() const { |
131 return render_view_host()->IsRenderViewLive(); | 120 return render_view_host()->IsRenderViewLive(); |
132 } | 121 } |
133 | 122 |
134 void ExtensionHost::CreateRenderViewSoon() { | 123 void ExtensionHost::CreateRenderViewSoon() { |
135 if (render_process_host() && render_process_host()->HasConnection()) { | 124 if (render_process_host() && render_process_host()->HasConnection()) { |
136 // If the process is already started, go ahead and initialize the RenderView | 125 // If the process is already started, go ahead and initialize the RenderView |
137 // synchronously. The process creation is the real meaty part that we want | 126 // synchronously. The process creation is the real meaty part that we want |
138 // to defer. | 127 // to defer. |
139 CreateRenderViewNow(); | 128 CreateRenderViewNow(); |
140 } else { | 129 } else { |
141 g_queue_wrapper.Get().queue->Add(this); | 130 delegate_->GetExtensionHostQueue()->Add(this); |
142 } | 131 } |
143 } | 132 } |
144 | 133 |
145 void ExtensionHost::CreateRenderViewNow() { | 134 void ExtensionHost::CreateRenderViewNow() { |
146 LoadInitialURL(); | 135 LoadInitialURL(); |
147 if (IsBackgroundPage()) { | 136 if (IsBackgroundPage()) { |
148 DCHECK(IsRenderViewLive()); | 137 DCHECK(IsRenderViewLive()); |
149 if (extension_) { | 138 if (extension_) { |
150 std::string group_name = base::FieldTrialList::FindFullName( | 139 std::string group_name = base::FieldTrialList::FindFullName( |
151 "ThrottleExtensionBackgroundPages"); | 140 "ThrottleExtensionBackgroundPages"); |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 return delegate_->CheckMediaAccessPermission( | 421 return delegate_->CheckMediaAccessPermission( |
433 web_contents, security_origin, type, extension()); | 422 web_contents, security_origin, type, extension()); |
434 } | 423 } |
435 | 424 |
436 bool ExtensionHost::IsNeverVisible(content::WebContents* web_contents) { | 425 bool ExtensionHost::IsNeverVisible(content::WebContents* web_contents) { |
437 ViewType view_type = extensions::GetViewType(web_contents); | 426 ViewType view_type = extensions::GetViewType(web_contents); |
438 return view_type == extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE; | 427 return view_type == extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE; |
439 } | 428 } |
440 | 429 |
441 } // namespace extensions | 430 } // namespace extensions |
OLD | NEW |