1// Copyright (c) 2012 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_EXTENSION_UNINSTALL_DIALOG_H_ 6#define CHROME_BROWSER_EXTENSIONS_EXTENSION_UNINSTALL_DIALOG_H_ 7 8#include "base/basictypes.h" 9#include "base/compiler_specific.h" 10#include "base/memory/scoped_ptr.h" 11#include "base/memory/weak_ptr.h" 12#include "content/public/browser/notification_observer.h" 13#include "content/public/browser/notification_registrar.h" 14#include "ui/gfx/image/image_skia.h" 15 16class Browser; 17class Profile; 18 19namespace base { 20class MessageLoop; 21} 22 23namespace extensions { 24class Extension; 25} 26 27namespace gfx { 28class Image; 29} 30 31class ExtensionUninstallDialog 32 : public content::NotificationObserver, 33 public base::SupportsWeakPtr<ExtensionUninstallDialog> { 34 public: 35 class Delegate { 36 public: 37 // We call this method to signal that the uninstallation should continue. 38 virtual void ExtensionUninstallAccepted() = 0; 39 40 // We call this method to signal that the uninstallation should stop. 41 virtual void ExtensionUninstallCanceled() = 0; 42 43 protected: 44 virtual ~Delegate() {} 45 }; 46 47 // Creates a platform specific implementation of ExtensionUninstallDialog. 48 // |profile| and |delegate| can never be NULL. 49 // |browser| can be NULL only for Ash when this is used with the applist 50 // window. 51 static ExtensionUninstallDialog* Create(Profile* profile, 52 Browser* browser, 53 Delegate* delegate); 54 55 virtual ~ExtensionUninstallDialog(); 56 57 // This is called to verify whether the uninstallation should proceed. 58 // Starts the process of showing a confirmation UI, which is split into two. 59 // 1) Set off a 'load icon' task. 60 // 2) Handle the load icon response and show the UI (OnImageLoaded). 61 void ConfirmUninstall(const extensions::Extension* extension); 62 63 protected: 64 // Constructor used by the derived classes. 65 ExtensionUninstallDialog(Profile* profile, 66 Browser* browser, 67 Delegate* delegate); 68 69 Profile* const profile_; 70 71 Browser* browser_; 72 73 // The delegate we will call Accepted/Canceled on after confirmation dialog. 74 Delegate* delegate_; 75 76 // The extension we are showing the dialog for. 77 const extensions::Extension* extension_; 78 79 // The extensions icon. 80 gfx::ImageSkia icon_; 81 82 private: 83 // Sets the icon that will be used in the dialog. If |icon| contains an empty 84 // image, then we use a default icon instead. 85 void SetIcon(const gfx::Image& image); 86 87 void OnImageLoaded(const gfx::Image& image); 88 89 // content::NotificationObserver implementation. 90 virtual void Observe(int type, 91 const content::NotificationSource& source, 92 const content::NotificationDetails& details) OVERRIDE; 93 94 // Displays the prompt. This should only be called after loading the icon. 95 // The implementations of this method are platform-specific. 96 virtual void Show() = 0; 97 98 // Keeps track of whether we're still waiting for an image to load before 99 // we show the dialog. 100 enum State { 101 kImageIsLoading, // Image is loading asynchronously. 102 kDialogIsShowing, // Dialog is shown after image is loaded. 103 kBrowserIsClosing // Browser is closed while image is still loading. 104 }; 105 State state_; 106 107 base::MessageLoop* ui_loop_; 108 109 content::NotificationRegistrar registrar_; 110 111 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialog); 112}; 113 114#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_UNINSTALL_DIALOG_H_ 115