| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ | 5 #ifndef CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ |
| 6 #define CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ | 6 #define CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/callback_forward.h" |
| 11 #include "base/memory/linked_ptr.h" | 12 #include "base/memory/linked_ptr.h" |
| 12 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/strings/string16.h" | 14 #include "base/strings/string16.h" |
| 14 #include "chrome/browser/extensions/extension_install_prompt.h" | 15 #include "chrome/browser/extensions/extension_install_prompt.h" |
| 15 #include "chrome/browser/extensions/webstore_install_helper.h" | 16 #include "chrome/browser/extensions/webstore_install_helper.h" |
| 16 #include "chrome/browser/extensions/webstore_installer.h" | 17 #include "chrome/browser/extensions/webstore_installer.h" |
| 17 #include "chrome/browser/ui/browser_list_observer.h" | 18 #include "chrome/browser/ui/browser_list_observer.h" |
| 18 #include "chrome/browser/ui/host_desktop.h" | 19 #include "chrome/browser/ui/host_desktop.h" |
| 19 #include "extensions/common/extension.h" | 20 #include "extensions/common/extension.h" |
| 21 #include "third_party/skia/include/core/SkBitmap.h" |
| 22 #include "url/gurl.h" |
| 20 | 23 |
| 21 namespace base { | 24 namespace base { |
| 22 class DictionaryValue; | 25 class DictionaryValue; |
| 23 } // namespace base | 26 } // namespace base |
| 24 | 27 |
| 25 namespace content { | 28 namespace content { |
| 26 class WebContents; | 29 class WebContents; |
| 27 } // namespace content | 30 } // namespace content |
| 28 | 31 |
| 29 class Browser; | 32 class Browser; |
| 30 class Profile; | 33 class Profile; |
| 31 | 34 |
| 32 namespace extensions { | 35 namespace extensions { |
| 33 | 36 |
| 34 // Manages the installation life cycle for extension bundles. | 37 // Manages the installation life cycle for extension bundles. |
| 35 // | 38 // |
| 36 // We install bundles in two steps: | 39 // We install bundles in two steps: |
| 37 // 1) PromptForApproval: parse manifests and prompt the user | 40 // 1) PromptForApproval: parse manifests and prompt the user |
| 38 // 2) CompleteInstall: install the CRXs and show confirmation bubble | 41 // 2) CompleteInstall: install the CRXs and show confirmation bubble |
| 39 // | 42 // |
| 40 class BundleInstaller : public WebstoreInstallHelper::Delegate, | 43 class BundleInstaller : public WebstoreInstallHelper::Delegate, |
| 41 public ExtensionInstallPrompt::Delegate, | 44 public ExtensionInstallPrompt::Delegate, |
| 42 public WebstoreInstaller::Delegate, | 45 public WebstoreInstaller::Delegate, |
| 43 public chrome::BrowserListObserver, | 46 public chrome::BrowserListObserver { |
| 44 public base::RefCountedThreadSafe<BundleInstaller> { | |
| 45 public: | 47 public: |
| 46 // Auto approve or cancel the permission prompt. | 48 // Auto approve or cancel the permission prompt. |
| 47 static void SetAutoApproveForTesting(bool approve); | 49 static void SetAutoApproveForTesting(bool approve); |
| 48 | 50 |
| 49 class Delegate { | |
| 50 public: | |
| 51 virtual void OnBundleInstallApproved() {} | |
| 52 virtual void OnBundleInstallCanceled(bool user_initiated) {} | |
| 53 virtual void OnBundleInstallCompleted() {} | |
| 54 | |
| 55 protected: | |
| 56 virtual ~Delegate() {} | |
| 57 }; | |
| 58 | |
| 59 // Represents an individual member of the bundle. | 51 // Represents an individual member of the bundle. |
| 60 struct Item { | 52 struct Item { |
| 61 // Items are in the PENDING state until they've been installed, or the | 53 // Items are in the PENDING state until they've been installed, or the |
| 62 // install has failed or been canceled. | 54 // install has failed or been canceled. |
| 63 enum State { | 55 enum State { |
| 64 STATE_PENDING, | 56 STATE_PENDING, |
| 65 STATE_INSTALLED, | 57 STATE_INSTALLED, |
| 66 STATE_FAILED | 58 STATE_FAILED |
| 67 }; | 59 }; |
| 68 | 60 |
| 69 Item(); | 61 Item(); |
| 62 ~Item(); |
| 70 | 63 |
| 71 // Gets the localized name, formatted for display in the prompt or bubble. | 64 // Gets the localized name, formatted for display in the bubble. |
| 72 base::string16 GetNameForDisplay(); | 65 base::string16 GetNameForDisplay() const; |
| 73 | 66 |
| 74 std::string id; | 67 std::string id; |
| 75 std::string manifest; | 68 std::string manifest; |
| 76 std::string localized_name; | 69 std::string localized_name; |
| 70 GURL icon_url; |
| 71 SkBitmap icon; |
| 77 State state; | 72 State state; |
| 78 }; | 73 }; |
| 79 | 74 |
| 75 enum ApprovalState { |
| 76 APPROVED, |
| 77 USER_CANCELED, |
| 78 APPROVAL_ERROR |
| 79 }; |
| 80 |
| 81 typedef base::Callback<void(ApprovalState)> ApprovalCallback; |
| 82 |
| 80 typedef std::vector<Item> ItemList; | 83 typedef std::vector<Item> ItemList; |
| 81 | 84 |
| 82 BundleInstaller(Browser* browser, const ItemList& items); | 85 BundleInstaller(Browser* browser, |
| 86 const std::string& name, |
| 87 const SkBitmap& icon, |
| 88 const std::string& authuser, |
| 89 const ItemList& items); |
| 90 ~BundleInstaller() override; |
| 83 | 91 |
| 84 // Returns true if the user has approved the bundle's permissions. | 92 // Returns true if the user has approved the bundle's permissions. |
| 85 bool approved() const { return approved_; } | 93 bool approved() const { return approved_; } |
| 86 | 94 |
| 87 // Gets the items in the given state. | 95 // Returns the browser window associated with the bundle's installation. |
| 96 // Can return null if the browser is closed during the installation. |
| 97 Browser* browser() { return browser_; } |
| 98 |
| 99 // Gets the items in the given |state|. |
| 88 ItemList GetItemsWithState(Item::State state) const; | 100 ItemList GetItemsWithState(Item::State state) const; |
| 89 | 101 |
| 102 // Returns whether there is at least one item with the given |state|. |
| 103 bool HasItemWithState(Item::State state) const; |
| 104 |
| 105 // Returns the number of items with the given |state|. |
| 106 size_t CountItemsWithState(Item::State state) const; |
| 107 |
| 90 // Parses the extension manifests and then prompts the user to approve their | 108 // Parses the extension manifests and then prompts the user to approve their |
| 91 // permissions. One of OnBundleInstallApproved or OnBundleInstallCanceled | 109 // permissions. |
| 92 // will be called when complete if |delegate| is not NULL. | 110 void PromptForApproval(const ApprovalCallback& callback); |
| 93 // Note: the |delegate| must stay alive until receiving the callback. | |
| 94 void PromptForApproval(Delegate* delegate); | |
| 95 | 111 |
| 96 // If the bundle has been approved, this downloads and installs the member | 112 // If the bundle has been approved, this downloads and installs the member |
| 97 // extensions. OnBundleInstallComplete will be called when the process is | 113 // extensions. The download process uses the NavigationController of the |
| 98 // complete and |delegate| is not NULL. The download process uses the | 114 // specified |web_contents|. When complete, we show a confirmation bubble. |
| 99 // NavigationController of the specified |web_contents|. When complete, we | 115 void CompleteInstall(content::WebContents* web_contents, |
| 100 // show a confirmation bubble in the specified |browser|. | 116 const base::Closure& callback); |
| 101 // Note: the |delegate| must stay alive until receiving the callback. | |
| 102 void CompleteInstall(content::WebContents* web_contents, Delegate* delegate); | |
| 103 | 117 |
| 104 // We change the headings in the install prompt and installed bubble depending | 118 // We change the headings in the install prompt and installed bubble depending |
| 105 // on whether the bundle contains apps, extensions or both. This method gets | 119 // on whether the bundle contains apps, extensions or both. This method gets |
| 106 // the correct heading for the items in the specified |state|, or an empty | 120 // the correct heading for the items in the specified |state|, or an empty |
| 107 // string if no items are in the |state|. | 121 // string if no items are in the |state|. |
| 108 // STATE_PENDING - install prompt | 122 // STATE_PENDING - install prompt |
| 109 // STATE_INSTALLED - installed bubble successful installs list | 123 // STATE_INSTALLED - installed bubble successful installs list |
| 110 // STATE_FAILED - installed bubble failed installs list | 124 // STATE_FAILED - installed bubble failed installs list |
| 111 base::string16 GetHeadingTextFor(Item::State state) const; | 125 base::string16 GetHeadingTextFor(Item::State state) const; |
| 112 | 126 |
| 113 private: | 127 private: |
| 114 friend class base::RefCountedThreadSafe<BundleInstaller>; | |
| 115 | |
| 116 typedef std::map<std::string, Item> ItemMap; | 128 typedef std::map<std::string, Item> ItemMap; |
| 117 typedef std::map<std::string, linked_ptr<base::DictionaryValue> > ManifestMap; | 129 typedef std::map<std::string, linked_ptr<base::DictionaryValue> > ManifestMap; |
| 118 | 130 |
| 119 ~BundleInstaller() override; | |
| 120 | |
| 121 // Displays the install bubble for |bundle| on |browser|. | 131 // Displays the install bubble for |bundle| on |browser|. |
| 122 // Note: this is a platform specific implementation. | 132 // Note: this is a platform specific implementation. |
| 123 static void ShowInstalledBubble(const BundleInstaller* bundle, | 133 static void ShowInstalledBubble(const BundleInstaller* bundle, |
| 124 Browser* browser); | 134 Browser* browser); |
| 125 | 135 |
| 126 // Parses the manifests using WebstoreInstallHelper. | 136 // Parses the manifests using WebstoreInstallHelper. |
| 127 void ParseManifests(); | 137 void ParseManifests(); |
| 128 | 138 |
| 129 // Notifies the delegate that the installation has been approved. | |
| 130 void ReportApproved(); | |
| 131 | |
| 132 // Notifies the delegate that the installation was canceled. | |
| 133 void ReportCanceled(bool user_initiated); | |
| 134 | |
| 135 // Notifies the delegate that the installation is complete. | |
| 136 void ReportComplete(); | |
| 137 | |
| 138 // Prompts the user to install the bundle once we have dummy extensions for | 139 // Prompts the user to install the bundle once we have dummy extensions for |
| 139 // all the pending items. | 140 // all the pending items. |
| 140 void ShowPromptIfDoneParsing(); | 141 void ShowPromptIfDoneParsing(); |
| 141 | 142 |
| 142 // Prompts the user to install the bundle. | 143 // Prompts the user to install the bundle. |
| 143 void ShowPrompt(); | 144 void ShowPrompt(); |
| 144 | 145 |
| 145 // Displays the installed bubble once all items have installed or failed. | 146 // Displays the installed bubble once all items have installed or failed. |
| 146 void ShowInstalledBubbleIfDone(); | 147 void ShowInstalledBubbleIfDone(); |
| 147 | 148 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 158 void InstallUIAbort(bool user_initiated) override; | 159 void InstallUIAbort(bool user_initiated) override; |
| 159 | 160 |
| 160 // WebstoreInstaller::Delegate implementation: | 161 // WebstoreInstaller::Delegate implementation: |
| 161 void OnExtensionInstallSuccess(const std::string& id) override; | 162 void OnExtensionInstallSuccess(const std::string& id) override; |
| 162 void OnExtensionInstallFailure( | 163 void OnExtensionInstallFailure( |
| 163 const std::string& id, | 164 const std::string& id, |
| 164 const std::string& error, | 165 const std::string& error, |
| 165 WebstoreInstaller::FailureReason reason) override; | 166 WebstoreInstaller::FailureReason reason) override; |
| 166 | 167 |
| 167 // chrome::BrowserListObserver implementation: | 168 // chrome::BrowserListObserver implementation: |
| 168 void OnBrowserAdded(Browser* browser) override; | |
| 169 void OnBrowserRemoved(Browser* browser) override; | 169 void OnBrowserRemoved(Browser* browser) override; |
| 170 void OnBrowserSetLastActive(Browser* browser) override; | |
| 171 | 170 |
| 172 // Holds the Extensions used to generate the permission warnings. | 171 // Holds the Extensions used to generate the permission warnings. |
| 173 ExtensionList dummy_extensions_; | 172 ExtensionList dummy_extensions_; |
| 174 | 173 |
| 175 // Holds the parsed manifests, indexed by the extension ids. | 174 // Holds the parsed manifests, indexed by the extension ids. |
| 176 ManifestMap parsed_manifests_; | 175 ManifestMap parsed_manifests_; |
| 177 | 176 |
| 178 // True if the user has approved the bundle. | 177 // True if the user has approved the bundle. |
| 179 bool approved_; | 178 bool approved_; |
| 180 | 179 |
| 181 // Holds the bundle's Items, indexed by their ids. | 180 // Holds the bundle's Items, indexed by their ids. |
| 182 ItemMap items_; | 181 ItemMap items_; |
| 183 | 182 |
| 184 // The browser to show the confirmation bubble for. | 183 // The browser to show the confirmation bubble for. |
| 185 Browser* browser_; | 184 Browser* browser_; |
| 186 | 185 |
| 186 // The bundle's display name. |
| 187 std::string name_; |
| 188 |
| 189 // The bundle's icon. |
| 190 SkBitmap icon_; |
| 191 |
| 192 // The authuser query parameter value which should be used with CRX download |
| 193 // requests. May be empty. |
| 194 std::string authuser_; |
| 195 |
| 187 // The desktop type of the browser. | 196 // The desktop type of the browser. |
| 188 chrome::HostDesktopType host_desktop_type_; | 197 chrome::HostDesktopType host_desktop_type_; |
| 189 | 198 |
| 190 // The profile that the bundle should be installed in. | 199 // The profile that the bundle should be installed in. |
| 191 Profile* profile_; | 200 Profile* profile_; |
| 192 | 201 |
| 193 // The UI that shows the confirmation prompt. | 202 // The UI that shows the confirmation prompt. |
| 194 scoped_ptr<ExtensionInstallPrompt> install_ui_; | 203 scoped_ptr<ExtensionInstallPrompt> install_ui_; |
| 195 | 204 |
| 196 Delegate* delegate_; | 205 ApprovalCallback approval_callback_; |
| 206 base::Closure install_callback_; |
| 197 | 207 |
| 198 DISALLOW_COPY_AND_ASSIGN(BundleInstaller); | 208 DISALLOW_COPY_AND_ASSIGN(BundleInstaller); |
| 199 }; | 209 }; |
| 200 | 210 |
| 201 } // namespace extensions | 211 } // namespace extensions |
| 202 | 212 |
| 203 #endif // CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ | 213 #endif // CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ |
| OLD | NEW |