Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / apps / app_info_dialog / app_info_dialog_views.cc
index 0f34355..8a8197e 100644 (file)
@@ -7,12 +7,16 @@
 #include "base/bind.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/metrics/histogram.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
 #include "chrome/browser/ui/views/app_list/app_list_dialog_container.h"
 #include "chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.h"
 #include "chrome/browser/ui/views/apps/app_info_dialog/app_info_header_panel.h"
 #include "chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.h"
 #include "chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.h"
+#include "components/constrained_window/constrained_window_views.h"
+#include "extensions/browser/extension_registry.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest.h"
 #include "ui/app_list/app_list_constants.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/window/dialog_delegate.h"
 
-void ShowAppInfoDialog(gfx::NativeWindow parent,
-                       const gfx::Rect& bounds,
-                       Profile* profile,
-                       const extensions::Extension* app,
-                       const base::Closure& close_callback) {
+void ShowAppInfoInAppList(gfx::NativeWindow parent,
+                          const gfx::Rect& app_list_bounds,
+                          Profile* profile,
+                          const extensions::Extension* app,
+                          const base::Closure& close_callback) {
   UMA_HISTOGRAM_ENUMERATION("Apps.AppInfoDialogOpenedForType",
                             app->GetType(),
                             extensions::Manifest::NUM_LOAD_TYPES);
@@ -38,16 +42,41 @@ void ShowAppInfoDialog(gfx::NativeWindow parent,
                             extensions::Manifest::NUM_LOCATIONS);
 
   views::View* app_info_view = new AppInfoDialog(parent, profile, app);
-  views::Widget* dialog_widget = views::DialogDelegate::CreateDialogWidget(
-      new AppListDialogContainer(app_info_view, close_callback), NULL, parent);
-  dialog_widget->SetBounds(bounds);
+  views::DialogDelegate* dialog =
+      CreateAppListContainerForView(app_info_view, close_callback);
+  views::Widget* dialog_widget = CreateBrowserModalDialogViews(dialog, parent);
+  dialog_widget->SetBounds(app_list_bounds);
+  dialog_widget->Show();
+}
+
+void ShowAppInfoInNativeDialog(gfx::NativeWindow parent,
+                               const gfx::Size& size,
+                               Profile* profile,
+                               const extensions::Extension* app,
+                               const base::Closure& close_callback) {
+  views::View* app_info_view = new AppInfoDialog(parent, profile, app);
+  views::DialogDelegate* dialog =
+      CreateDialogContainerForView(app_info_view, size, close_callback);
+  views::Widget* dialog_widget = CreateBrowserModalDialogViews(dialog, parent);
   dialog_widget->Show();
 }
 
 AppInfoDialog::AppInfoDialog(gfx::NativeWindow parent_window,
                              Profile* profile,
                              const extensions::Extension* app)
-    : dialog_header_(NULL), dialog_body_(NULL), dialog_footer_(NULL) {
+    : dialog_header_(NULL),
+      dialog_body_(NULL),
+      dialog_footer_(NULL),
+      profile_(profile),
+      app_id_(app->id()),
+      extension_registry_(NULL) {
+  UMA_HISTOGRAM_ENUMERATION("Apps.AppInfoDialogOpenedForType",
+                            app->GetType(),
+                            extensions::Manifest::NUM_LOAD_TYPES);
+  UMA_HISTOGRAM_ENUMERATION("Apps.AppInfoDialogOpenedForLocation",
+                            app->location(),
+                            extensions::Manifest::NUM_LOCATIONS);
+
   views::BoxLayout* layout =
       new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0);
   SetLayoutManager(layout);
@@ -94,7 +123,44 @@ AppInfoDialog::AppInfoDialog(gfx::NativeWindow parent_window,
 
   if (dialog_footer_)
     AddChildView(dialog_footer_);
+
+  // Close the dialog if the app is uninstalled, or if the profile is destroyed.
+  StartObservingExtensionRegistry();
 }
 
 AppInfoDialog::~AppInfoDialog() {
+  StopObservingExtensionRegistry();
+}
+
+void AppInfoDialog::Close() {
+  GetWidget()->Close();
+}
+
+void AppInfoDialog::StartObservingExtensionRegistry() {
+  DCHECK(!extension_registry_);
+
+  extension_registry_ = extensions::ExtensionRegistry::Get(profile_);
+  extension_registry_->AddObserver(this);
+}
+
+void AppInfoDialog::StopObservingExtensionRegistry() {
+  if (extension_registry_)
+    extension_registry_->RemoveObserver(this);
+  extension_registry_ = NULL;
+}
+
+void AppInfoDialog::OnExtensionUninstalled(
+    content::BrowserContext* browser_context,
+    const extensions::Extension* extension,
+    extensions::UninstallReason reason) {
+  if (extension->id() != app_id_)
+    return;
+
+  Close();
+}
+
+void AppInfoDialog::OnShutdown(extensions::ExtensionRegistry* registry) {
+  DCHECK_EQ(extension_registry_, registry);
+  StopObservingExtensionRegistry();
+  Close();
 }