Home | History | Annotate | Download | only in browser
      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