blob: 15989a60d49634810488465f9d6edca9e11a4904 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_LOADER_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_LOADER_HANDLER_H_
#include <string>
#include <vector>
#include "base/compiler_specific.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observer.h"
#include "base/values.h"
#include "chrome/browser/extensions/extension_error_reporter.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_ui_message_handler.h"
namespace content {
class WebUIDataSource;
}
class Profile;
namespace extensions {
class Extension;
// The handler page for the Extension Commands UI overlay.
class ExtensionLoaderHandler : public content::WebUIMessageHandler,
public ExtensionErrorReporter::Observer,
public content::WebContentsObserver {
public:
explicit ExtensionLoaderHandler(Profile* profile);
~ExtensionLoaderHandler() override;
// Fetches the localized values for the page and deposits them into |source|.
void GetLocalizedValues(content::WebUIDataSource* source);
// WebUIMessageHandler implementation.
void RegisterMessages() override;
private:
class FileHelper;
// Handle the 'extensionLoaderLoadUnpacked' message.
void HandleLoadUnpacked(const base::ListValue* args);
// Handle the 'extensionLoaderRetry' message.
void HandleRetry(const base::ListValue* args);
// Handle the 'extensionLoaderIgnoreFailure' message.
void HandleIgnoreFailure(const base::ListValue* args);
// Handle the 'extensionLoaderDisplayFailures' message.
void HandleDisplayFailures(const base::ListValue* args);
// Try to load an unpacked extension from the given |file_path|.
void LoadUnpackedExtensionImpl(const base::FilePath& file_path);
// ExtensionErrorReporter::Observer:
void OnLoadFailure(content::BrowserContext* browser_context,
const base::FilePath& file_path,
const std::string& error) override;
// content::WebContentsObserver:
void DidStartNavigationToPendingEntry(
const GURL& url,
content::NavigationController::ReloadType reload_type) override;
// Add a failure to |failures_|. If it was a manifest error, |manifest| will
// hold the manifest contents, and |line_number| will point to the line at
// which the error was found.
void AddFailure(const base::FilePath& file_path,
const std::string& error,
size_t line_number,
const std::string& manifest);
// Notify the frontend of all failures.
void NotifyFrontendOfFailure();
// The profile with which this Handler is associated.
Profile* profile_;
// A helper to manage file picking.
scoped_ptr<FileHelper> file_helper_;
// Holds information about all unpacked extension install failures that
// were reported while the extensions page was loading.
base::ListValue failures_;
// Holds failed paths for load retries.
std::vector<base::FilePath> failed_paths_;
ScopedObserver<ExtensionErrorReporter, ExtensionErrorReporter::Observer>
extension_error_reporter_observer_;
// Set when the chrome://extensions page is fully loaded and the frontend is
// ready to receive failure notifications. We need this because the page
// fails to display failures if they are sent before the Javascript is loaded.
bool ui_ready_;
// Weak pointer factory for posting background tasks.
base::WeakPtrFactory<ExtensionLoaderHandler> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ExtensionLoaderHandler);
};
} // namespace extensions
#endif // CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_LOADER_HANDLER_H_