1 // Copyright (c) 2011 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_EXTENSION_WEBSTORE_PRIVATE_API_H_ 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_WEBSTORE_PRIVATE_API_H_ 7 #pragma once 8 9 #include <string> 10 11 #include "chrome/browser/browser_signin.h" 12 #include "chrome/browser/extensions/extension_function.h" 13 #include "chrome/browser/extensions/extension_install_ui.h" 14 #include "chrome/common/net/gaia/google_service_auth_error.h" 15 #include "content/common/notification_observer.h" 16 #include "content/common/notification_registrar.h" 17 18 class ProfileSyncService; 19 20 class WebstorePrivateApi { 21 public: 22 // Allows you to set the ProfileSyncService the function will use for 23 // testing purposes. 24 static void SetTestingProfileSyncService(ProfileSyncService* service); 25 26 // Allows you to set the BrowserSignin the function will use for 27 // testing purposes. 28 static void SetTestingBrowserSignin(BrowserSignin* signin); 29 }; 30 31 // TODO(asargent): this is being deprecated in favor of 32 // BeginInstallWithManifestFunction. See crbug.com/75821 for details. 33 class BeginInstallFunction : public SyncExtensionFunction { 34 public: 35 // For use only in tests - sets a flag that can cause this function to ignore 36 // the normal requirement that it is called during a user gesture. 37 static void SetIgnoreUserGestureForTests(bool ignore); 38 protected: 39 virtual bool RunImpl(); 40 DECLARE_EXTENSION_FUNCTION_NAME("webstorePrivate.beginInstall"); 41 }; 42 43 class BeginInstallWithManifestFunction : public AsyncExtensionFunction, 44 public ExtensionInstallUI::Delegate { 45 public: 46 BeginInstallWithManifestFunction(); 47 48 // Result codes for the return value. If you change this, make sure to 49 // update the description for the beginInstallWithManifest callback in 50 // extension_api.json. 51 enum ResultCode { 52 ERROR_NONE = 0, 53 54 // An unspecified error occurred. 55 UNKNOWN_ERROR, 56 57 // The user cancelled the confirmation dialog instead of accepting it. 58 USER_CANCELLED, 59 60 // The manifest failed to parse correctly. 61 MANIFEST_ERROR, 62 63 // There was a problem parsing the base64 encoded icon data. 64 ICON_ERROR, 65 66 // The extension id was invalid. 67 INVALID_ID, 68 69 // The page does not have permission to call this function. 70 PERMISSION_DENIED, 71 72 // The function was not called during a user gesture. 73 NO_GESTURE, 74 }; 75 76 // For use only in tests - sets a flag that can cause this function to ignore 77 // the normal requirement that it is called during a user gesture. 78 static void SetIgnoreUserGestureForTests(bool ignore); 79 80 // Called when we've successfully parsed the manifest and icon data in the 81 // utility process. Ownership of parsed_manifest is transferred. 82 void OnParseSuccess(const SkBitmap& icon, DictionaryValue* parsed_manifest); 83 84 // Called to indicate a parse failure. The |result_code| parameter should 85 // indicate whether the problem was with the manifest or icon data. 86 void OnParseFailure(ResultCode result_code, const std::string& error_message); 87 88 // Implementing ExtensionInstallUI::Delegate interface. 89 virtual void InstallUIProceed() OVERRIDE; 90 virtual void InstallUIAbort() OVERRIDE; 91 92 protected: 93 virtual ~BeginInstallWithManifestFunction(); 94 virtual bool RunImpl(); 95 96 // Sets the result_ as a string based on |code|. 97 void SetResult(ResultCode code); 98 99 private: 100 // These store the input parameters to the function. 101 std::string id_; 102 std::string manifest_; 103 std::string icon_data_; 104 105 // The results of parsing manifest_ and icon_data_ go into these two. 106 scoped_ptr<DictionaryValue> parsed_manifest_; 107 SkBitmap icon_; 108 109 // A dummy Extension object we create for the purposes of using 110 // ExtensionInstallUI to prompt for confirmation of the install. 111 scoped_refptr<Extension> dummy_extension_; 112 DECLARE_EXTENSION_FUNCTION_NAME("webstorePrivate.beginInstallWithManifest"); 113 }; 114 115 class CompleteInstallFunction : public SyncExtensionFunction { 116 virtual bool RunImpl(); 117 DECLARE_EXTENSION_FUNCTION_NAME("webstorePrivate.completeInstall"); 118 }; 119 120 class GetBrowserLoginFunction : public SyncExtensionFunction { 121 virtual bool RunImpl(); 122 DECLARE_EXTENSION_FUNCTION_NAME("webstorePrivate.getBrowserLogin"); 123 }; 124 125 class GetStoreLoginFunction : public SyncExtensionFunction { 126 virtual bool RunImpl(); 127 DECLARE_EXTENSION_FUNCTION_NAME("webstorePrivate.getStoreLogin"); 128 }; 129 130 class SetStoreLoginFunction : public SyncExtensionFunction { 131 virtual bool RunImpl(); 132 DECLARE_EXTENSION_FUNCTION_NAME("webstorePrivate.setStoreLogin"); 133 }; 134 135 class PromptBrowserLoginFunction : public AsyncExtensionFunction, 136 public NotificationObserver, 137 public BrowserSignin::SigninDelegate { 138 public: 139 PromptBrowserLoginFunction(); 140 // Implements BrowserSignin::SigninDelegate interface. 141 virtual void OnLoginSuccess(); 142 virtual void OnLoginFailure(const GoogleServiceAuthError& error); 143 144 // Implements the NotificationObserver interface. 145 virtual void Observe(NotificationType type, 146 const NotificationSource& source, 147 const NotificationDetails& details); 148 149 protected: 150 virtual ~PromptBrowserLoginFunction(); 151 virtual bool RunImpl(); 152 153 private: 154 // Creates the message for signing in. 155 virtual string16 GetLoginMessage(); 156 157 // Are we waiting for a token available notification? 158 bool waiting_for_token_; 159 160 // Used for listening for TokenService notifications. 161 NotificationRegistrar registrar_; 162 163 DECLARE_EXTENSION_FUNCTION_NAME("webstorePrivate.promptBrowserLogin"); 164 }; 165 166 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_WEBSTORE_PRIVATE_API_H_ 167