15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_SET_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_COMMON_EXTENSIONS_EXTENSION_SET_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iterator> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The one true extension container. Extensions are identified by their id. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Only one extension can be in the set with a given ID. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionSet { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::pair<base::FilePath, std::string> ExtensionPathAndDefaultLocale; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, scoped_refptr<const extensions::Extension> > 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionMap; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iteration over the values of the map (given that it's an ExtensionSet, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it should iterate like a set iterator). 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class const_iterator : 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public std::iterator<std::input_iterator_tag, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<const extensions::Extension> > { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator(const const_iterator& other); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit const_iterator(ExtensionMap::const_iterator it); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator& operator++() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it_; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<const extensions::Extension> operator*() { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it_->second; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const scoped_refptr<const extensions::Extension>* operator->() { 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return &it_->second; 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator!=(const const_iterator& other) { return it_ != other.it_; } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(const const_iterator& other) { return it_ == other.it_; } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionMap::const_iterator it_; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSet(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ExtensionSet(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size() const; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_empty() const; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iteration support. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator begin() const { return const_iterator(extensions_.begin()); } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator end() const { return const_iterator(extensions_.end()); } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the set contains the specified extension. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Contains(const std::string& id) const; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the specified extension to the set. The set becomes an owner. Any 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // previous extension with the same ID is removed. 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns true if there is no previous extension. 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Insert(const scoped_refptr<const extensions::Extension>& extension); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copies different items from |extensions| to the current set and returns 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // whether anything changed. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InsertAll(const ExtensionSet& extensions); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes the specified extension. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if the set contained the specified extnesion. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool Remove(const std::string& id); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes all extensions. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the extension ID, or empty if none. This includes web URLs that 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are part of an extension's web extent. 82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string GetExtensionOrAppIDByURL(const GURL& url) const; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the Extension, or NULL if none. This includes web URLs that are 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // part of an extension's web extent. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: This can return NULL if called before UpdateExtensions receives 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bulk extension data (e.g. if called from 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EventBindings::HandleContextCreated) 89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const extensions::Extension* GetExtensionOrAppByURL(const GURL& url) const; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the hosted app whose web extent contains the URL. 92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const extensions::Extension* GetHostedAppByURL(const GURL& url) const; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a hosted app that contains any URL that overlaps with the given 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extent, if one exists. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* GetHostedAppByOverlappingWebExtent( 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::URLPatternSet& extent) const; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if |new_url| is in the extent of the same extension as 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |old_url|. Also returns true if neither URL is in an app. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InSameExtent(const GURL& old_url, const GURL& new_url) const; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Look up an Extension object by id. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* GetByID(const std::string& id) const; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets the IDs of all extensions in the set. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<std::string> GetIDs() const; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if |info| should get extension api bindings and be permitted 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to make api calls. Note that this is independent of what extension 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permissions the given extension has been granted. 112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool ExtensionBindingsAllowed(const GURL& url) const; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionSetTest, ExtensionSet); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionMap extensions_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionSet); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_COMMON_EXTENSIONS_EXTENSION_SET_H_ 123