Home | History | Annotate | Download | only in webstore_private
      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_API_WEBSTORE_PRIVATE_WEBSTORE_PRIVATE_API_H_
      6 #define CHROME_BROWSER_EXTENSIONS_API_WEBSTORE_PRIVATE_WEBSTORE_PRIVATE_API_H_
      7 
      8 #include <string>
      9 
     10 #include "chrome/browser/extensions/active_install_data.h"
     11 #include "chrome/browser/extensions/bundle_installer.h"
     12 #include "chrome/browser/extensions/chrome_extension_function.h"
     13 #include "chrome/browser/extensions/extension_install_prompt.h"
     14 #include "chrome/browser/extensions/webstore_install_helper.h"
     15 #include "chrome/browser/extensions/webstore_installer.h"
     16 #include "chrome/common/extensions/api/webstore_private.h"
     17 #include "chrome/common/extensions/webstore_install_result.h"
     18 #include "content/public/browser/gpu_data_manager_observer.h"
     19 #include "content/public/browser/notification_observer.h"
     20 #include "content/public/browser/notification_registrar.h"
     21 #include "google_apis/gaia/google_service_auth_error.h"
     22 #include "third_party/skia/include/core/SkBitmap.h"
     23 
     24 class ProfileSyncService;
     25 
     26 namespace content {
     27 class GpuDataManager;
     28 }
     29 
     30 class GPUFeatureChecker;
     31 
     32 namespace extensions {
     33 
     34 class WebstorePrivateApi {
     35  public:
     36   // Allows you to override the WebstoreInstaller delegate for testing.
     37   static void SetWebstoreInstallerDelegateForTesting(
     38       WebstoreInstaller::Delegate* delegate);
     39 
     40   // Gets the pending approval for the |extension_id| in |profile|. Pending
     41   // approvals are held between the calls to beginInstallWithManifest and
     42   // completeInstall. This should only be used for testing.
     43   static scoped_ptr<WebstoreInstaller::Approval> PopApprovalForTesting(
     44       Profile* profile, const std::string& extension_id);
     45 };
     46 
     47 class WebstorePrivateInstallBundleFunction
     48     : public ChromeAsyncExtensionFunction,
     49       public extensions::BundleInstaller::Delegate {
     50  public:
     51   DECLARE_EXTENSION_FUNCTION("webstorePrivate.installBundle",
     52                              WEBSTOREPRIVATE_INSTALLBUNDLE)
     53 
     54   WebstorePrivateInstallBundleFunction();
     55 
     56   // BundleInstaller::Delegate:
     57   virtual void OnBundleInstallApproved() OVERRIDE;
     58   virtual void OnBundleInstallCanceled(bool user_initiated) OVERRIDE;
     59   virtual void OnBundleInstallCompleted() OVERRIDE;
     60 
     61  protected:
     62   virtual ~WebstorePrivateInstallBundleFunction();
     63 
     64   // ExtensionFunction:
     65   virtual bool RunAsync() OVERRIDE;
     66 
     67   // Reads the extension |details| into |items|.
     68   bool ReadBundleInfo(
     69       const api::webstore_private::InstallBundle::Params& details,
     70           extensions::BundleInstaller::ItemList* items);
     71 
     72  private:
     73   scoped_refptr<extensions::BundleInstaller> bundle_;
     74 };
     75 
     76 class WebstorePrivateBeginInstallWithManifest3Function
     77     : public ChromeAsyncExtensionFunction,
     78       public ExtensionInstallPrompt::Delegate,
     79       public WebstoreInstallHelper::Delegate {
     80  public:
     81   DECLARE_EXTENSION_FUNCTION("webstorePrivate.beginInstallWithManifest3",
     82                              WEBSTOREPRIVATE_BEGININSTALLWITHMANIFEST3)
     83 
     84   // Result codes for the return value. If you change this, make sure to
     85   // update the description for the beginInstallWithManifest3 callback in
     86   // the extension API JSON.
     87   enum ResultCode {
     88     ERROR_NONE = 0,
     89 
     90     // An unspecified error occurred.
     91     UNKNOWN_ERROR,
     92 
     93     // The user cancelled the confirmation dialog instead of accepting it.
     94     USER_CANCELLED,
     95 
     96     // The manifest failed to parse correctly.
     97     MANIFEST_ERROR,
     98 
     99     // There was a problem parsing the base64 encoded icon data.
    100     ICON_ERROR,
    101 
    102     // The extension id was invalid.
    103     INVALID_ID,
    104 
    105     // The page does not have permission to call this function.
    106     PERMISSION_DENIED,
    107 
    108     // Invalid icon url.
    109     INVALID_ICON_URL,
    110 
    111     // An extension with the same extension id has already been installed.
    112     ALREADY_INSTALLED,
    113   };
    114 
    115   WebstorePrivateBeginInstallWithManifest3Function();
    116 
    117   // WebstoreInstallHelper::Delegate:
    118   virtual void OnWebstoreParseSuccess(
    119       const std::string& id,
    120       const SkBitmap& icon,
    121       base::DictionaryValue* parsed_manifest) OVERRIDE;
    122   virtual void OnWebstoreParseFailure(
    123       const std::string& id,
    124       InstallHelperResultCode result_code,
    125       const std::string& error_message) OVERRIDE;
    126 
    127   // ExtensionInstallPrompt::Delegate:
    128   virtual void InstallUIProceed() OVERRIDE;
    129   virtual void InstallUIAbort(bool user_initiated) OVERRIDE;
    130 
    131  protected:
    132   virtual ~WebstorePrivateBeginInstallWithManifest3Function();
    133 
    134   // ExtensionFunction:
    135   virtual bool RunAsync() OVERRIDE;
    136 
    137   // Sets the result_ as a string based on |code|.
    138   void SetResultCode(ResultCode code);
    139 
    140  private:
    141   const char* ResultCodeToString(ResultCode code);
    142 
    143   // These store the input parameters to the function.
    144   scoped_ptr<api::webstore_private::BeginInstallWithManifest3::Params> params_;
    145 
    146   // The results of parsing manifest_ and icon_data_ go into these two.
    147   scoped_ptr<base::DictionaryValue> parsed_manifest_;
    148   SkBitmap icon_;
    149 
    150   // A dummy Extension object we create for the purposes of using
    151   // ExtensionInstallPrompt to prompt for confirmation of the install.
    152   scoped_refptr<extensions::Extension> dummy_extension_;
    153 
    154   // The class that displays the install prompt.
    155   scoped_ptr<ExtensionInstallPrompt> install_prompt_;
    156 
    157   scoped_ptr<ScopedActiveInstall> scoped_active_install_;
    158 
    159   // The authuser query parameter value which should be used with CRX download
    160   // requests. This is empty if authuser should not be set on download requests.
    161   std::string authuser_;
    162 };
    163 
    164 class WebstorePrivateCompleteInstallFunction
    165     : public ChromeAsyncExtensionFunction,
    166       public WebstoreInstaller::Delegate {
    167  public:
    168   DECLARE_EXTENSION_FUNCTION("webstorePrivate.completeInstall",
    169                              WEBSTOREPRIVATE_COMPLETEINSTALL)
    170 
    171   WebstorePrivateCompleteInstallFunction();
    172 
    173   // WebstoreInstaller::Delegate:
    174   virtual void OnExtensionInstallSuccess(const std::string& id) OVERRIDE;
    175   virtual void OnExtensionInstallFailure(
    176       const std::string& id,
    177       const std::string& error,
    178       WebstoreInstaller::FailureReason reason) OVERRIDE;
    179 
    180  protected:
    181   virtual ~WebstorePrivateCompleteInstallFunction();
    182 
    183   // ExtensionFunction:
    184   virtual bool RunAsync() OVERRIDE;
    185 
    186  private:
    187   scoped_ptr<WebstoreInstaller::Approval> approval_;
    188   scoped_ptr<ScopedActiveInstall> scoped_active_install_;
    189 
    190   void OnInstallSuccess(const std::string& id);
    191 };
    192 
    193 class WebstorePrivateEnableAppLauncherFunction
    194     : public ChromeSyncExtensionFunction {
    195  public:
    196   DECLARE_EXTENSION_FUNCTION("webstorePrivate.enableAppLauncher",
    197                              WEBSTOREPRIVATE_ENABLEAPPLAUNCHER)
    198 
    199   WebstorePrivateEnableAppLauncherFunction();
    200 
    201  protected:
    202   virtual ~WebstorePrivateEnableAppLauncherFunction();
    203 
    204   // ExtensionFunction:
    205   virtual bool RunSync() OVERRIDE;
    206 };
    207 
    208 class WebstorePrivateGetBrowserLoginFunction
    209     : public ChromeSyncExtensionFunction {
    210  public:
    211   DECLARE_EXTENSION_FUNCTION("webstorePrivate.getBrowserLogin",
    212                              WEBSTOREPRIVATE_GETBROWSERLOGIN)
    213 
    214  protected:
    215   virtual ~WebstorePrivateGetBrowserLoginFunction() {}
    216 
    217   // ExtensionFunction:
    218   virtual bool RunSync() OVERRIDE;
    219 };
    220 
    221 class WebstorePrivateGetStoreLoginFunction
    222     : public ChromeSyncExtensionFunction {
    223  public:
    224   DECLARE_EXTENSION_FUNCTION("webstorePrivate.getStoreLogin",
    225                              WEBSTOREPRIVATE_GETSTORELOGIN)
    226 
    227  protected:
    228   virtual ~WebstorePrivateGetStoreLoginFunction() {}
    229 
    230   // ExtensionFunction:
    231   virtual bool RunSync() OVERRIDE;
    232 };
    233 
    234 class WebstorePrivateSetStoreLoginFunction
    235     : public ChromeSyncExtensionFunction {
    236  public:
    237   DECLARE_EXTENSION_FUNCTION("webstorePrivate.setStoreLogin",
    238                              WEBSTOREPRIVATE_SETSTORELOGIN)
    239 
    240  protected:
    241   virtual ~WebstorePrivateSetStoreLoginFunction() {}
    242 
    243   // ExtensionFunction:
    244   virtual bool RunSync() OVERRIDE;
    245 };
    246 
    247 class WebstorePrivateGetWebGLStatusFunction
    248     : public ChromeAsyncExtensionFunction {
    249  public:
    250   DECLARE_EXTENSION_FUNCTION("webstorePrivate.getWebGLStatus",
    251                              WEBSTOREPRIVATE_GETWEBGLSTATUS)
    252 
    253   WebstorePrivateGetWebGLStatusFunction();
    254 
    255  protected:
    256   virtual ~WebstorePrivateGetWebGLStatusFunction();
    257 
    258   void OnFeatureCheck(bool feature_allowed);
    259 
    260   // ExtensionFunction:
    261   virtual bool RunAsync() OVERRIDE;
    262 
    263  private:
    264   void CreateResult(bool webgl_allowed);
    265 
    266   scoped_refptr<GPUFeatureChecker> feature_checker_;
    267 };
    268 
    269 class WebstorePrivateGetIsLauncherEnabledFunction
    270     : public ChromeSyncExtensionFunction {
    271  public:
    272   DECLARE_EXTENSION_FUNCTION("webstorePrivate.getIsLauncherEnabled",
    273                              WEBSTOREPRIVATE_GETISLAUNCHERENABLED)
    274 
    275   WebstorePrivateGetIsLauncherEnabledFunction() {}
    276 
    277  protected:
    278   virtual ~WebstorePrivateGetIsLauncherEnabledFunction() {}
    279 
    280   // ExtensionFunction:
    281   virtual bool RunSync() OVERRIDE;
    282 
    283  private:
    284   void OnIsLauncherCheckCompleted(bool is_enabled);
    285 };
    286 
    287 class WebstorePrivateIsInIncognitoModeFunction
    288     : public ChromeSyncExtensionFunction {
    289  public:
    290   DECLARE_EXTENSION_FUNCTION("webstorePrivate.isInIncognitoMode",
    291                              WEBSTOREPRIVATE_ISININCOGNITOMODEFUNCTION)
    292 
    293   WebstorePrivateIsInIncognitoModeFunction() {}
    294 
    295  protected:
    296   virtual ~WebstorePrivateIsInIncognitoModeFunction() {}
    297 
    298   // ExtensionFunction:
    299   virtual bool RunSync() OVERRIDE;
    300 };
    301 
    302 class WebstorePrivateLaunchEphemeralAppFunction
    303     : public ChromeAsyncExtensionFunction {
    304  public:
    305   DECLARE_EXTENSION_FUNCTION("webstorePrivate.launchEphemeralApp",
    306                              WEBSTOREPRIVATE_LAUNCHEPHEMERALAPP)
    307 
    308   WebstorePrivateLaunchEphemeralAppFunction();
    309 
    310  protected:
    311   virtual ~WebstorePrivateLaunchEphemeralAppFunction();
    312 
    313   // ExtensionFunction:
    314   virtual bool RunAsync() OVERRIDE;
    315 
    316  private:
    317   void OnLaunchComplete(webstore_install::Result result,
    318                         const std::string& error);
    319   void SetResult(
    320       api::webstore_private::LaunchEphemeralApp::Results::Result result,
    321       const std::string& error);
    322 };
    323 
    324 class WebstorePrivateGetEphemeralAppsEnabledFunction
    325     : public ChromeSyncExtensionFunction {
    326  public:
    327   DECLARE_EXTENSION_FUNCTION("webstorePrivate.getEphemeralAppsEnabled",
    328                              WEBSTOREPRIVATE_GETEPHEMERALAPPSENABLED)
    329 
    330   WebstorePrivateGetEphemeralAppsEnabledFunction();
    331 
    332  protected:
    333   virtual ~WebstorePrivateGetEphemeralAppsEnabledFunction();
    334 
    335   // ExtensionFunction:
    336   virtual bool RunSync() OVERRIDE;
    337 };
    338 
    339 }  // namespace extensions
    340 
    341 #endif  // CHROME_BROWSER_EXTENSIONS_API_WEBSTORE_PRIVATE_WEBSTORE_PRIVATE_API_H_
    342