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 3 // found in the LICENSE file. 4 5 #include "extensions/browser/process_map.h" 6 7 #include "extensions/browser/process_map_factory.h" 8 9 namespace extensions { 10 11 // Item 12 struct ProcessMap::Item { 13 Item() : process_id(0), site_instance_id(0) { 14 } 15 16 // Purposely implicit constructor needed on older gcc's. See: 17 // http://codereview.chromium.org/8769022/ 18 explicit Item(const ProcessMap::Item& other) 19 : extension_id(other.extension_id), 20 process_id(other.process_id), 21 site_instance_id(other.site_instance_id) { 22 } 23 24 Item(const std::string& extension_id, int process_id, 25 int site_instance_id) 26 : extension_id(extension_id), 27 process_id(process_id), 28 site_instance_id(site_instance_id) { 29 } 30 31 ~Item() { 32 } 33 34 bool operator<(const ProcessMap::Item& other) const { 35 if (extension_id < other.extension_id) 36 return true; 37 38 if (extension_id == other.extension_id && 39 process_id < other.process_id) { 40 return true; 41 } 42 43 if (extension_id == other.extension_id && 44 process_id == other.process_id && 45 site_instance_id < other.site_instance_id) { 46 return true; 47 } 48 49 return false; 50 } 51 52 std::string extension_id; 53 int process_id; 54 int site_instance_id; 55 }; 56 57 58 // ProcessMap 59 ProcessMap::ProcessMap() { 60 } 61 62 ProcessMap::~ProcessMap() { 63 } 64 65 // static 66 ProcessMap* ProcessMap::Get(content::BrowserContext* browser_context) { 67 return ProcessMapFactory::GetForBrowserContext(browser_context); 68 } 69 70 bool ProcessMap::Insert(const std::string& extension_id, int process_id, 71 int site_instance_id) { 72 return items_.insert(Item(extension_id, process_id, site_instance_id)).second; 73 } 74 75 bool ProcessMap::Remove(const std::string& extension_id, int process_id, 76 int site_instance_id) { 77 return items_.erase(Item(extension_id, process_id, site_instance_id)) > 0; 78 } 79 80 int ProcessMap::RemoveAllFromProcess(int process_id) { 81 int result = 0; 82 for (ItemSet::iterator iter = items_.begin(); iter != items_.end(); ) { 83 if (iter->process_id == process_id) { 84 items_.erase(iter++); 85 ++result; 86 } else { 87 ++iter; 88 } 89 } 90 return result; 91 } 92 93 bool ProcessMap::Contains(const std::string& extension_id, 94 int process_id) const { 95 for (ItemSet::const_iterator iter = items_.begin(); iter != items_.end(); 96 ++iter) { 97 if (iter->process_id == process_id && iter->extension_id == extension_id) 98 return true; 99 } 100 return false; 101 } 102 103 bool ProcessMap::Contains(int process_id) const { 104 for (ItemSet::const_iterator iter = items_.begin(); iter != items_.end(); 105 ++iter) { 106 if (iter->process_id == process_id) 107 return true; 108 } 109 return false; 110 } 111 112 std::set<std::string> ProcessMap::GetExtensionsInProcess(int process_id) const { 113 std::set<std::string> result; 114 for (ItemSet::const_iterator iter = items_.begin(); iter != items_.end(); 115 ++iter) { 116 if (iter->process_id == process_id) 117 result.insert(iter->extension_id); 118 } 119 return result; 120 } 121 122 } // namespace extensions 123