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