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