| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include "chrome/browser/extensions/extension_reenabler.h" | 5 #include "chrome/browser/extensions/extension_reenabler.h" | 
| 6 | 6 | 
| 7 #include "base/logging.h" | 7 #include "base/logging.h" | 
|  | 8 #include "base/memory/ptr_util.h" | 
| 8 #include "chrome/browser/extensions/extension_service.h" | 9 #include "chrome/browser/extensions/extension_service.h" | 
| 9 #include "chrome/browser/extensions/webstore_data_fetcher.h" | 10 #include "chrome/browser/extensions/webstore_data_fetcher.h" | 
| 10 #include "chrome/browser/extensions/webstore_inline_installer.h" | 11 #include "chrome/browser/extensions/webstore_inline_installer.h" | 
| 11 #include "content/public/browser/browser_context.h" | 12 #include "content/public/browser/browser_context.h" | 
| 12 #include "content/public/browser/web_contents.h" | 13 #include "content/public/browser/web_contents.h" | 
| 13 #include "extensions/browser/extension_prefs.h" | 14 #include "extensions/browser/extension_prefs.h" | 
| 14 #include "extensions/browser/extension_registry.h" | 15 #include "extensions/browser/extension_registry.h" | 
| 15 #include "extensions/browser/extension_system.h" | 16 #include "extensions/browser/extension_system.h" | 
| 16 #include "extensions/common/extension.h" | 17 #include "extensions/common/extension.h" | 
| 17 | 18 | 
| 18 namespace extensions { | 19 namespace extensions { | 
| 19 | 20 | 
| 20 ExtensionReenabler::~ExtensionReenabler() { | 21 ExtensionReenabler::~ExtensionReenabler() { | 
| 21   if (!finished_) | 22   if (!finished_) | 
| 22     Finish(ABORTED); | 23     Finish(ABORTED); | 
| 23 } | 24 } | 
| 24 | 25 | 
| 25 // static | 26 // static | 
| 26 scoped_ptr<ExtensionReenabler> ExtensionReenabler::PromptForReenable( | 27 std::unique_ptr<ExtensionReenabler> ExtensionReenabler::PromptForReenable( | 
| 27     const scoped_refptr<const Extension>& extension, | 28     const scoped_refptr<const Extension>& extension, | 
| 28     content::BrowserContext* browser_context, | 29     content::BrowserContext* browser_context, | 
| 29     content::WebContents* web_contents, | 30     content::WebContents* web_contents, | 
| 30     const GURL& referrer_url, | 31     const GURL& referrer_url, | 
| 31     const Callback& callback) { | 32     const Callback& callback) { | 
| 32 #if DCHECK_IS_ON() | 33 #if DCHECK_IS_ON() | 
| 33   // We should only try to reenable an extension that is, in fact, disabled. | 34   // We should only try to reenable an extension that is, in fact, disabled. | 
| 34   DCHECK(ExtensionRegistry::Get(browser_context)->disabled_extensions(). | 35   DCHECK(ExtensionRegistry::Get(browser_context)->disabled_extensions(). | 
| 35              Contains(extension->id())); | 36              Contains(extension->id())); | 
| 36   // Currently, this should only be used for extensions that are disabled due | 37   // Currently, this should only be used for extensions that are disabled due | 
| 37   // to a permissions increase. | 38   // to a permissions increase. | 
| 38   int disable_reasons = | 39   int disable_reasons = | 
| 39       ExtensionPrefs::Get(browser_context)->GetDisableReasons(extension->id()); | 40       ExtensionPrefs::Get(browser_context)->GetDisableReasons(extension->id()); | 
| 40   DCHECK_NE(0, disable_reasons & Extension::DISABLE_PERMISSIONS_INCREASE); | 41   DCHECK_NE(0, disable_reasons & Extension::DISABLE_PERMISSIONS_INCREASE); | 
| 41 #endif  // DCHECK_IS_ON() | 42 #endif  // DCHECK_IS_ON() | 
| 42 | 43 | 
| 43   return make_scoped_ptr(new ExtensionReenabler( | 44   return base::WrapUnique(new ExtensionReenabler( | 
| 44       extension, browser_context, referrer_url, callback, web_contents, | 45       extension, browser_context, referrer_url, callback, web_contents, | 
| 45       ExtensionInstallPrompt::GetDefaultShowDialogCallback())); | 46       ExtensionInstallPrompt::GetDefaultShowDialogCallback())); | 
| 46 } | 47 } | 
| 47 | 48 | 
| 48 // static | 49 // static | 
| 49 scoped_ptr<ExtensionReenabler> | 50 std::unique_ptr<ExtensionReenabler> | 
| 50 ExtensionReenabler::PromptForReenableWithCallbackForTest( | 51 ExtensionReenabler::PromptForReenableWithCallbackForTest( | 
| 51     const scoped_refptr<const Extension>& extension, | 52     const scoped_refptr<const Extension>& extension, | 
| 52     content::BrowserContext* browser_context, | 53     content::BrowserContext* browser_context, | 
| 53     const Callback& callback, | 54     const Callback& callback, | 
| 54     const ExtensionInstallPrompt::ShowDialogCallback& show_dialog_callback) { | 55     const ExtensionInstallPrompt::ShowDialogCallback& show_dialog_callback) { | 
| 55   return make_scoped_ptr(new ExtensionReenabler(extension, browser_context, | 56   return base::WrapUnique(new ExtensionReenabler(extension, browser_context, | 
| 56                                                 GURL(), callback, nullptr, | 57                                                  GURL(), callback, nullptr, | 
| 57                                                 show_dialog_callback)); | 58                                                  show_dialog_callback)); | 
| 58 } | 59 } | 
| 59 | 60 | 
| 60 ExtensionReenabler::ExtensionReenabler( | 61 ExtensionReenabler::ExtensionReenabler( | 
| 61     const scoped_refptr<const Extension>& extension, | 62     const scoped_refptr<const Extension>& extension, | 
| 62     content::BrowserContext* browser_context, | 63     content::BrowserContext* browser_context, | 
| 63     const GURL& referrer_url, | 64     const GURL& referrer_url, | 
| 64     const Callback& callback, | 65     const Callback& callback, | 
| 65     content::WebContents* web_contents, | 66     content::WebContents* web_contents, | 
| 66     const ExtensionInstallPrompt::ShowDialogCallback& show_dialog_callback) | 67     const ExtensionInstallPrompt::ShowDialogCallback& show_dialog_callback) | 
| 67     : extension_(extension), | 68     : extension_(extension), | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 87         extension->id())); | 88         extension->id())); | 
| 88     webstore_data_fetcher_->Start(); | 89     webstore_data_fetcher_->Start(); | 
| 89   } else { | 90   } else { | 
| 90     ExtensionInstallPrompt::PromptType type = | 91     ExtensionInstallPrompt::PromptType type = | 
| 91         ExtensionInstallPrompt::GetReEnablePromptTypeForExtension( | 92         ExtensionInstallPrompt::GetReEnablePromptTypeForExtension( | 
| 92             browser_context, extension.get()); | 93             browser_context, extension.get()); | 
| 93     install_prompt_->ShowDialog( | 94     install_prompt_->ShowDialog( | 
| 94         base::Bind(&ExtensionReenabler::OnInstallPromptDone, | 95         base::Bind(&ExtensionReenabler::OnInstallPromptDone, | 
| 95                    weak_factory_.GetWeakPtr()), | 96                    weak_factory_.GetWeakPtr()), | 
| 96         extension.get(), nullptr, | 97         extension.get(), nullptr, | 
| 97         make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)), | 98         base::WrapUnique(new ExtensionInstallPrompt::Prompt(type)), | 
| 98         show_dialog_callback_); | 99         show_dialog_callback_); | 
| 99   } | 100   } | 
| 100 } | 101 } | 
| 101 | 102 | 
| 102 void ExtensionReenabler::OnInstallPromptDone( | 103 void ExtensionReenabler::OnInstallPromptDone( | 
| 103     ExtensionInstallPrompt::Result install_result) { | 104     ExtensionInstallPrompt::Result install_result) { | 
| 104   ReenableResult result = ABORTED; | 105   ReenableResult result = ABORTED; | 
| 105   switch (install_result) { | 106   switch (install_result) { | 
| 106     case ExtensionInstallPrompt::Result::ACCEPTED: { | 107     case ExtensionInstallPrompt::Result::ACCEPTED: { | 
| 107       // Stop observing - we don't want to see our own enablement. | 108       // Stop observing - we don't want to see our own enablement. | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 148     UninstallReason reason) { | 149     UninstallReason reason) { | 
| 149   if (extension == extension_.get()) | 150   if (extension == extension_.get()) | 
| 150     Finish(USER_CANCELED); | 151     Finish(USER_CANCELED); | 
| 151 } | 152 } | 
| 152 | 153 | 
| 153 void ExtensionReenabler::OnWebstoreRequestFailure() { | 154 void ExtensionReenabler::OnWebstoreRequestFailure() { | 
| 154   Finish(ABORTED); | 155   Finish(ABORTED); | 
| 155 } | 156 } | 
| 156 | 157 | 
| 157 void ExtensionReenabler::OnWebstoreResponseParseSuccess( | 158 void ExtensionReenabler::OnWebstoreResponseParseSuccess( | 
| 158     scoped_ptr<base::DictionaryValue> webstore_data) { | 159     std::unique_ptr<base::DictionaryValue> webstore_data) { | 
| 159   DCHECK(!referrer_url_.is_empty()); | 160   DCHECK(!referrer_url_.is_empty()); | 
| 160   std::string error; | 161   std::string error; | 
| 161   if (!WebstoreInlineInstaller::IsRequestorPermitted(*webstore_data, | 162   if (!WebstoreInlineInstaller::IsRequestorPermitted(*webstore_data, | 
| 162                                                      referrer_url_, | 163                                                      referrer_url_, | 
| 163                                                      &error)) { | 164                                                      &error)) { | 
| 164     Finish(NOT_ALLOWED); | 165     Finish(NOT_ALLOWED); | 
| 165   } else { | 166   } else { | 
| 166     ExtensionInstallPrompt::PromptType type = | 167     ExtensionInstallPrompt::PromptType type = | 
| 167         ExtensionInstallPrompt::GetReEnablePromptTypeForExtension( | 168         ExtensionInstallPrompt::GetReEnablePromptTypeForExtension( | 
| 168             browser_context_, extension_.get()); | 169             browser_context_, extension_.get()); | 
| 169     install_prompt_->ShowDialog( | 170     install_prompt_->ShowDialog( | 
| 170         base::Bind(&ExtensionReenabler::OnInstallPromptDone, | 171         base::Bind(&ExtensionReenabler::OnInstallPromptDone, | 
| 171                    weak_factory_.GetWeakPtr()), | 172                    weak_factory_.GetWeakPtr()), | 
| 172         extension_.get(), nullptr, | 173         extension_.get(), nullptr, | 
| 173         make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)), | 174         base::WrapUnique(new ExtensionInstallPrompt::Prompt(type)), | 
| 174         show_dialog_callback_); | 175         show_dialog_callback_); | 
| 175   } | 176   } | 
| 176 } | 177 } | 
| 177 | 178 | 
| 178 void ExtensionReenabler::OnWebstoreResponseParseFailure( | 179 void ExtensionReenabler::OnWebstoreResponseParseFailure( | 
| 179     const std::string& error) { | 180     const std::string& error) { | 
| 180   Finish(ABORTED); | 181   Finish(ABORTED); | 
| 181 } | 182 } | 
| 182 | 183 | 
| 183 void ExtensionReenabler::Finish(ReenableResult result) { | 184 void ExtensionReenabler::Finish(ReenableResult result) { | 
| 184   DCHECK(!finished_); | 185   DCHECK(!finished_); | 
| 185   finished_ = true; | 186   finished_ = true; | 
| 186   registry_observer_.RemoveAll(); | 187   registry_observer_.RemoveAll(); | 
| 187   callback_.Run(result); | 188   callback_.Run(result); | 
| 188 } | 189 } | 
| 189 | 190 | 
| 190 }  // namespace extensions | 191 }  // namespace extensions | 
| OLD | NEW | 
|---|