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