| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_EXTENSIONS_WEBSTORE_INLINE_INSTALLER_H_ |
| #define CHROME_BROWSER_EXTENSIONS_WEBSTORE_INLINE_INSTALLER_H_ |
| #pragma once |
| |
| #include <string> |
| |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/values.h" |
| #include "chrome/browser/extensions/extension_install_ui.h" |
| #include "chrome/browser/extensions/webstore_installer.h" |
| #include "chrome/browser/extensions/webstore_install_helper.h" |
| #include "content/browser/tab_contents/tab_contents_observer.h" |
| #include "content/public/common/url_fetcher_delegate.h" |
| #include "googleurl/src/gurl.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| |
| class TabContents; |
| class SafeWebstoreResponseParser; |
| |
| // Manages inline installs requested by a page (downloads and parses metadata |
| // from the webstore, shows the install UI, starts the download once the user |
| // confirms). Clients must implement the WebstoreInlineInstaller::Delegate |
| // interface to be notified when the inline install completes (successfully or |
| // not). The client will not be notified if the TabContents that this install |
| // request is attached to goes away. |
| class WebstoreInlineInstaller |
| : public base::RefCountedThreadSafe<WebstoreInlineInstaller>, |
| public ExtensionInstallUI::Delegate, |
| public TabContentsObserver, |
| public content::URLFetcherDelegate, |
| public WebstoreInstaller::Delegate, |
| public WebstoreInstallHelper::Delegate { |
| public: |
| class Delegate { |
| public: |
| virtual void OnInlineInstallSuccess(int install_id) = 0; |
| virtual void OnInlineInstallFailure(int install_id, |
| const std::string& error) = 0; |
| }; |
| |
| WebstoreInlineInstaller(TabContents* tab_contents, |
| int install_id, |
| std::string webstore_item_id, |
| GURL requestor_url, |
| Delegate* d); |
| void BeginInstall(); |
| |
| private: |
| friend class base::RefCountedThreadSafe<WebstoreInlineInstaller>; |
| friend class SafeWebstoreResponseParser; |
| |
| virtual ~WebstoreInlineInstaller(); |
| |
| // Several delegate/client inteface implementations follow. The normal flow |
| // (for successful installs) is: |
| // |
| // 1. BeginInstall: starts the fetch of data from the webstore |
| // 2. OnURLFetchComplete: starts the parsing of data from the webstore |
| // 3. OnWebstoreResponseParseSuccess: starts the parsing of the manifest and |
| // fetching of icon data. |
| // 4. OnWebstoreParseSuccess: shows the install UI |
| // 5. InstallUIProceed: initiates the .crx download/install |
| // |
| // All flows (whether successful or not) end up in CompleteInstall, which |
| // informs our delegate of success/failure. |
| |
| // content::URLFetcherDelegate interface implementation. |
| virtual void OnURLFetchComplete(const content::URLFetcher* source) OVERRIDE; |
| |
| // Client callbacks for SafeWebstoreResponseParser when parsing is complete. |
| void OnWebstoreResponseParseSuccess(DictionaryValue* webstore_data); |
| void OnWebstoreResponseParseFailure(const std::string& error); |
| |
| // WebstoreInstallHelper::Delegate interface implementation. |
| virtual void OnWebstoreParseSuccess( |
| const std::string& id, |
| const SkBitmap& icon, |
| base::DictionaryValue* parsed_manifest) OVERRIDE; |
| virtual void OnWebstoreParseFailure( |
| const std::string& id, |
| InstallHelperResultCode result_code, |
| const std::string& error_message) OVERRIDE; |
| |
| // ExtensionInstallUI::Delegate interface implementation. |
| virtual void InstallUIProceed() OVERRIDE; |
| virtual void InstallUIAbort(bool user_initiated) OVERRIDE; |
| |
| // TabContentsObserver interface implementation. |
| virtual void TabContentsDestroyed(TabContents* tab_contents) OVERRIDE; |
| |
| // WebstoreInstaller::Delegate interface implementation. |
| virtual void OnExtensionInstallSuccess(const std::string& id) OVERRIDE; |
| virtual void OnExtensionInstallFailure(const std::string& id, |
| const std::string& error) OVERRIDE; |
| |
| void CompleteInstall(const std::string& error); |
| |
| int install_id_; |
| std::string id_; |
| GURL requestor_url_; |
| Delegate* delegate_; |
| |
| // For fetching webstore JSON data. |
| scoped_ptr<content::URLFetcher> webstore_data_url_fetcher_; |
| |
| // Extracted from the webstore JSON data response. |
| std::string localized_name_; |
| std::string localized_description_; |
| std::string localized_user_count_; |
| double average_rating_; |
| int rating_count_; |
| scoped_ptr<DictionaryValue> webstore_data_; |
| scoped_ptr<DictionaryValue> manifest_; |
| scoped_refptr<Extension> dummy_extension_; |
| SkBitmap icon_; |
| |
| DISALLOW_IMPLICIT_CONSTRUCTORS(WebstoreInlineInstaller); |
| }; |
| |
| #endif // CHROME_BROWSER_EXTENSIONS_WEBSTORE_INLINE_INSTALLER_H_ |