1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 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)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_INFO_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_INFO_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/gtest_prod_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FORWARD_DECLARE_TEST(ExtensionServiceTest, AddPendingExtensionFromSync);
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class Extension;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A pending extension is an extension that hasn't been installed yet
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and is intended to be installed in the next auto-update cycle.  The
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// update URL of a pending extension may be blank, in which case a
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// default one is assumed.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(skerner): Make this class an implementation detail of
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PendingExtensionManager, and remove all other users.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PendingExtensionInfo {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  typedef bool (*ShouldAllowInstallPredicate)(const Extension*);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  PendingExtensionInfo(const std::string& id,
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       const std::string& install_parameter,
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       const GURL& update_url,
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       const Version& version,
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       ShouldAllowInstallPredicate should_allow_install,
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       bool is_from_sync,
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       bool install_silently,
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       Manifest::Location install_source,
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       int creation_flags,
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       bool mark_acknowledged,
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       bool remote_install);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Required for STL container membership.  Should not be used directly.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PendingExtensionInfo();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ~PendingExtensionInfo();
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Consider two PendingExtensionInfos equal if their ids are equal.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(const PendingExtensionInfo& rhs) const;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& id() const { return id_; }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& update_url() const { return update_url_; }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Version& version() const { return version_; }
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const std::string& install_parameter() const { return install_parameter_; }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ShouldAllowInstall() returns the result of running constructor argument
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |should_allow_install| on an extension. After an extension is unpacked,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this function is run. If it returns true, the extension is installed.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If not, the extension is discarded. This allows creators of
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PendingExtensionInfo objects to ensure that extensions meet some criteria
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that can only be tested once the extension is unpacked.
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool ShouldAllowInstall(const Extension* extension) const {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return should_allow_install_(extension);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_from_sync() const { return is_from_sync_; }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool install_silently() const { return install_silently_; }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Manifest::Location install_source() const { return install_source_; }
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int creation_flags() const { return creation_flags_; }
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool mark_acknowledged() const { return mark_acknowledged_; }
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool remote_install() const { return remote_install_; }
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns -1, 0 or 1 if |this| has lower, equal or higher precedence than
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |other|, respectively. "Equal" precedence means that the version and the
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // install source match. "Higher" precedence means that the version is newer,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or the version matches but the install source has higher priority.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // It is only valid to invoke this when the ids match.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int CompareTo(const PendingExtensionInfo& other) const;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL update_url_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version version_;
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string install_parameter_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the extension is about to be installed, this function is
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called.  If this function returns true, the install proceeds.  If
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this function returns false, the install is aborted.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShouldAllowInstallPredicate should_allow_install_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_from_sync_;  // This update check was initiated from sync.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool install_silently_;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Manifest::Location install_source_;
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int creation_flags_;
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool mark_acknowledged_;
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool remote_install_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(::ExtensionServiceTest, AddPendingExtensionFromSync);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_INFO_H_
103