1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/extensions/extension_infobar_delegate.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/extensions/extension_host.h"
#include "chrome/browser/extensions/extension_process_manager.h"
#include "chrome/browser/tab_contents/tab_contents.h"
#include "chrome/common/notification_details.h"
#include "chrome/common/notification_source.h"
#include "chrome/common/notification_type.h"
ExtensionInfoBarDelegate::ExtensionInfoBarDelegate(Browser* browser,
TabContents* tab_contents,
Extension* extension,
const GURL& url)
: InfoBarDelegate(tab_contents),
extension_(extension),
tab_contents_(tab_contents) {
ExtensionProcessManager* manager =
browser->profile()->GetExtensionProcessManager();
extension_host_.reset(manager->CreateInfobar(url, browser));
registrar_.Add(this, NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE,
Source<Profile>(browser->profile()));
registrar_.Add(this, NotificationType::EXTENSION_UNLOADED,
Source<Profile>(browser->profile()));
}
ExtensionInfoBarDelegate::~ExtensionInfoBarDelegate() {
}
bool ExtensionInfoBarDelegate::EqualsDelegate(InfoBarDelegate* delegate) const {
ExtensionInfoBarDelegate* extension_delegate =
delegate->AsExtensionInfoBarDelegate();
// When an extension crashes, an InfoBar is shown (for the crashed extension).
// That will result in a call to this function (to see if this InfoBarDelegate
// is already showing the 'extension crashed InfoBar', which it never is), but
// if it is our extension that crashes, the extension delegate is NULL so
// we cannot check.
if (!extension_delegate)
return false;
// Only allow one InfoBar at a time per extension.
return extension_delegate->extension_host()->extension() ==
extension_host_->extension();
}
void ExtensionInfoBarDelegate::InfoBarClosed() {
delete this;
}
#if !defined(TOOLKIT_VIEWS)
InfoBar* ExtensionInfoBarDelegate::CreateInfoBar() {
NOTIMPLEMENTED();
return NULL;
}
#endif // !TOOLKIT_VIEWS
void ExtensionInfoBarDelegate::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
switch (type.value) {
case NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE: {
const ExtensionHost* result = Details<ExtensionHost>(details).ptr();
if (extension_host_.get() == result)
tab_contents_->RemoveInfoBar(this);
break;
}
case NotificationType::EXTENSION_UNLOADED: {
Extension* extension = Details<Extension>(details).ptr();
if (extension_ == extension)
tab_contents_->RemoveInfoBar(this);
break;
}
default: {
NOTREACHED() << "Unknown message";
break;
}
}
}
|