| 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 "chrome/browser/extensions/extension_service.h" | 8 #include "chrome/browser/extensions/extension_service.h" |
| 9 #include "chrome/browser/extensions/webstore_data_fetcher.h" | 9 #include "chrome/browser/extensions/webstore_data_fetcher.h" |
| 10 #include "chrome/browser/extensions/webstore_inline_installer.h" | 10 #include "chrome/browser/extensions/webstore_inline_installer.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 const GURL& referrer_url, | 63 const GURL& referrer_url, |
| 64 const Callback& callback, | 64 const Callback& callback, |
| 65 content::WebContents* web_contents, | 65 content::WebContents* web_contents, |
| 66 const ExtensionInstallPrompt::ShowDialogCallback& show_dialog_callback) | 66 const ExtensionInstallPrompt::ShowDialogCallback& show_dialog_callback) |
| 67 : extension_(extension), | 67 : extension_(extension), |
| 68 browser_context_(browser_context), | 68 browser_context_(browser_context), |
| 69 referrer_url_(referrer_url), | 69 referrer_url_(referrer_url), |
| 70 callback_(callback), | 70 callback_(callback), |
| 71 show_dialog_callback_(show_dialog_callback), | 71 show_dialog_callback_(show_dialog_callback), |
| 72 finished_(false), | 72 finished_(false), |
| 73 registry_observer_(this) { | 73 registry_observer_(this), |
| 74 weak_factory_(this) { |
| 74 DCHECK(extension_.get()); | 75 DCHECK(extension_.get()); |
| 75 registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); | 76 registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); |
| 76 | 77 |
| 77 install_prompt_.reset(new ExtensionInstallPrompt(web_contents)); | 78 install_prompt_.reset(new ExtensionInstallPrompt(web_contents)); |
| 78 | 79 |
| 79 // If we have a non-empty referrer, then we have to validate that it's a valid | 80 // If we have a non-empty referrer, then we have to validate that it's a valid |
| 80 // url for the extension. | 81 // url for the extension. |
| 81 if (!referrer_url_.is_empty()) { | 82 if (!referrer_url_.is_empty()) { |
| 82 webstore_data_fetcher_.reset(new WebstoreDataFetcher( | 83 webstore_data_fetcher_.reset(new WebstoreDataFetcher( |
| 83 this, | 84 this, |
| 84 browser_context_->GetRequestContext(), | 85 browser_context_->GetRequestContext(), |
| 85 referrer_url_, | 86 referrer_url_, |
| 86 extension->id())); | 87 extension->id())); |
| 87 webstore_data_fetcher_->Start(); | 88 webstore_data_fetcher_->Start(); |
| 88 } else { | 89 } else { |
| 89 ExtensionInstallPrompt::PromptType type = | 90 ExtensionInstallPrompt::PromptType type = |
| 90 ExtensionInstallPrompt::GetReEnablePromptTypeForExtension( | 91 ExtensionInstallPrompt::GetReEnablePromptTypeForExtension( |
| 91 browser_context, extension.get()); | 92 browser_context, extension.get()); |
| 92 install_prompt_->ShowDialog( | 93 install_prompt_->ShowDialog( |
| 93 this, extension.get(), nullptr, | 94 base::Bind(&ExtensionReenabler::OnInstallPromptDone, |
| 95 weak_factory_.GetWeakPtr()), |
| 96 extension.get(), nullptr, |
| 94 make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)), | 97 make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)), |
| 95 show_dialog_callback_); | 98 show_dialog_callback_); |
| 96 } | 99 } |
| 97 } | 100 } |
| 98 | 101 |
| 99 void ExtensionReenabler::InstallUIProceed() { | 102 void ExtensionReenabler::OnInstallPromptDone( |
| 100 // Stop observing - we don't want to see our own enablement. | 103 ExtensionInstallPrompt::Result install_result) { |
| 101 registry_observer_.RemoveAll(); | 104 ReenableResult result = ABORTED; |
| 105 switch (install_result) { |
| 106 case ExtensionInstallPrompt::Result::ACCEPTED: { |
| 107 // Stop observing - we don't want to see our own enablement. |
| 108 registry_observer_.RemoveAll(); |
| 102 | 109 |
| 103 ExtensionService* extension_service = | 110 ExtensionService* extension_service = |
| 104 ExtensionSystem::Get(browser_context_)->extension_service(); | 111 ExtensionSystem::Get(browser_context_)->extension_service(); |
| 105 if (extension_service->browser_terminating()) { | 112 if (extension_service->browser_terminating()) { |
| 106 Finish(ABORTED); | 113 result = ABORTED; |
| 107 } else { | 114 } else { |
| 108 extension_service->GrantPermissionsAndEnableExtension(extension_.get()); | 115 extension_service->GrantPermissionsAndEnableExtension(extension_.get()); |
| 109 // The re-enable could have failed if the extension is disallowed by | 116 // The re-enable could have failed if the extension is disallowed by |
| 110 // policy. | 117 // policy. |
| 111 bool enabled = ExtensionRegistry::Get(browser_context_)-> | 118 bool enabled = ExtensionRegistry::Get(browser_context_) |
| 112 enabled_extensions().GetByID(extension_->id()) != nullptr; | 119 ->enabled_extensions() |
| 113 Finish(enabled ? REENABLE_SUCCESS : NOT_ALLOWED); | 120 .GetByID(extension_->id()) != nullptr; |
| 121 result = enabled ? REENABLE_SUCCESS : NOT_ALLOWED; |
| 122 } |
| 123 break; |
| 124 } |
| 125 case ExtensionInstallPrompt::Result::USER_CANCELED: |
| 126 result = USER_CANCELED; |
| 127 break; |
| 128 case ExtensionInstallPrompt::Result::ABORTED: |
| 129 result = ABORTED; |
| 130 break; |
| 114 } | 131 } |
| 115 } | |
| 116 | 132 |
| 117 void ExtensionReenabler::InstallUIAbort(bool user_initiated) { | 133 Finish(result); |
| 118 Finish(user_initiated ? USER_CANCELED : ABORTED); | |
| 119 } | 134 } |
| 120 | 135 |
| 121 void ExtensionReenabler::OnExtensionLoaded( | 136 void ExtensionReenabler::OnExtensionLoaded( |
| 122 content::BrowserContext* browser_context, | 137 content::BrowserContext* browser_context, |
| 123 const Extension* extension) { | 138 const Extension* extension) { |
| 124 // If the user chose to manually re-enable the extension then, for all | 139 // If the user chose to manually re-enable the extension then, for all |
| 125 // intents and purposes, this was a success. | 140 // intents and purposes, this was a success. |
| 126 if (extension == extension_.get()) | 141 if (extension == extension_.get()) |
| 127 Finish(REENABLE_SUCCESS); | 142 Finish(REENABLE_SUCCESS); |
| 128 } | 143 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 145 std::string error; | 160 std::string error; |
| 146 if (!WebstoreInlineInstaller::IsRequestorPermitted(*webstore_data, | 161 if (!WebstoreInlineInstaller::IsRequestorPermitted(*webstore_data, |
| 147 referrer_url_, | 162 referrer_url_, |
| 148 &error)) { | 163 &error)) { |
| 149 Finish(NOT_ALLOWED); | 164 Finish(NOT_ALLOWED); |
| 150 } else { | 165 } else { |
| 151 ExtensionInstallPrompt::PromptType type = | 166 ExtensionInstallPrompt::PromptType type = |
| 152 ExtensionInstallPrompt::GetReEnablePromptTypeForExtension( | 167 ExtensionInstallPrompt::GetReEnablePromptTypeForExtension( |
| 153 browser_context_, extension_.get()); | 168 browser_context_, extension_.get()); |
| 154 install_prompt_->ShowDialog( | 169 install_prompt_->ShowDialog( |
| 155 this, extension_.get(), nullptr, | 170 base::Bind(&ExtensionReenabler::OnInstallPromptDone, |
| 171 weak_factory_.GetWeakPtr()), |
| 172 extension_.get(), nullptr, |
| 156 make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)), | 173 make_scoped_ptr(new ExtensionInstallPrompt::Prompt(type)), |
| 157 show_dialog_callback_); | 174 show_dialog_callback_); |
| 158 } | 175 } |
| 159 } | 176 } |
| 160 | 177 |
| 161 void ExtensionReenabler::OnWebstoreResponseParseFailure( | 178 void ExtensionReenabler::OnWebstoreResponseParseFailure( |
| 162 const std::string& error) { | 179 const std::string& error) { |
| 163 Finish(ABORTED); | 180 Finish(ABORTED); |
| 164 } | 181 } |
| 165 | 182 |
| 166 void ExtensionReenabler::Finish(ReenableResult result) { | 183 void ExtensionReenabler::Finish(ReenableResult result) { |
| 167 DCHECK(!finished_); | 184 DCHECK(!finished_); |
| 168 finished_ = true; | 185 finished_ = true; |
| 169 registry_observer_.RemoveAll(); | 186 registry_observer_.RemoveAll(); |
| 170 callback_.Run(result); | 187 callback_.Run(result); |
| 171 } | 188 } |
| 172 | 189 |
| 173 } // namespace extensions | 190 } // namespace extensions |
| OLD | NEW |