1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_EXTENSIONS_EXTERNAL_INSTALL_ERROR_H_
6#define CHROME_BROWSER_EXTENSIONS_EXTERNAL_INSTALL_ERROR_H_
7
8#include <string>
9
10#include "base/macros.h"
11#include "base/memory/scoped_ptr.h"
12#include "base/memory/weak_ptr.h"
13#include "chrome/browser/extensions/extension_install_prompt.h"
14#include "chrome/browser/extensions/webstore_data_fetcher_delegate.h"
15
16class Browser;
17class ExtensionInstallUI;
18class GlobalError;
19class GlobalErrorService;
20
21namespace content {
22class BrowserContext;
23}
24
25namespace extensions {
26class Extension;
27class ExternalInstallManager;
28class WebstoreDataFetcher;
29
30// An error to show the user an extension has been externally installed. The
31// error will automatically fetch data about the extension from the webstore (if
32// possible) and will handle adding itself to the GlobalErrorService when
33// initialized and removing itself from the GlobalErrorService upon
34// destruction.
35class ExternalInstallError : public ExtensionInstallPrompt::Delegate,
36                             public WebstoreDataFetcherDelegate {
37 public:
38  // The possible types of errors to show. A menu alert adds a menu item to the
39  // wrench, which spawns an extension install dialog when clicked. The bubble
40  // alert also adds an item, but spawns a bubble instead (less invasive and
41  // easier to dismiss).
42  enum AlertType {
43    BUBBLE_ALERT,
44    MENU_ALERT
45  };
46
47  ExternalInstallError(content::BrowserContext* browser_context,
48                       const std::string& extension_id,
49                       AlertType error_type,
50                       ExternalInstallManager* manager);
51  virtual ~ExternalInstallError();
52
53  // ExtensionInstallPrompt::Delegate implementation.
54  virtual void InstallUIProceed() OVERRIDE;
55  virtual void InstallUIAbort(bool user_initiated) OVERRIDE;
56
57  // Show the associated dialog. This should only be called once the dialog is
58  // ready.
59  void ShowDialog(Browser* browser);
60
61  // Return the associated extension, or NULL.
62  const Extension* GetExtension() const;
63
64  const std::string& extension_id() const { return extension_id_; }
65  AlertType alert_type() const { return alert_type_; }
66
67 private:
68  // WebstoreDataFetcherDelegate implementation.
69  virtual void OnWebstoreRequestFailure() OVERRIDE;
70  virtual void OnWebstoreResponseParseSuccess(
71      scoped_ptr<base::DictionaryValue> webstore_data) OVERRIDE;
72  virtual void OnWebstoreResponseParseFailure(
73      const std::string& error) OVERRIDE;
74
75  // Called when data fetching has completed (either successfully or not).
76  void OnFetchComplete();
77
78  // Called when the dialog has been successfully populated, and is ready to be
79  // shown.
80  void OnDialogReady(const ExtensionInstallPrompt::ShowParams& show_params,
81                     ExtensionInstallPrompt::Delegate* prompt_delegate,
82                     scoped_refptr<ExtensionInstallPrompt::Prompt> prompt);
83
84  // The associated BrowserContext.
85  content::BrowserContext* browser_context_;
86
87  // The id of the external extension.
88  std::string extension_id_;
89
90  // The type of alert to show the user.
91  AlertType alert_type_;
92
93  // The owning ExternalInstallManager.
94  ExternalInstallManager* manager_;
95
96  // The associated GlobalErrorService.
97  GlobalErrorService* error_service_;
98
99  // The UI for showing the error.
100  scoped_ptr<ExtensionInstallPrompt> install_ui_;
101  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_;
102
103  // The UI for the given error, which will take the form of either a menu
104  // alert or a bubble alert (depending on the |alert_type_|.
105  scoped_ptr<GlobalError> global_error_;
106
107  // The WebstoreDataFetcher to use in order to populate the error with webstore
108  // information of the extension.
109  scoped_ptr<WebstoreDataFetcher> webstore_data_fetcher_;
110
111  base::WeakPtrFactory<ExternalInstallError> weak_factory_;
112
113  DISALLOW_COPY_AND_ASSIGN(ExternalInstallError);
114};
115
116}  // namespace extensions
117
118#endif  // CHROME_BROWSER_EXTENSIONS_EXTERNAL_INSTALL_ERROR_H_
119