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

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: Ready for review Created 4 years, 5 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
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 process->Send(new ExtensionMsg_ActivateExtension(id));
lazyboy 2016/07/22 00:29:31 DCHECK(extensions.Contains(id)) or does that make
Devlin 2016/07/26 03:45:09 Sure, done.
112 }
113
114 initialized_processes_.insert(process);
115 }
116
117 void RendererStartupHelper::UntrackProcess(
118 content::RenderProcessHost* process) {
119 initialized_processes_.erase(process);
lazyboy 2016/07/22 00:29:31 Though not necessary, I think bailing out of this
Devlin 2016/07/26 03:45:09 Done.
120 pending_active_extensions_.erase(process);
121 }
122
123 void RendererStartupHelper::ActivateExtensionInProcess(
124 const ExtensionId& id,
125 content::RenderProcessHost* process) {
126 if (initialized_processes_.count(process))
127 process->Send(new ExtensionMsg_ActivateExtension(id));
128 else
129 pending_active_extensions_[process].insert(id);
130 }
131
132 void RendererStartupHelper::OnExtensionLoaded(const Extension& extension) {
133 if (extension.is_theme())
lazyboy 2016/07/22 00:29:31 Retain the old comment: // Renderers don't need to
Devlin 2016/07/26 03:45:09 Done.
134 return;
135
136 // We don't need to include tab permisisons here, since the extension
137 // was just loaded.
138 // Uninitialized renderers will be informed of the extension load during the
139 // first batch of messages.
140 std::vector<ExtensionMsg_Loaded_Params> params(
141 1,
142 ExtensionMsg_Loaded_Params(&extension, false /* no tab permissions */));
143 for (content::RenderProcessHost* process : initialized_processes_)
144 process->Send(new ExtensionMsg_Loaded(params));
145 }
146
147 void RendererStartupHelper::OnExtensionUnloaded(const ExtensionId& id) {
148 for (content::RenderProcessHost* process : initialized_processes_)
149 process->Send(new ExtensionMsg_Unloaded(id));
150 for (auto& kv : pending_active_extensions_)
lazyboy 2016/07/22 00:29:31 s/kv/extensions_in_process or sth.
Devlin 2016/07/26 03:45:09 replaced with process_extensions_pair (it's not ex
151 kv.second.erase(id);
94 } 152 }
95 153
96 ////////////////////////////////////////////////////////////////////////////// 154 //////////////////////////////////////////////////////////////////////////////
97 155
98 // static 156 // static
99 RendererStartupHelper* RendererStartupHelperFactory::GetForBrowserContext( 157 RendererStartupHelper* RendererStartupHelperFactory::GetForBrowserContext(
100 BrowserContext* context) { 158 BrowserContext* context) {
101 return static_cast<RendererStartupHelper*>( 159 return static_cast<RendererStartupHelper*>(
102 GetInstance()->GetServiceForBrowserContext(context, true)); 160 GetInstance()->GetServiceForBrowserContext(context, true));
103 } 161 }
(...skipping 21 matching lines...) Expand all
125 BrowserContext* context) const { 183 BrowserContext* context) const {
126 // Redirected in incognito. 184 // Redirected in incognito.
127 return ExtensionsBrowserClient::Get()->GetOriginalContext(context); 185 return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
128 } 186 }
129 187
130 bool RendererStartupHelperFactory::ServiceIsCreatedWithBrowserContext() const { 188 bool RendererStartupHelperFactory::ServiceIsCreatedWithBrowserContext() const {
131 return true; 189 return true;
132 } 190 }
133 191
134 } // namespace extensions 192 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698