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