| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/process_manager.h" | 5 #include "extensions/browser/process_manager.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 content::RenderFrameHost* render_frame_host, | 282 content::RenderFrameHost* render_frame_host, |
| 283 const Extension* extension) { | 283 const Extension* extension) { |
| 284 ExtensionRenderFrameData* data = &all_extension_frames_[render_frame_host]; | 284 ExtensionRenderFrameData* data = &all_extension_frames_[render_frame_host]; |
| 285 data->view_type = GetViewType(web_contents); | 285 data->view_type = GetViewType(web_contents); |
| 286 | 286 |
| 287 // Keep the lazy background page alive as long as any non-background-page | 287 // Keep the lazy background page alive as long as any non-background-page |
| 288 // extension views are visible. Keepalive count balanced in | 288 // extension views are visible. Keepalive count balanced in |
| 289 // UnregisterRenderFrame. | 289 // UnregisterRenderFrame. |
| 290 AcquireLazyKeepaliveCountForFrame(render_frame_host); | 290 AcquireLazyKeepaliveCountForFrame(render_frame_host); |
| 291 | 291 |
| 292 FOR_EACH_OBSERVER(ProcessManagerObserver, | 292 for (auto& observer : observer_list_) |
| 293 observer_list_, | 293 observer.OnExtensionFrameRegistered(extension->id(), render_frame_host); |
| 294 OnExtensionFrameRegistered(extension->id(), | |
| 295 render_frame_host)); | |
| 296 } | 294 } |
| 297 | 295 |
| 298 void ProcessManager::UnregisterRenderFrameHost( | 296 void ProcessManager::UnregisterRenderFrameHost( |
| 299 content::RenderFrameHost* render_frame_host) { | 297 content::RenderFrameHost* render_frame_host) { |
| 300 ExtensionRenderFrames::iterator frame = | 298 ExtensionRenderFrames::iterator frame = |
| 301 all_extension_frames_.find(render_frame_host); | 299 all_extension_frames_.find(render_frame_host); |
| 302 | 300 |
| 303 if (frame != all_extension_frames_.end()) { | 301 if (frame != all_extension_frames_.end()) { |
| 304 std::string extension_id = GetExtensionID(render_frame_host); | 302 std::string extension_id = GetExtensionID(render_frame_host); |
| 305 // Keepalive count, balanced in RegisterRenderFrame. | 303 // Keepalive count, balanced in RegisterRenderFrame. |
| 306 ReleaseLazyKeepaliveCountForFrame(render_frame_host); | 304 ReleaseLazyKeepaliveCountForFrame(render_frame_host); |
| 307 all_extension_frames_.erase(frame); | 305 all_extension_frames_.erase(frame); |
| 308 | 306 |
| 309 FOR_EACH_OBSERVER(ProcessManagerObserver, | 307 for (auto& observer : observer_list_) |
| 310 observer_list_, | 308 observer.OnExtensionFrameUnregistered(extension_id, render_frame_host); |
| 311 OnExtensionFrameUnregistered(extension_id, | |
| 312 render_frame_host)); | |
| 313 } | 309 } |
| 314 } | 310 } |
| 315 | 311 |
| 316 void ProcessManager::DidNavigateRenderFrameHost( | 312 void ProcessManager::DidNavigateRenderFrameHost( |
| 317 content::RenderFrameHost* render_frame_host) { | 313 content::RenderFrameHost* render_frame_host) { |
| 318 ExtensionRenderFrames::iterator frame = | 314 ExtensionRenderFrames::iterator frame = |
| 319 all_extension_frames_.find(render_frame_host); | 315 all_extension_frames_.find(render_frame_host); |
| 320 | 316 |
| 321 if (frame != all_extension_frames_.end()) { | 317 if (frame != all_extension_frames_.end()) { |
| 322 std::string extension_id = GetExtensionID(render_frame_host); | 318 std::string extension_id = GetExtensionID(render_frame_host); |
| 323 | 319 |
| 324 FOR_EACH_OBSERVER(ProcessManagerObserver, | 320 for (auto& observer : observer_list_) |
| 325 observer_list_, | 321 observer.OnExtensionFrameNavigated(extension_id, render_frame_host); |
| 326 OnExtensionFrameNavigated(extension_id, | |
| 327 render_frame_host)); | |
| 328 } | 322 } |
| 329 } | 323 } |
| 330 | 324 |
| 331 scoped_refptr<content::SiteInstance> ProcessManager::GetSiteInstanceForURL( | 325 scoped_refptr<content::SiteInstance> ProcessManager::GetSiteInstanceForURL( |
| 332 const GURL& url) { | 326 const GURL& url) { |
| 333 return site_instance_->GetRelatedSiteInstance(url); | 327 return site_instance_->GetRelatedSiteInstance(url); |
| 334 } | 328 } |
| 335 | 329 |
| 336 const ProcessManager::FrameSet ProcessManager::GetAllFrames() const { | 330 const ProcessManager::FrameSet ProcessManager::GetAllFrames() const { |
| 337 FrameSet result; | 331 FrameSet result; |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 696 if (host != nullptr) | 690 if (host != nullptr) |
| 697 CloseBackgroundHost(host); | 691 CloseBackgroundHost(host); |
| 698 UnregisterExtension(extension->id()); | 692 UnregisterExtension(extension->id()); |
| 699 } | 693 } |
| 700 | 694 |
| 701 void ProcessManager::CreateStartupBackgroundHosts() { | 695 void ProcessManager::CreateStartupBackgroundHosts() { |
| 702 DCHECK(!startup_background_hosts_created_); | 696 DCHECK(!startup_background_hosts_created_); |
| 703 for (const scoped_refptr<const Extension>& extension : | 697 for (const scoped_refptr<const Extension>& extension : |
| 704 extension_registry_->enabled_extensions()) { | 698 extension_registry_->enabled_extensions()) { |
| 705 CreateBackgroundHostForExtensionLoad(this, extension.get()); | 699 CreateBackgroundHostForExtensionLoad(this, extension.get()); |
| 706 FOR_EACH_OBSERVER(ProcessManagerObserver, | 700 for (auto& observer : observer_list_) |
| 707 observer_list_, | 701 observer.OnBackgroundHostStartup(extension.get()); |
| 708 OnBackgroundHostStartup(extension.get())); | |
| 709 } | 702 } |
| 710 } | 703 } |
| 711 | 704 |
| 712 void ProcessManager::OnBackgroundHostCreated(ExtensionHost* host) { | 705 void ProcessManager::OnBackgroundHostCreated(ExtensionHost* host) { |
| 713 DCHECK_EQ(browser_context_, host->browser_context()); | 706 DCHECK_EQ(browser_context_, host->browser_context()); |
| 714 background_hosts_.insert(host); | 707 background_hosts_.insert(host); |
| 715 | 708 |
| 716 if (BackgroundInfo::HasLazyBackgroundPage(host->extension())) { | 709 if (BackgroundInfo::HasLazyBackgroundPage(host->extension())) { |
| 717 std::unique_ptr<base::ElapsedTimer> since_suspended = std::move( | 710 std::unique_ptr<base::ElapsedTimer> since_suspended = std::move( |
| 718 background_page_data_[host->extension()->id()].since_suspended); | 711 background_page_data_[host->extension()->id()].since_suspended); |
| 719 if (since_suspended.get()) { | 712 if (since_suspended.get()) { |
| 720 UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageIdleTime", | 713 UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageIdleTime", |
| 721 since_suspended->Elapsed()); | 714 since_suspended->Elapsed()); |
| 722 } | 715 } |
| 723 } | 716 } |
| 724 FOR_EACH_OBSERVER(ProcessManagerObserver, observer_list_, | 717 for (auto& observer : observer_list_) |
| 725 OnBackgroundHostCreated(host)); | 718 observer.OnBackgroundHostCreated(host); |
| 726 } | 719 } |
| 727 | 720 |
| 728 void ProcessManager::CloseBackgroundHost(ExtensionHost* host) { | 721 void ProcessManager::CloseBackgroundHost(ExtensionHost* host) { |
| 729 ExtensionId extension_id = host->extension_id(); | 722 ExtensionId extension_id = host->extension_id(); |
| 730 CHECK(host->extension_host_type() == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); | 723 CHECK(host->extension_host_type() == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); |
| 731 delete host; | 724 delete host; |
| 732 // |host| should deregister itself from our structures. | 725 // |host| should deregister itself from our structures. |
| 733 CHECK(background_hosts_.find(host) == background_hosts_.end()); | 726 CHECK(background_hosts_.find(host) == background_hosts_.end()); |
| 734 | 727 |
| 735 FOR_EACH_OBSERVER(ProcessManagerObserver, | 728 for (auto& observer : observer_list_) |
| 736 observer_list_, | 729 observer.OnBackgroundHostClose(extension_id); |
| 737 OnBackgroundHostClose(extension_id)); | |
| 738 } | 730 } |
| 739 | 731 |
| 740 void ProcessManager::AcquireLazyKeepaliveCountForFrame( | 732 void ProcessManager::AcquireLazyKeepaliveCountForFrame( |
| 741 content::RenderFrameHost* render_frame_host) { | 733 content::RenderFrameHost* render_frame_host) { |
| 742 ExtensionRenderFrames::iterator it = | 734 ExtensionRenderFrames::iterator it = |
| 743 all_extension_frames_.find(render_frame_host); | 735 all_extension_frames_.find(render_frame_host); |
| 744 if (it == all_extension_frames_.end()) | 736 if (it == all_extension_frames_.end()) |
| 745 return; | 737 return; |
| 746 | 738 |
| 747 ExtensionRenderFrameData& data = it->second; | 739 ExtensionRenderFrameData& data = it->second; |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 // The lazy_keepalive_count may be greater than zero at this point because | 910 // The lazy_keepalive_count may be greater than zero at this point because |
| 919 // RenderFrameHosts are still alive. During extension reloading, they will | 911 // RenderFrameHosts are still alive. During extension reloading, they will |
| 920 // decrement the lazy_keepalive_count to negative for the new extension | 912 // decrement the lazy_keepalive_count to negative for the new extension |
| 921 // instance when they are destroyed. Since we are erasing the background page | 913 // instance when they are destroyed. Since we are erasing the background page |
| 922 // data for the unloaded extension, unregister the RenderFrameHosts too. | 914 // data for the unloaded extension, unregister the RenderFrameHosts too. |
| 923 for (ExtensionRenderFrames::iterator it = all_extension_frames_.begin(); | 915 for (ExtensionRenderFrames::iterator it = all_extension_frames_.begin(); |
| 924 it != all_extension_frames_.end(); ) { | 916 it != all_extension_frames_.end(); ) { |
| 925 content::RenderFrameHost* host = it->first; | 917 content::RenderFrameHost* host = it->first; |
| 926 if (GetExtensionID(host) == extension_id) { | 918 if (GetExtensionID(host) == extension_id) { |
| 927 all_extension_frames_.erase(it++); | 919 all_extension_frames_.erase(it++); |
| 928 FOR_EACH_OBSERVER(ProcessManagerObserver, | 920 for (auto& observer : observer_list_) |
| 929 observer_list_, | 921 observer.OnExtensionFrameUnregistered(extension_id, host); |
| 930 OnExtensionFrameUnregistered(extension_id, host)); | |
| 931 } else { | 922 } else { |
| 932 ++it; | 923 ++it; |
| 933 } | 924 } |
| 934 } | 925 } |
| 935 | 926 |
| 936 background_page_data_.erase(extension_id); | 927 background_page_data_.erase(extension_id); |
| 937 } | 928 } |
| 938 | 929 |
| 939 void ProcessManager::ClearBackgroundPageData(const std::string& extension_id) { | 930 void ProcessManager::ClearBackgroundPageData(const std::string& extension_id) { |
| 940 background_page_data_.erase(extension_id); | 931 background_page_data_.erase(extension_id); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 987 if (extension && !IncognitoInfo::IsSplitMode(extension)) { | 978 if (extension && !IncognitoInfo::IsSplitMode(extension)) { |
| 988 BrowserContext* original_context = | 979 BrowserContext* original_context = |
| 989 ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context()); | 980 ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context()); |
| 990 return ProcessManager::Get(original_context)->GetSiteInstanceForURL(url); | 981 return ProcessManager::Get(original_context)->GetSiteInstanceForURL(url); |
| 991 } | 982 } |
| 992 | 983 |
| 993 return ProcessManager::GetSiteInstanceForURL(url); | 984 return ProcessManager::GetSiteInstanceForURL(url); |
| 994 } | 985 } |
| 995 | 986 |
| 996 } // namespace extensions | 987 } // namespace extensions |
| OLD | NEW |