158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_error_handler.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/bind.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/string16.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/values.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_error_ui_util.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/web_ui.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/web_ui_data_source.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace extensions {
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ExtensionErrorHandler::ExtensionErrorHandler(Profile* profile)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : profile_(profile),
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      weak_ptr_factory_(this) {
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ExtensionErrorHandler::~ExtensionErrorHandler() {
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ExtensionErrorHandler::GetLocalizedValues(
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    content::WebUIDataSource* source) {
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  source->AddString(
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "extensionErrorsShowMore",
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ERRORS_SHOW_MORE));
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  source->AddString(
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "extensionErrorsShowFewer",
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ERRORS_SHOW_FEWER));
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  source->AddString(
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "extensionErrorViewDetails",
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ERROR_VIEW_DETAILS));
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  source->AddString(
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "extensionErrorViewManifest",
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ERROR_VIEW_MANIFEST));
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  source->AddString("extensionErrorOverlayDone",
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    l10n_util::GetStringUTF16(IDS_DONE));
450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  source->AddString(
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "extensionErrorOverlayContextUrl",
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ERROR_CONTEXT));
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  source->AddString(
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "extensionErrorOverlayStackTrace",
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ERROR_STACK_TRACE));
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  source->AddString(
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "extensionErrorOverlayAnonymousFunction",
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ERROR_ANONYMOUS_FUNCTION));
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  source->AddString(
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "extensionErrorOverlayLaunchDevtools",
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ERROR_LAUNCH_DEVTOOLS));
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  source->AddString(
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "extensionErrorOverlayContextUnknown",
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ERROR_CONTEXT_UNKNOWN));
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  source->AddString(
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "extensionErrorOverlayNoCodeToDisplay",
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ERROR_NO_CODE_TO_DISPLAY));
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ExtensionErrorHandler::RegisterMessages() {
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  web_ui()->RegisterMessageCallback(
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "extensionErrorRequestFileSource",
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::Bind(&ExtensionErrorHandler::HandleRequestFileSource,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "extensionErrorOpenDevTools",
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      base::Bind(&ExtensionErrorHandler::HandleOpenDevTools,
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ExtensionErrorHandler::HandleRequestFileSource(
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const base::ListValue* args) {
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // There should only be one argument, a dictionary. Use this instead of a list
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // because it's more descriptive, harder to accidentally break with minor
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // modifications, and supports optional arguments more easily.
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CHECK_EQ(1u, args->GetSize());
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const base::DictionaryValue* dict = NULL;
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Three required arguments: extension_id, path_suffix, and error_message.
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string extension_id;
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::FilePath::StringType path_suffix_string;
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::string16 error_message;
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!args->GetDictionary(0, &dict)) {
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    NOTREACHED();
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_ui_util::HandleRequestFileSource(
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict,
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Profile::FromWebUI(web_ui()),
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&ExtensionErrorHandler::OnFileSourceHandled,
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExtensionErrorHandler::OnFileSourceHandled(
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue& source) {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "extensions.ExtensionErrorOverlay.requestFileSourceResponse", source);
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void ExtensionErrorHandler::HandleOpenDevTools(const base::ListValue* args) {
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CHECK_EQ(1U, args->GetSize());
1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const base::DictionaryValue* dict = NULL;
1110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!args->GetDictionary(0, &dict)) {
1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    NOTREACHED();
1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_ui_util::HandleOpenDevTools(dict);
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace extensions
121