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#include "chrome/browser/extensions/extension_error_ui_default.h"
6
7#include "base/logging.h"
8#include "chrome/browser/extensions/extension_service.h"
9#include "chrome/browser/ui/browser.h"
10#include "chrome/browser/ui/browser_finder.h"
11#include "chrome/browser/ui/chrome_pages.h"
12#include "chrome/browser/ui/global_error/global_error_bubble_view_base.h"
13
14ExtensionErrorUIDefault::ExtensionErrorUIDefault(
15    ExtensionService* extension_service)
16    : ExtensionErrorUI(extension_service),
17      browser_(NULL),
18      global_error_(new ExtensionGlobalError(this)) {
19}
20
21ExtensionErrorUIDefault::~ExtensionErrorUIDefault() {
22}
23
24bool ExtensionErrorUIDefault::ShowErrorInBubbleView() {
25  Browser* browser =
26      chrome::FindLastActiveWithProfile(extension_service()->profile(),
27                                        chrome::GetActiveDesktop());
28  if (!browser)
29    return false;
30
31  browser_ = browser;
32  global_error_->ShowBubbleView(browser);
33  return true;
34}
35
36void ExtensionErrorUIDefault::ShowExtensions() {
37  DCHECK(browser_);
38  chrome::ShowExtensions(browser_, std::string());
39}
40
41void ExtensionErrorUIDefault::Close() {
42  if (global_error_->HasShownBubbleView()) {
43    // Will end up calling into |global_error_|->OnBubbleViewDidClose,
44    // possibly synchronously.
45    global_error_->GetBubbleView()->CloseBubbleView();
46  }
47}
48
49ExtensionErrorUIDefault::ExtensionGlobalError::ExtensionGlobalError(
50    ExtensionErrorUIDefault* error_ui)
51    : error_ui_(error_ui) {
52}
53
54bool ExtensionErrorUIDefault::ExtensionGlobalError::HasMenuItem() {
55  return false;
56}
57
58int ExtensionErrorUIDefault::ExtensionGlobalError::MenuItemCommandID() {
59  NOTREACHED();
60  return 0;
61}
62
63base::string16 ExtensionErrorUIDefault::ExtensionGlobalError::MenuItemLabel() {
64  NOTREACHED();
65  return NULL;
66}
67
68void ExtensionErrorUIDefault::ExtensionGlobalError::ExecuteMenuItem(
69    Browser* browser) {
70  NOTREACHED();
71}
72
73base::string16
74ExtensionErrorUIDefault::ExtensionGlobalError::GetBubbleViewTitle() {
75  return error_ui_->GetBubbleViewTitle();
76}
77
78std::vector<base::string16>
79ExtensionErrorUIDefault::ExtensionGlobalError::GetBubbleViewMessages() {
80  return error_ui_->GetBubbleViewMessages();
81}
82
83base::string16 ExtensionErrorUIDefault::ExtensionGlobalError::
84    GetBubbleViewAcceptButtonLabel() {
85  return error_ui_->GetBubbleViewAcceptButtonLabel();
86}
87
88base::string16 ExtensionErrorUIDefault::ExtensionGlobalError::
89    GetBubbleViewCancelButtonLabel() {
90  return error_ui_->GetBubbleViewCancelButtonLabel();
91}
92
93void ExtensionErrorUIDefault::ExtensionGlobalError::
94    OnBubbleViewDidClose(Browser* browser) {
95  // Calling BubbleViewDidClose on |error_ui_| will delete it. It owns us, so
96  // |this| will be deleted too.
97  error_ui_->BubbleViewDidClose();
98}
99
100void ExtensionErrorUIDefault::ExtensionGlobalError::
101    BubbleViewAcceptButtonPressed(Browser* browser) {
102  error_ui_->BubbleViewAcceptButtonPressed();
103}
104
105void ExtensionErrorUIDefault::ExtensionGlobalError::
106    BubbleViewCancelButtonPressed(Browser* browser) {
107  error_ui_->BubbleViewCancelButtonPressed();
108}
109
110// static
111ExtensionErrorUI* ExtensionErrorUI::Create(
112    ExtensionService* extension_service) {
113  return new ExtensionErrorUIDefault(extension_service);
114}
115