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 namespace extensions {
8
9 // Item
10 struct ProcessMap::Item {
Itemextensions::ProcessMap::Item11 Item() : process_id(0), site_instance_id(0) {
12 }
13
14 // Purposely implicit constructor needed on older gcc's. See:
15 // http://codereview.chromium.org/8769022/
Itemextensions::ProcessMap::Item16 explicit Item(const ProcessMap::Item& other)
17 : extension_id(other.extension_id),
18 process_id(other.process_id),
19 site_instance_id(other.site_instance_id) {
20 }
21
Itemextensions::ProcessMap::Item22 Item(const std::string& extension_id, int process_id,
23 int site_instance_id)
24 : extension_id(extension_id),
25 process_id(process_id),
26 site_instance_id(site_instance_id) {
27 }
28
~Itemextensions::ProcessMap::Item29 ~Item() {
30 }
31
operator <extensions::ProcessMap::Item32 bool operator<(const ProcessMap::Item& other) const {
33 if (extension_id < other.extension_id)
34 return true;
35
36 if (extension_id == other.extension_id &&
37 process_id < other.process_id) {
38 return true;
39 }
40
41 if (extension_id == other.extension_id &&
42 process_id == other.process_id &&
43 site_instance_id < other.site_instance_id) {
44 return true;
45 }
46
47 return false;
48 }
49
50 std::string extension_id;
51 int process_id;
52 int site_instance_id;
53 };
54
55
56 // ProcessMap
ProcessMap()57 ProcessMap::ProcessMap() {
58 }
59
~ProcessMap()60 ProcessMap::~ProcessMap() {
61 }
62
Insert(const std::string & extension_id,int process_id,int site_instance_id)63 bool ProcessMap::Insert(const std::string& extension_id, int process_id,
64 int site_instance_id) {
65 return items_.insert(Item(extension_id, process_id, site_instance_id)).second;
66 }
67
Remove(const std::string & extension_id,int process_id,int site_instance_id)68 bool ProcessMap::Remove(const std::string& extension_id, int process_id,
69 int site_instance_id) {
70 return items_.erase(Item(extension_id, process_id, site_instance_id)) > 0;
71 }
72
RemoveAllFromProcess(int process_id)73 int ProcessMap::RemoveAllFromProcess(int process_id) {
74 int result = 0;
75 for (ItemSet::iterator iter = items_.begin(); iter != items_.end(); ) {
76 if (iter->process_id == process_id) {
77 items_.erase(iter++);
78 ++result;
79 } else {
80 ++iter;
81 }
82 }
83 return result;
84 }
85
Contains(const std::string & extension_id,int process_id) const86 bool ProcessMap::Contains(const std::string& extension_id,
87 int process_id) const {
88 for (ItemSet::const_iterator iter = items_.begin(); iter != items_.end();
89 ++iter) {
90 if (iter->process_id == process_id && iter->extension_id == extension_id)
91 return true;
92 }
93 return false;
94 }
95
Contains(int process_id) const96 bool ProcessMap::Contains(int process_id) const {
97 for (ItemSet::const_iterator iter = items_.begin(); iter != items_.end();
98 ++iter) {
99 if (iter->process_id == process_id)
100 return true;
101 }
102 return false;
103 }
104
GetExtensionsInProcess(int process_id) const105 std::set<std::string> ProcessMap::GetExtensionsInProcess(int process_id) const {
106 std::set<std::string> result;
107 for (ItemSet::const_iterator iter = items_.begin(); iter != items_.end();
108 ++iter) {
109 if (iter->process_id == process_id)
110 result.insert(iter->extension_id);
111 }
112 return result;
113 }
114
115 } // extensions
116