15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/pack_extension_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/bind.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_creator.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui_data_source.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace extensions { 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PackExtensionHandler::PackExtensionHandler() { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PackExtensionHandler::~PackExtensionHandler() { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There may be pending file dialogs, we need to tell them that we've gone 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // away so they don't try and call back to us. 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (load_extension_dialog_.get()) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_extension_dialog_->ListenerDestroyed(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pack_job_.get()) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack_job_->ClearClient(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::GetLocalizedValues( 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource* source) { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionOverlay", 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_TITLE)); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionHeading", 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_HEADING)); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionCommit", 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_BUTTON)); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("ok", l10n_util::GetStringUTF16(IDS_OK)); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("cancel", l10n_util::GetStringUTF16(IDS_CANCEL)); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionRootDir", 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16( 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_ROOT_DIRECTORY_LABEL)); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionPrivateKey", 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_PRIVATE_KEY_LABEL)); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionBrowseButton", 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_BROWSE)); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionProceedAnyway", 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PROCEED_ANYWAY)); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionWarningTitle", 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_WARNING_TITLE)); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionErrorTitle", 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_ERROR_TITLE)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::RegisterMessages() { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback( 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pack", 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PackExtensionHandler::HandlePackMessage, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "packExtensionSelectFilePath", 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PackExtensionHandler::HandleSelectFilePathMessage, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PackExtensionHandler::OnPackSuccess(const base::FilePath& crx_file, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_file) { 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue arguments; 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arguments.Append(new base::StringValue(base::UTF16ToUTF8( 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PackExtensionJob::StandardSuccessMessage(crx_file, pem_file)))); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction( 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "extensions.PackExtensionOverlay.showSuccessMessage", arguments); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void PackExtensionHandler::OnPackFailure(const std::string& error, 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExtensionCreator::ErrorType type) { 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (type == ExtensionCreator::kCRXExists) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringValue error_str(error); 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue extension_path_str(extension_path_.value()); 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue key_path_str(private_key_path_.value()); 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FundamentalValue overwrite_flag(ExtensionCreator::kOverwriteCRX); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction( 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "extensions.ExtensionSettings.askToOverrideWarning", 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_str, extension_path_str, key_path_str, overwrite_flag); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowAlert(error); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PackExtensionHandler::FileSelected(const base::FilePath& path, int index, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* params) { 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue results; 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch results.Append(new base::StringValue(path.value())); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("window.handleFilePathSelected", results); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::MultiFilesSelected( 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<base::FilePath>& files, void* params) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PackExtensionHandler::HandlePackMessage(const base::ListValue* args) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(3U, args->GetSize()); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double flags_double = 0.0; 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath::StringType extension_path_str; 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath::StringType private_key_path_str; 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!args->GetString(0, &extension_path_str) || 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !args->GetString(1, &private_key_path_str) || 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !args->GetDouble(2, &flags_double)) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_path_ = base::FilePath(extension_path_str); 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private_key_path_ = base::FilePath(private_key_path_str); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int run_flags = static_cast<int>(flags_double); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath root_directory = extension_path_; 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath key_file = private_key_path_; 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) last_used_path_ = extension_path_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root_directory.empty()) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_path_.empty()) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowAlert(l10n_util::GetStringUTF8( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_REQUIRED)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowAlert(l10n_util::GetStringUTF8( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_INVALID)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!private_key_path_.empty() && key_file.empty()) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowAlert(l10n_util::GetStringUTF8( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_ERROR_KEY_INVALID)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) pack_job_ = new PackExtensionJob(this, root_directory, key_file, run_flags); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack_job_->Start(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::HandleSelectFilePathMessage( 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* args) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(2U, args->GetSize()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string select_type; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString(0, &select_type)) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string operation; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString(1, &operation)) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::Type type = ui::SelectFileDialog::SELECT_FOLDER; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::FileTypeInfo info; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int file_type_index = 0; 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath path_to_use = last_used_path_; 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (select_type == "file") { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = ui::SelectFileDialog::SELECT_OPEN_FILE; 1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch path_to_use = base::FilePath(); 1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 select_title; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (operation == "load") { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_title = l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (operation == "pem") { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_title = l10n_util::GetStringUTF16( 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_SELECT_KEY); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.extensions.push_back(std::vector<base::FilePath::StringType>()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.extensions.front().push_back(FILE_PATH_LITERAL("pem")); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.extension_description_overrides.push_back( 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16( 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_KEY_FILE_TYPE_DESCRIPTION)); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.include_all_files = true; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_type_index = 1; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_extension_dialog_ = ui::SelectFileDialog::Create( 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new ChromeSelectFilePolicy(web_ui()->GetWebContents())); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_extension_dialog_->SelectFile( 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) type, 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) select_title, 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch path_to_use, 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &info, 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_type_index, 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath::StringType(), 196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_ui()->GetWebContents()->GetTopLevelNativeWindow(), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::ShowAlert(const std::string& message) { 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue arguments; 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arguments.Append(new base::StringValue(message)); 2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) web_ui()->CallJavascriptFunction( 2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "extensions.PackExtensionOverlay.showError", arguments); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace extensions 208