Home | History | Annotate | Download | only in extensions
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALL_HELPER_H_
      6 #define CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALL_HELPER_H_
      7 
      8 #include <vector>
      9 
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/memory/weak_ptr.h"
     12 #include "content/public/browser/utility_process_host_client.h"
     13 #include "net/url_request/url_fetcher_delegate.h"
     14 #include "third_party/skia/include/core/SkBitmap.h"
     15 #include "url/gurl.h"
     16 
     17 class SkBitmap;
     18 
     19 namespace base {
     20 class DictionaryValue;
     21 class ListValue;
     22 }
     23 
     24 namespace content {
     25 class UtilityProcessHost;
     26 }
     27 
     28 namespace net {
     29 class URLFetcher;
     30 class URLRequestContextGetter;
     31 }
     32 
     33 namespace extensions {
     34 
     35 // This is a class to help dealing with webstore-provided data. It manages
     36 // sending work to the utility process for parsing manifests and
     37 // fetching/decoding icon data. Clients must implement the
     38 // WebstoreInstallHelper::Delegate interface to receive the parsed data.
     39 class WebstoreInstallHelper : public content::UtilityProcessHostClient,
     40                               public net::URLFetcherDelegate {
     41  public:
     42   class Delegate {
     43    public:
     44     enum InstallHelperResultCode {
     45       UNKNOWN_ERROR,
     46       ICON_ERROR,
     47       MANIFEST_ERROR
     48     };
     49 
     50     // Called when we've successfully parsed the manifest and decoded the icon
     51     // in the utility process. Ownership of parsed_manifest is transferred.
     52     virtual void OnWebstoreParseSuccess(
     53         const std::string& id,
     54         const SkBitmap& icon,
     55         base::DictionaryValue* parsed_manifest) = 0;
     56 
     57     // Called to indicate a parse failure. The |result_code| parameter should
     58     // indicate whether the problem was with the manifest or icon.
     59     virtual void OnWebstoreParseFailure(
     60         const std::string& id,
     61         InstallHelperResultCode result_code,
     62         const std::string& error_message) = 0;
     63 
     64    protected:
     65     virtual ~Delegate() {}
     66   };
     67 
     68   // Only one of |icon_data| (based64-encoded icon data) or |icon_url| can be
     69   // specified, but it is legal for both to be empty.
     70   WebstoreInstallHelper(Delegate* delegate,
     71                         const std::string& id,
     72                         const std::string& manifest,
     73                         const std::string& icon_data,
     74                         const GURL& icon_url,
     75                         net::URLRequestContextGetter* context_getter);
     76   void Start();
     77 
     78  private:
     79   virtual ~WebstoreInstallHelper();
     80 
     81   void StartWorkOnIOThread();
     82   void StartFetchedImageDecode();
     83   void ReportResultsIfComplete();
     84   void ReportResultFromUIThread();
     85 
     86   // Implementing the net::URLFetcherDelegate interface.
     87   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
     88 
     89   // Implementing pieces of the UtilityProcessHostClient interface.
     90   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     91 
     92   // Message handlers.
     93   void OnDecodeImageSucceeded(const SkBitmap& decoded_image);
     94   void OnDecodeImageFailed();
     95   void OnJSONParseSucceeded(const base::ListValue& wrapper);
     96   void OnJSONParseFailed(const std::string& error_message);
     97 
     98   // The client who we'll report results back to.
     99   Delegate* delegate_;
    100 
    101   // The extension id of the manifest we're parsing.
    102   std::string id_;
    103 
    104   // The manifest to parse.
    105   std::string manifest_;
    106 
    107   // Only one of these should be non-empty. If |icon_base64_data_| is non-emtpy,
    108   // it's a base64-encoded string that needs to be parsed into an SkBitmap. If
    109   // |icon_url_| is non-empty, it needs to be fetched and decoded into an
    110   // SkBitmap.
    111   std::string icon_base64_data_;
    112   GURL icon_url_;
    113   std::vector<unsigned char> fetched_icon_data_;
    114 
    115   // For fetching the icon, if needed.
    116   scoped_ptr<net::URLFetcher> url_fetcher_;
    117   net::URLRequestContextGetter* context_getter_; // Only usable on UI thread.
    118 
    119   base::WeakPtr<content::UtilityProcessHost> utility_host_;
    120 
    121   // Flags for whether we're done doing icon decoding and manifest parsing.
    122   bool icon_decode_complete_;
    123   bool manifest_parse_complete_;
    124 
    125   // The results of succesful decoding/parsing.
    126   SkBitmap icon_;
    127   scoped_ptr<base::DictionaryValue> parsed_manifest_;
    128 
    129   // A details string for keeping track of any errors.
    130   std::string error_;
    131 
    132   // A code to distinguish between an error with the icon, and an error with the
    133   // manifest.
    134   Delegate::InstallHelperResultCode parse_error_;
    135 };
    136 
    137 }  // namespace extensions
    138 
    139 #endif  // CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALL_HELPER_H_
    140