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" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.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 "grit/generated_resources.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace extensions { 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PackExtensionHandler::PackExtensionHandler() { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PackExtensionHandler::~PackExtensionHandler() { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There may be pending file dialogs, we need to tell them that we've gone 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // away so they don't try and call back to us. 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (load_extension_dialog_.get()) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_extension_dialog_->ListenerDestroyed(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pack_job_.get()) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack_job_->ClearClient(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::GetLocalizedValues( 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource* source) { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionOverlay", 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_TITLE)); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionHeading", 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_HEADING)); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionCommit", 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_BUTTON)); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("ok", l10n_util::GetStringUTF16(IDS_OK)); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("cancel", l10n_util::GetStringUTF16(IDS_CANCEL)); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionRootDir", 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16( 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_ROOT_DIRECTORY_LABEL)); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionPrivateKey", 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_PRIVATE_KEY_LABEL)); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionBrowseButton", 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_DIALOG_BROWSE)); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionProceedAnyway", 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PROCEED_ANYWAY)); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionWarningTitle", 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_WARNING_TITLE)); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddString("packExtensionErrorTitle", 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PACK_ERROR_TITLE)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::RegisterMessages() { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pack", 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PackExtensionHandler::HandlePackMessage, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "packExtensionSelectFilePath", 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PackExtensionHandler::HandleSelectFilePathMessage, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PackExtensionHandler::OnPackSuccess(const base::FilePath& crx_file, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_file) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue arguments; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments.Append(Value::CreateStringValue( 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UTF16ToUTF8(PackExtensionJob::StandardSuccessMessage( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crx_file, pem_file)))); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PackExtensionOverlay.showSuccessMessage", arguments); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void PackExtensionHandler::OnPackFailure(const std::string& error, 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExtensionCreator::ErrorType type) { 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (type == ExtensionCreator::kCRXExists) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringValue error_str(error); 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue extension_path_str(extension_path_.value()); 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue key_path_str(private_key_path_.value()); 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FundamentalValue overwrite_flag(ExtensionCreator::kOverwriteCRX); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ExtensionSettings.askToOverrideWarning", error_str, extension_path_str, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_path_str, overwrite_flag); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowAlert(error); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PackExtensionHandler::FileSelected(const base::FilePath& path, int index, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* params) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue results; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results.Append(Value::CreateStringValue(path.value())); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("window.handleFilePathSelected", results); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::MultiFilesSelected( 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<base::FilePath>& files, void* params) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::HandlePackMessage(const ListValue* args) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(3U, args->GetSize()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double flags_double = 0.0; 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath::StringType extension_path_str; 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath::StringType private_key_path_str; 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!args->GetString(0, &extension_path_str) || 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !args->GetString(1, &private_key_path_str) || 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !args->GetDouble(2, &flags_double)) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_path_ = base::FilePath(extension_path_str); 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private_key_path_ = base::FilePath(private_key_path_str); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int run_flags = static_cast<int>(flags_double); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath root_directory = extension_path_; 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath key_file = private_key_path_; 127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) last_used_path_ = extension_path_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root_directory.empty()) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_path_.empty()) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowAlert(l10n_util::GetStringUTF8( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_REQUIRED)); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowAlert(l10n_util::GetStringUTF8( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_INVALID)); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!private_key_path_.empty() && key_file.empty()) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowAlert(l10n_util::GetStringUTF8( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_ERROR_KEY_INVALID)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) pack_job_ = new PackExtensionJob(this, root_directory, key_file, run_flags); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack_job_->Start(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::HandleSelectFilePathMessage( 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* args) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(2U, args->GetSize()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string select_type; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString(0, &select_type)) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string operation; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString(1, &operation)) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::Type type = ui::SelectFileDialog::SELECT_FOLDER; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::FileTypeInfo info; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int file_type_index = 0; 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath path_to_use = last_used_path_; 1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (select_type == "file") { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = ui::SelectFileDialog::SELECT_OPEN_FILE; 1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch path_to_use = base::FilePath(); 1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 select_title; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (operation == "load") { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_title = l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (operation == "pem") { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_title = l10n_util::GetStringUTF16( 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_SELECT_KEY); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.extensions.push_back(std::vector<base::FilePath::StringType>()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.extensions.front().push_back(FILE_PATH_LITERAL("pem")); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.extension_description_overrides.push_back( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PACK_DIALOG_KEY_FILE_TYPE_DESCRIPTION)); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.include_all_files = true; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_type_index = 1; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_extension_dialog_ = ui::SelectFileDialog::Create( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new ChromeSelectFilePolicy(web_ui()->GetWebContents())); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_extension_dialog_->SelectFile( 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) type, 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) select_title, 1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch path_to_use, 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &info, 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_type_index, 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath::StringType(), 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->GetWebContents()->GetView()->GetTopLevelNativeWindow(), 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionHandler::ShowAlert(const std::string& message) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue arguments; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments.Append(Value::CreateStringValue(message)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("PackExtensionOverlay.showError", arguments); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace extensions 209