Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(688)

Side by Side Diff: chrome/browser/ui/webui/extensions/extension_settings_handler.cc

Issue 683763003: Fix bug where AppInfoDialog was outliving ExtensionSettingsHandler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comment fix Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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/ui/webui/extensions/extension_settings_handler.h" 5 #include "chrome/browser/ui/webui/extensions/extension_settings_handler.h"
6 6
7 #include "apps/app_load_service.h" 7 #include "apps/app_load_service.h"
8 #include "apps/saved_files_service.h" 8 #include "apps/saved_files_service.h"
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/base64.h" 10 #include "base/base64.h"
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 int render_view_id, 132 int render_view_id,
133 bool incognito, 133 bool incognito,
134 bool generated_background_page) 134 bool generated_background_page)
135 : url(url), 135 : url(url),
136 render_process_id(render_process_id), 136 render_process_id(render_process_id),
137 render_view_id(render_view_id), 137 render_view_id(render_view_id),
138 incognito(incognito), 138 incognito(incognito),
139 generated_background_page(generated_background_page) { 139 generated_background_page(generated_background_page) {
140 } 140 }
141 141
142 // On Mac, the install prompt is not modal. This means that the user can 142 // The install prompt is not necessarily modal (e.g. Mac, Linux Unity). This
143 // navigate while the dialog is up, causing the dialog handler to outlive the 143 // means that the user can navigate while the dialog is up, causing the dialog
144 // ExtensionSettingsHandler. That's a problem because the dialog framework will 144 // handler to outlive the ExtensionSettingsHandler. That's a problem because the
145 // try to contact us back once the dialog is closed, which causes a crash. 145 // dialog framework will try to contact us back once the dialog is closed, which
146 // This class is designed to broker the message between the two objects, while 146 // causes a crash. This class is designed to broker the message between the two
147 // managing its own lifetime so that it can outlive the ExtensionSettingsHandler 147 // objects, while managing its own lifetime so that it can outlive the
148 // and (when doing so) gracefully ignore the message from the dialog. 148 // ExtensionSettingsHandler and (when doing so) gracefully ignore the message
149 // from the dialog.
149 class BrokerDelegate : public ExtensionInstallPrompt::Delegate { 150 class BrokerDelegate : public ExtensionInstallPrompt::Delegate {
150 public: 151 public:
151 explicit BrokerDelegate( 152 explicit BrokerDelegate(
152 const base::WeakPtr<ExtensionSettingsHandler>& delegate) 153 const base::WeakPtr<ExtensionSettingsHandler>& delegate)
153 : delegate_(delegate) {} 154 : delegate_(delegate) {}
154 155
155 // ExtensionInstallPrompt::Delegate implementation. 156 // ExtensionInstallPrompt::Delegate implementation.
156 void InstallUIProceed() override { 157 void InstallUIProceed() override {
157 if (delegate_) 158 if (delegate_)
158 delegate_->InstallUIProceed(); 159 delegate_->InstallUIProceed();
159 delete this; 160 delete this;
160 }; 161 };
161 162
162 void InstallUIAbort(bool user_initiated) override { 163 void InstallUIAbort(bool user_initiated) override {
163 if (delegate_) 164 if (delegate_)
164 delegate_->InstallUIAbort(user_initiated); 165 delegate_->InstallUIAbort(user_initiated);
165 delete this; 166 delete this;
166 }; 167 };
167 168
169 void AppInfoDialogClosed() {
170 if (delegate_)
171 delegate_->AppInfoDialogClosed();
172 delete this;
173 }
174
168 private: 175 private:
169 base::WeakPtr<ExtensionSettingsHandler> delegate_; 176 base::WeakPtr<ExtensionSettingsHandler> delegate_;
170 177
171 DISALLOW_COPY_AND_ASSIGN(BrokerDelegate); 178 DISALLOW_COPY_AND_ASSIGN(BrokerDelegate);
172 }; 179 };
173 180
174 /////////////////////////////////////////////////////////////////////////////// 181 ///////////////////////////////////////////////////////////////////////////////
175 // 182 //
176 // ExtensionSettingsHandler 183 // ExtensionSettingsHandler
177 // 184 //
(...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 std::string extension_id(base::UTF16ToUTF8(ExtractStringValue(args))); 1208 std::string extension_id(base::UTF16ToUTF8(ExtractStringValue(args)));
1202 CHECK(!extension_id.empty()); 1209 CHECK(!extension_id.empty());
1203 const Extension* extension = 1210 const Extension* extension =
1204 ExtensionRegistry::Get(Profile::FromWebUI(web_ui())) 1211 ExtensionRegistry::Get(Profile::FromWebUI(web_ui()))
1205 ->GetExtensionById(extension_id, ExtensionRegistry::EVERYTHING); 1212 ->GetExtensionById(extension_id, ExtensionRegistry::EVERYTHING);
1206 if (!extension) 1213 if (!extension)
1207 return; 1214 return;
1208 1215
1209 if (!extension_id_prompting_.empty()) 1216 if (!extension_id_prompting_.empty())
1210 return; // Only one prompt at a time. 1217 return; // Only one prompt at a time.
1218 extension_id_prompting_ = extension->id();
1211 1219
1212 extension_id_prompting_ = extension->id(); 1220 // The BrokerDelegate manages its own lifetime.
1221 BrokerDelegate* broker_delegate = new BrokerDelegate(AsWeakPtr());
1213 1222
1214 // Show the new-style extensions dialog when the flag is set. The flag cannot 1223 // Show the new-style extensions dialog when the flag is set. The flag cannot
1215 // be set on Mac platforms. 1224 // be set on Mac platforms.
1216 if (ShouldDisplayExtensionInfoDialog()) { 1225 if (ShouldDisplayExtensionInfoDialog()) {
1217 UMA_HISTOGRAM_ENUMERATION("Apps.AppInfoDialog.Launches", 1226 UMA_HISTOGRAM_ENUMERATION("Apps.AppInfoDialog.Launches",
1218 AppInfoLaunchSource::FROM_EXTENSIONS_PAGE, 1227 AppInfoLaunchSource::FROM_EXTENSIONS_PAGE,
1219 AppInfoLaunchSource::NUM_LAUNCH_SOURCES); 1228 AppInfoLaunchSource::NUM_LAUNCH_SOURCES);
1220 1229
1221 // Display the dialog at a size similar to the app list. 1230 // Display the dialog at a size similar to the app list.
1222 const int kAppInfoDialogWidth = 380; 1231 const int kAppInfoDialogWidth = 380;
1223 const int kAppInfoDialogHeight = 490; 1232 const int kAppInfoDialogHeight = 490;
1233
1224 ShowAppInfoInNativeDialog( 1234 ShowAppInfoInNativeDialog(
1225 web_contents()->GetTopLevelNativeWindow(), 1235 web_contents()->GetTopLevelNativeWindow(),
1226 gfx::Size(kAppInfoDialogWidth, kAppInfoDialogHeight), 1236 gfx::Size(kAppInfoDialogWidth, kAppInfoDialogHeight),
1227 Profile::FromWebUI(web_ui()), 1237 Profile::FromWebUI(web_ui()), extension,
1228 extension, 1238 base::Bind(&BrokerDelegate::AppInfoDialogClosed,
1229 base::Bind(&ExtensionSettingsHandler::AppInfoDialogClosed, 1239 base::Unretained(broker_delegate)));
1230 base::Unretained(this)));
1231 } else { 1240 } else {
1232 prompt_.reset(new ExtensionInstallPrompt(web_contents())); 1241 prompt_.reset(new ExtensionInstallPrompt(web_contents()));
1233 std::vector<base::FilePath> retained_file_paths; 1242 std::vector<base::FilePath> retained_file_paths;
1234 if (extension->permissions_data()->HasAPIPermission( 1243 if (extension->permissions_data()->HasAPIPermission(
1235 APIPermission::kFileSystem)) { 1244 APIPermission::kFileSystem)) {
1236 std::vector<apps::SavedFileEntry> retained_file_entries = 1245 std::vector<apps::SavedFileEntry> retained_file_entries =
1237 apps::SavedFilesService::Get(Profile::FromWebUI(web_ui())) 1246 apps::SavedFilesService::Get(Profile::FromWebUI(web_ui()))
1238 ->GetAllFileEntries(extension_id_prompting_); 1247 ->GetAllFileEntries(extension_id_prompting_);
1239 for (size_t i = 0; i < retained_file_entries.size(); ++i) { 1248 for (size_t i = 0; i < retained_file_entries.size(); ++i) {
1240 retained_file_paths.push_back(retained_file_entries[i].path); 1249 retained_file_paths.push_back(retained_file_entries[i].path);
1241 } 1250 }
1242 } 1251 }
1243 std::vector<base::string16> retained_device_messages; 1252 std::vector<base::string16> retained_device_messages;
1244 if (extension->permissions_data()->HasAPIPermission(APIPermission::kUsb)) { 1253 if (extension->permissions_data()->HasAPIPermission(APIPermission::kUsb)) {
1245 retained_device_messages = 1254 retained_device_messages =
1246 extensions::DevicePermissionsManager::Get( 1255 extensions::DevicePermissionsManager::Get(
1247 Profile::FromWebUI(web_ui())) 1256 Profile::FromWebUI(web_ui()))
1248 ->GetPermissionMessageStrings(extension_id_prompting_); 1257 ->GetPermissionMessageStrings(extension_id_prompting_);
1249 } 1258 }
1250 1259
1251 // The BrokerDelegate manages its own lifetime. 1260 prompt_->ReviewPermissions(broker_delegate, extension, retained_file_paths,
1252 prompt_->ReviewPermissions(new BrokerDelegate(AsWeakPtr()),
1253 extension,
1254 retained_file_paths,
1255 retained_device_messages); 1261 retained_device_messages);
1256 } 1262 }
1257 } 1263 }
1258 1264
1259 void ExtensionSettingsHandler::HandleShowButtonMessage( 1265 void ExtensionSettingsHandler::HandleShowButtonMessage(
1260 const base::ListValue* args) { 1266 const base::ListValue* args) {
1261 const Extension* extension = GetActiveExtension(args); 1267 const Extension* extension = GetActiveExtension(args);
1262 if (!extension) 1268 if (!extension)
1263 return; 1269 return;
1264 ExtensionActionAPI::SetBrowserActionVisibility( 1270 ExtensionActionAPI::SetBrowserActionVisibility(
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
1506 extension_service_->EnableExtension(extension_id); 1512 extension_service_->EnableExtension(extension_id);
1507 } else { 1513 } else {
1508 ExtensionErrorReporter::GetInstance()->ReportError( 1514 ExtensionErrorReporter::GetInstance()->ReportError(
1509 base::UTF8ToUTF16(JoinString(requirement_errors, ' ')), 1515 base::UTF8ToUTF16(JoinString(requirement_errors, ' ')),
1510 true); // Be noisy. 1516 true); // Be noisy.
1511 } 1517 }
1512 requirements_checker_.reset(); 1518 requirements_checker_.reset();
1513 } 1519 }
1514 1520
1515 } // namespace extensions 1521 } // namespace extensions
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698