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

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

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