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

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

Issue 2211213002: Revert of [Extensions] Ensure ordering of extension [un]loaded, activated messages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2785
Patch Set: Created 4 years, 4 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 | « extensions/browser/renderer_startup_helper.h ('k') | extensions/renderer/dispatcher.cc » ('j') | 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/renderer_startup_helper.h" 5 #include "extensions/browser/renderer_startup_helper.h"
6 6
7 #include "base/values.h" 7 #include "base/values.h"
8 #include "components/keyed_service/content/browser_context_dependency_manager.h" 8 #include "components/keyed_service/content/browser_context_dependency_manager.h"
9 #include "content/public/browser/notification_service.h" 9 #include "content/public/browser/notification_service.h"
10 #include "content/public/browser/notification_types.h" 10 #include "content/public/browser/notification_types.h"
11 #include "content/public/browser/render_process_host.h" 11 #include "content/public/browser/render_process_host.h"
12 #include "extensions/browser/extension_function_dispatcher.h" 12 #include "extensions/browser/extension_function_dispatcher.h"
13 #include "extensions/browser/extension_registry.h" 13 #include "extensions/browser/extension_registry.h"
14 #include "extensions/browser/extensions_browser_client.h" 14 #include "extensions/browser/extensions_browser_client.h"
15 #include "extensions/browser/guest_view/web_view/web_view_guest.h" 15 #include "extensions/browser/guest_view/web_view/web_view_guest.h"
16 #include "extensions/common/extension_messages.h" 16 #include "extensions/common/extension_messages.h"
17 #include "extensions/common/extension_set.h" 17 #include "extensions/common/extension_set.h"
18 #include "extensions/common/extensions_client.h" 18 #include "extensions/common/extensions_client.h"
19 #include "ui/base/webui/web_ui_util.h" 19 #include "ui/base/webui/web_ui_util.h"
20 20
21 using content::BrowserContext; 21 using content::BrowserContext;
22 22
23 namespace extensions { 23 namespace extensions {
24 24
25 RendererStartupHelper::RendererStartupHelper(BrowserContext* browser_context) 25 RendererStartupHelper::RendererStartupHelper(BrowserContext* browser_context)
26 : browser_context_(browser_context) { 26 : browser_context_(browser_context) {
27 DCHECK(browser_context); 27 DCHECK(browser_context);
28 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED, 28 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED,
29 content::NotificationService::AllBrowserContextsAndSources()); 29 content::NotificationService::AllBrowserContextsAndSources());
30 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
31 content::NotificationService::AllBrowserContextsAndSources());
32 } 30 }
33 31
34 RendererStartupHelper::~RendererStartupHelper() {} 32 RendererStartupHelper::~RendererStartupHelper() {}
35 33
36 void RendererStartupHelper::Observe( 34 void RendererStartupHelper::Observe(
37 int type, 35 int type,
38 const content::NotificationSource& source, 36 const content::NotificationSource& source,
39 const content::NotificationDetails& details) { 37 const content::NotificationDetails& details) {
40 switch (type) { 38 DCHECK_EQ(content::NOTIFICATION_RENDERER_PROCESS_CREATED, type);
41 case content::NOTIFICATION_RENDERER_PROCESS_CREATED: 39 content::RenderProcessHost* process =
42 InitializeProcess( 40 content::Source<content::RenderProcessHost>(source).ptr();
43 content::Source<content::RenderProcessHost>(source).ptr());
44 break;
45 case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED:
46 UntrackProcess(content::Source<content::RenderProcessHost>(source).ptr());
47 break;
48 default:
49 NOTREACHED() << "Unexpected notification: " << type;
50 }
51 }
52
53 void RendererStartupHelper::InitializeProcess(
54 content::RenderProcessHost* process) {
55 ExtensionsBrowserClient* client = ExtensionsBrowserClient::Get(); 41 ExtensionsBrowserClient* client = ExtensionsBrowserClient::Get();
56 if (!client->IsSameContext(browser_context_, process->GetBrowserContext())) 42 if (!client->IsSameContext(browser_context_, process->GetBrowserContext()))
57 return; 43 return;
58 44
59 bool activity_logging_enabled = 45 bool activity_logging_enabled =
60 client->IsActivityLoggingEnabled(process->GetBrowserContext()); 46 client->IsActivityLoggingEnabled(process->GetBrowserContext());
61 // We only send the ActivityLoggingEnabled message if it is enabled; otherwise 47 // We only send the ActivityLoggingEnabled message if it is enabled; otherwise
62 // the default (not enabled) is correct. 48 // the default (not enabled) is correct.
63 if (activity_logging_enabled) { 49 if (activity_logging_enabled) {
64 process->Send( 50 process->Send(
(...skipping 28 matching lines...) Expand all
93 // TODO(kalman): Only include tab specific permissions for extension 79 // TODO(kalman): Only include tab specific permissions for extension
94 // processes, no other process needs it, so it's mildly wasteful. 80 // processes, no other process needs it, so it's mildly wasteful.
95 // I am not sure this is possible to know this here, at such a low 81 // I am not sure this is possible to know this here, at such a low
96 // level of the stack. Perhaps site isolation can help. 82 // level of the stack. Perhaps site isolation can help.
97 bool include_tab_permissions = true; 83 bool include_tab_permissions = true;
98 loaded_extensions.push_back( 84 loaded_extensions.push_back(
99 ExtensionMsg_Loaded_Params(ext.get(), include_tab_permissions)); 85 ExtensionMsg_Loaded_Params(ext.get(), include_tab_permissions));
100 } 86 }
101 } 87 }
102 process->Send(new ExtensionMsg_Loaded(loaded_extensions)); 88 process->Send(new ExtensionMsg_Loaded(loaded_extensions));
103 auto iter = pending_active_extensions_.find(process);
104 if (iter != pending_active_extensions_.end()) {
105 for (const ExtensionId& id : iter->second) {
106 DCHECK(extensions.Contains(id));
107 process->Send(new ExtensionMsg_ActivateExtension(id));
108 }
109 }
110
111 initialized_processes_.insert(process);
112 }
113
114 void RendererStartupHelper::UntrackProcess(
115 content::RenderProcessHost* process) {
116 if (!ExtensionsBrowserClient::Get()->IsSameContext(
117 browser_context_, process->GetBrowserContext())) {
118 return;
119 }
120
121 initialized_processes_.erase(process);
122 pending_active_extensions_.erase(process);
123 }
124
125 void RendererStartupHelper::ActivateExtensionInProcess(
126 const ExtensionId& id,
127 content::RenderProcessHost* process) {
128 if (initialized_processes_.count(process))
129 process->Send(new ExtensionMsg_ActivateExtension(id));
130 else
131 pending_active_extensions_[process].insert(id);
132 }
133
134 void RendererStartupHelper::OnExtensionLoaded(const Extension& extension) {
135 // Renderers don't need to know about themes.
136 if (extension.is_theme())
137 return;
138
139 // We don't need to include tab permisisons here, since the extension
140 // was just loaded.
141 // Uninitialized renderers will be informed of the extension load during the
142 // first batch of messages.
143 std::vector<ExtensionMsg_Loaded_Params> params(
144 1,
145 ExtensionMsg_Loaded_Params(&extension, false /* no tab permissions */));
146 for (content::RenderProcessHost* process : initialized_processes_)
147 process->Send(new ExtensionMsg_Loaded(params));
148 }
149
150 void RendererStartupHelper::OnExtensionUnloaded(const ExtensionId& id) {
151 for (content::RenderProcessHost* process : initialized_processes_)
152 process->Send(new ExtensionMsg_Unloaded(id));
153 for (auto& process_extensions_pair : pending_active_extensions_)
154 process_extensions_pair.second.erase(id);
155 } 89 }
156 90
157 ////////////////////////////////////////////////////////////////////////////// 91 //////////////////////////////////////////////////////////////////////////////
158 92
159 // static 93 // static
160 RendererStartupHelper* RendererStartupHelperFactory::GetForBrowserContext( 94 RendererStartupHelper* RendererStartupHelperFactory::GetForBrowserContext(
161 BrowserContext* context) { 95 BrowserContext* context) {
162 return static_cast<RendererStartupHelper*>( 96 return static_cast<RendererStartupHelper*>(
163 GetInstance()->GetServiceForBrowserContext(context, true)); 97 GetInstance()->GetServiceForBrowserContext(context, true));
164 } 98 }
(...skipping 21 matching lines...) Expand all
186 BrowserContext* context) const { 120 BrowserContext* context) const {
187 // Redirected in incognito. 121 // Redirected in incognito.
188 return ExtensionsBrowserClient::Get()->GetOriginalContext(context); 122 return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
189 } 123 }
190 124
191 bool RendererStartupHelperFactory::ServiceIsCreatedWithBrowserContext() const { 125 bool RendererStartupHelperFactory::ServiceIsCreatedWithBrowserContext() const {
192 return true; 126 return true;
193 } 127 }
194 128
195 } // namespace extensions 129 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/renderer_startup_helper.h ('k') | extensions/renderer/dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698