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