OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/command_line.h" | 6 #include "base/command_line.h" |
7 #include "chrome/browser/extensions/extension_process_manager.h" | 7 #include "chrome/browser/extensions/extension_process_manager.h" |
8 | 8 |
9 #include "chrome/browser/ui/browser_window.h" | 9 #include "chrome/browser/ui/browser_window.h" |
10 #include "content/browser/browsing_instance.h" | 10 #include "content/browser/browsing_instance.h" |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 void ExtensionProcessManager::RegisterExtensionSiteInstance( | 273 void ExtensionProcessManager::RegisterExtensionSiteInstance( |
274 SiteInstance* site_instance, | 274 SiteInstance* site_instance, |
275 const Extension* extension) { | 275 const Extension* extension) { |
276 if (!site_instance->HasProcess()) { | 276 if (!site_instance->HasProcess()) { |
277 NOTREACHED(); | 277 NOTREACHED(); |
278 return; | 278 return; |
279 } | 279 } |
280 | 280 |
281 int site_instance_id = site_instance->id(); | 281 int site_instance_id = site_instance->id(); |
282 int render_process_id = site_instance->GetProcess()->id(); | 282 int render_process_id = site_instance->GetProcess()->id(); |
283 process_ids_[render_process_id].insert(site_instance_id); | 283 if (process_ids_[render_process_id].insert(site_instance_id).second) { |
284 | 284 // Register process hosting extensions that have access to extension |
285 // Register process hosting extensions that have access to extension bindings | 285 // bindings with the ExtensionInfoMap on the IO thread. |
286 // with the ExtensionInfoMap on the IO thread. | 286 Profile* profile = |
287 Profile* profile = | 287 Profile::FromBrowserContext(browsing_instance_->browser_context()); |
288 Profile::FromBrowserContext(browsing_instance_->browser_context()); | |
289 ExtensionService* service = profile->GetExtensionService(); | |
290 if (service->ExtensionBindingsAllowed(extension->url())) { | |
291 Profile* profile = Profile::FromBrowserContext( | |
292 site_instance->GetProcess()->browser_context()); | |
293 BrowserThread::PostTask( | 288 BrowserThread::PostTask( |
294 BrowserThread::IO, FROM_HERE, | 289 BrowserThread::IO, FROM_HERE, |
295 base::Bind(&ExtensionInfoMap::BindingsEnabledForProcess, | 290 base::Bind(&ExtensionInfoMap::RegisterExtensionProcess, |
296 profile->GetExtensionInfoMap(), | 291 profile->GetExtensionInfoMap(), |
| 292 extension->id(), |
297 render_process_id)); | 293 render_process_id)); |
298 } | 294 } |
299 | 295 |
300 SiteInstanceIDMap::const_iterator it = extension_ids_.find(site_instance_id); | 296 SiteInstanceIDMap::const_iterator it = extension_ids_.find(site_instance_id); |
301 if (it != extension_ids_.end() && (*it).second == extension->id()) | 297 if (it != extension_ids_.end() && (*it).second == extension->id()) |
302 return; | 298 return; |
303 | 299 |
304 // SiteInstance ids should get removed from the map before the extension ids | 300 // SiteInstance ids should get removed from the map before the extension ids |
305 // get used for a new SiteInstance. | 301 // get used for a new SiteInstance. |
306 DCHECK(it == extension_ids_.end()); | 302 DCHECK(it == extension_ids_.end()); |
307 extension_ids_[site_instance_id] = extension->id(); | 303 extension_ids_[site_instance_id] = extension->id(); |
308 } | 304 } |
309 | 305 |
310 void ExtensionProcessManager::UnregisterExtensionSiteInstance( | 306 void ExtensionProcessManager::UnregisterExtensionSiteInstance( |
311 SiteInstance* site_instance) { | 307 SiteInstance* site_instance) { |
312 int site_instance_id = site_instance->id(); | 308 int site_instance_id = site_instance->id(); |
313 SiteInstanceIDMap::iterator it = extension_ids_.find(site_instance_id); | 309 std::string extension_id = extension_ids_[site_instance_id]; |
314 if (it != extension_ids_.end()) { | 310 if (!extension_id.empty()) |
315 extension_ids_.erase(it++); | 311 extension_ids_.erase(site_instance_id); |
316 } | 312 |
317 if (site_instance->HasProcess()) { | 313 int render_process_id = ClearSiteInstanceID(site_instance_id); |
318 int render_process_id = site_instance->GetProcess()->id(); | 314 if (render_process_id == -1) |
319 ProcessIDMap::iterator host = process_ids_.find(render_process_id); | 315 return; |
320 if (host != process_ids_.end()) { | 316 |
321 host->second.erase(site_instance_id); | 317 Profile* profile = Profile::FromBrowserContext( |
322 if (host->second.empty()) { | 318 browsing_instance_->browser_context()); |
323 process_ids_.erase(host); | 319 BrowserThread::PostTask( |
324 Profile* profile = Profile::FromBrowserContext( | 320 BrowserThread::IO, FROM_HERE, |
325 site_instance->GetProcess()->browser_context()); | 321 base::Bind(&ExtensionInfoMap::UnregisterExtensionProcess, |
326 BrowserThread::PostTask( | 322 profile->GetExtensionInfoMap(), |
327 BrowserThread::IO, FROM_HERE, | 323 extension_id, |
328 base::Bind(&ExtensionInfoMap::BindingsDisabledForProcess, | 324 render_process_id)); |
329 profile->GetExtensionInfoMap(), | 325 } |
330 render_process_id)); | 326 |
| 327 int ExtensionProcessManager::ClearSiteInstanceID(int site_instance_id) { |
| 328 for (ProcessIDMap::iterator i = process_ids_.begin(); |
| 329 i != process_ids_.end(); ++i) { |
| 330 SiteInstanceIDSet& site_instance_id_set = i->second; |
| 331 for (SiteInstanceIDSet::iterator j = site_instance_id_set.begin(); |
| 332 j != site_instance_id_set.end(); ++j) { |
| 333 if (*j == site_instance_id) { |
| 334 int render_process_id = i->first; |
| 335 site_instance_id_set.erase(j); |
| 336 if (site_instance_id_set.empty()) |
| 337 process_ids_.erase(i); |
| 338 return render_process_id; |
331 } | 339 } |
332 } | 340 } |
333 } | 341 } |
| 342 return -1; |
334 } | 343 } |
335 | 344 |
336 bool ExtensionProcessManager::IsExtensionProcess(int render_process_id) { | 345 bool ExtensionProcessManager::IsExtensionProcess(int render_process_id) { |
337 return process_ids_.find(render_process_id) != process_ids_.end(); | 346 return process_ids_.find(render_process_id) != process_ids_.end(); |
338 } | 347 } |
339 | 348 |
340 bool ExtensionProcessManager::AreBindingsEnabledForProcess( | 349 bool ExtensionProcessManager::AreBindingsEnabledForProcess( |
341 int render_process_id) { | 350 int render_process_id) { |
342 // Must behave logically the same as AreBindingsEnabledForProcess() in | 351 // Must behave logically the same as AreBindingsEnabledForProcess() in |
343 // extension_info_map.cc. | 352 // extension_info_map.cc. |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 if (service && service->is_ready()) | 670 if (service && service->is_ready()) |
662 CreateBackgroundHostsForProfileStartup(this, service->extensions()); | 671 CreateBackgroundHostsForProfileStartup(this, service->extensions()); |
663 } | 672 } |
664 break; | 673 break; |
665 } | 674 } |
666 default: | 675 default: |
667 ExtensionProcessManager::Observe(type, source, details); | 676 ExtensionProcessManager::Observe(type, source, details); |
668 break; | 677 break; |
669 } | 678 } |
670 } | 679 } |
OLD | NEW |