#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);
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);
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();
}