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

Side by Side Diff: extensions/browser/extension_host.cc

Issue 930413002: Unobserve the host WebContents of an ExtensionHost on destruction, to prevent (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: metrics Created 5 years, 10 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/extension_host.h" 5 #include "extensions/browser/extension_host.h"
6 6
7 #include <list> 7 #include <list>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageActiveTime2", 156 UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageActiveTime2",
157 load_start_->Elapsed()); 157 load_start_->Elapsed());
158 } 158 }
159 content::NotificationService::current()->Notify( 159 content::NotificationService::current()->Notify(
160 extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, 160 extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED,
161 content::Source<BrowserContext>(browser_context_), 161 content::Source<BrowserContext>(browser_context_),
162 content::Details<ExtensionHost>(this)); 162 content::Details<ExtensionHost>(this));
163 FOR_EACH_OBSERVER(ExtensionHostObserver, observer_list_, 163 FOR_EACH_OBSERVER(ExtensionHostObserver, observer_list_,
164 OnExtensionHostDestroyed(this)); 164 OnExtensionHostDestroyed(this));
165 ProcessCreationQueue::GetInstance()->Remove(this); 165 ProcessCreationQueue::GetInstance()->Remove(this);
166 // Immediately stop observing |host_contents_| because its destruction events
167 // (like DidStopLoading, it turns out) can call back into ExtensionHost
168 // re-entrantly, when anything declared after |host_contents_| has already
169 // been destroyed.
170 content::WebContentsObserver::Observe(NULL);
Marijn Kruisselbrink 2015/02/17 20:17:44 nullptr? or was this intentional to stay consisten
not at google - send to devlin 2015/02/17 21:17:34 It's never intentional :-) (and I fixed the rest o
166 } 171 }
167 172
168 content::RenderProcessHost* ExtensionHost::render_process_host() const { 173 content::RenderProcessHost* ExtensionHost::render_process_host() const {
169 return render_view_host()->GetProcess(); 174 return render_view_host()->GetProcess();
170 } 175 }
171 176
172 RenderViewHost* ExtensionHost::render_view_host() const { 177 RenderViewHost* ExtensionHost::render_view_host() const {
173 // TODO(mpcomplete): This can be NULL. How do we handle that? 178 // TODO(mpcomplete): This can be NULL. How do we handle that?
174 return render_view_host_; 179 return render_view_host_;
175 } 180 }
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, 305 extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED,
301 content::Source<BrowserContext>(browser_context_), 306 content::Source<BrowserContext>(browser_context_),
302 content::Details<ExtensionHost>(this)); 307 content::Details<ExtensionHost>(this));
303 } 308 }
304 309
305 void ExtensionHost::DidStopLoading(content::RenderViewHost* render_view_host) { 310 void ExtensionHost::DidStopLoading(content::RenderViewHost* render_view_host) {
306 bool notify = !did_stop_loading_; 311 bool notify = !did_stop_loading_;
307 did_stop_loading_ = true; 312 did_stop_loading_ = true;
308 OnDidStopLoading(); 313 OnDidStopLoading();
309 if (notify) { 314 if (notify) {
310 // Log metrics. It's tempting to CHECK(load_start_) here, but it's possible 315 CHECK(load_start_.get());
311 // to get a DidStopLoading even if we never started loading, in convoluted 316 if (extension_host_type_ == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) {
312 // notification and observer chains. 317 if (extension_ && BackgroundInfo::HasLazyBackgroundPage(extension_)) {
313 if (load_start_.get()) { 318 UMA_HISTOGRAM_MEDIUM_TIMES("Extensions.EventPageLoadTime2",
314 if (extension_host_type_ == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { 319 load_start_->Elapsed());
315 if (extension_ && BackgroundInfo::HasLazyBackgroundPage(extension_)) { 320 } else {
316 UMA_HISTOGRAM_MEDIUM_TIMES("Extensions.EventPageLoadTime2", 321 UMA_HISTOGRAM_MEDIUM_TIMES("Extensions.BackgroundPageLoadTime2",
317 load_start_->Elapsed());
318 } else {
319 UMA_HISTOGRAM_MEDIUM_TIMES("Extensions.BackgroundPageLoadTime2",
320 load_start_->Elapsed());
321 }
322 } else if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP) {
323 UMA_HISTOGRAM_MEDIUM_TIMES("Extensions.PopupLoadTime2",
324 load_start_->Elapsed()); 322 load_start_->Elapsed());
325 } 323 }
324 } else if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP) {
325 UMA_HISTOGRAM_MEDIUM_TIMES("Extensions.PopupLoadTime2",
326 load_start_->Elapsed());
326 } 327 }
327
328 // Send the notification last, because it might result in this being 328 // Send the notification last, because it might result in this being
329 // deleted. 329 // deleted.
330 content::NotificationService::current()->Notify( 330 content::NotificationService::current()->Notify(
331 extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, 331 extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING,
332 content::Source<BrowserContext>(browser_context_), 332 content::Source<BrowserContext>(browser_context_),
333 content::Details<ExtensionHost>(this)); 333 content::Details<ExtensionHost>(this));
334 } 334 }
335 } 335 }
336 336
337 void ExtensionHost::OnDidStopLoading() { 337 void ExtensionHost::OnDidStopLoading() {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 return delegate_->CheckMediaAccessPermission( 484 return delegate_->CheckMediaAccessPermission(
485 web_contents, security_origin, type, extension()); 485 web_contents, security_origin, type, extension());
486 } 486 }
487 487
488 bool ExtensionHost::IsNeverVisible(content::WebContents* web_contents) { 488 bool ExtensionHost::IsNeverVisible(content::WebContents* web_contents) {
489 ViewType view_type = extensions::GetViewType(web_contents); 489 ViewType view_type = extensions::GetViewType(web_contents);
490 return view_type == extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE; 490 return view_type == extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE;
491 } 491 }
492 492
493 } // namespace extensions 493 } // namespace extensions
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698