1// Copyright 2013 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_APPS_EPHEMERAL_APP_LAUNCHER_H_
6#define CHROME_BROWSER_APPS_EPHEMERAL_APP_LAUNCHER_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "chrome/browser/extensions/webstore_standalone_installer.h"
12#include "content/public/browser/notification_observer.h"
13#include "content/public/browser/web_contents_observer.h"
14
15class Profile;
16
17namespace content {
18class WebContents;
19}
20
21namespace extensions {
22class Extension;
23}
24
25// EphemeralAppLauncher manages the launching of ephemeral apps. It handles
26// display of a prompt, initiates install of the app (if necessary) and finally
27// launches the app.
28class EphemeralAppLauncher
29    : public extensions::WebstoreStandaloneInstaller,
30      public content::WebContentsObserver,
31      public content::NotificationObserver {
32 public:
33  typedef WebstoreStandaloneInstaller::Callback Callback;
34
35  // Create for the app launcher.
36  static scoped_refptr<EphemeralAppLauncher> CreateForLauncher(
37      const std::string& webstore_item_id,
38      Profile* profile,
39      gfx::NativeWindow parent_window,
40      const Callback& callback);
41
42  // Create for a link within a browser tab.
43  static scoped_refptr<EphemeralAppLauncher> CreateForLink(
44      const std::string& webstore_item_id,
45      content::WebContents* web_contents);
46
47  // Initiate app launch.
48  void Start();
49
50 private:
51  friend class base::RefCountedThreadSafe<EphemeralAppLauncher>;
52
53  EphemeralAppLauncher(const std::string& webstore_item_id,
54                       Profile* profile,
55                       gfx::NativeWindow parent_window,
56                       const Callback& callback);
57  EphemeralAppLauncher(const std::string& webstore_item_id,
58                       content::WebContents* web_contents,
59                       const Callback& callback);
60
61  virtual ~EphemeralAppLauncher();
62
63  void Init();
64  void LaunchApp(const extensions::Extension* extension) const;
65
66  // WebstoreStandaloneInstaller implementation.
67  virtual bool CheckRequestorAlive() const OVERRIDE;
68  virtual const GURL& GetRequestorURL() const OVERRIDE;
69  virtual bool ShouldShowPostInstallUI() const OVERRIDE;
70  virtual bool ShouldShowAppInstalledBubble() const OVERRIDE;
71  virtual content::WebContents* GetWebContents() const OVERRIDE;
72  virtual scoped_ptr<ExtensionInstallPrompt::Prompt>
73      CreateInstallPrompt() const OVERRIDE;
74  virtual bool CheckInlineInstallPermitted(
75      const base::DictionaryValue& webstore_data,
76      std::string* error) const OVERRIDE;
77  virtual bool CheckRequestorPermitted(
78      const base::DictionaryValue& webstore_data,
79      std::string* error) const OVERRIDE;
80  virtual bool CheckInstallValid(
81      const base::DictionaryValue& manifest,
82      std::string* error) OVERRIDE;
83  virtual scoped_ptr<ExtensionInstallPrompt> CreateInstallUI() OVERRIDE;
84  virtual scoped_ptr<extensions::WebstoreInstaller::Approval>
85      CreateApproval() const OVERRIDE;
86  virtual void CompleteInstall(const std::string& error) OVERRIDE;
87
88  // content::WebContentsObserver implementation.
89  virtual void WebContentsDestroyed(
90      content::WebContents* web_contents) OVERRIDE;
91
92  // content::NotificationObserver implementation.
93  virtual void Observe(int type,
94                       const content::NotificationSource& source,
95                       const content::NotificationDetails& details) OVERRIDE;
96
97  content::NotificationRegistrar registrar_;
98
99  gfx::NativeWindow parent_window_;
100  scoped_ptr<content::WebContents> dummy_web_contents_;
101
102  DISALLOW_COPY_AND_ASSIGN(EphemeralAppLauncher);
103};
104
105#endif  // CHROME_BROWSER_APPS_EPHEMERAL_APP_LAUNCHER_H_
106