Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(396)

Side by Side Diff: chrome/browser/ui/views/extensions/extension_installed_bubble.cc

Issue 7529011: Add a flag that lets the webstore show a different UI on app install. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ready for review Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/extensions/extension_installed_bubble.h" 5 #include "chrome/browser/ui/views/extensions/extension_installed_bubble.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/i18n/rtl.h" 9 #include "base/i18n/rtl.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
11 #include "base/utf_string_conversions.h" 11 #include "base/utf_string_conversions.h"
12 #include "chrome/browser/extensions/extension_install_ui.h"
12 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/ui/browser.h" 14 #include "chrome/browser/ui/browser.h"
14 #include "chrome/browser/ui/browser_window.h" 15 #include "chrome/browser/ui/browser_window.h"
15 #include "chrome/browser/ui/views/browser_actions_container.h" 16 #include "chrome/browser/ui/views/browser_actions_container.h"
16 #include "chrome/browser/ui/views/frame/browser_view.h" 17 #include "chrome/browser/ui/views/frame/browser_view.h"
17 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" 18 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
19 #include "chrome/browser/ui/views/tabs/tab_strip.h"
18 #include "chrome/browser/ui/views/toolbar_view.h" 20 #include "chrome/browser/ui/views/toolbar_view.h"
19 #include "chrome/common/chrome_notification_types.h" 21 #include "chrome/common/chrome_notification_types.h"
20 #include "chrome/common/extensions/extension.h" 22 #include "chrome/common/extensions/extension.h"
21 #include "chrome/common/extensions/extension_action.h" 23 #include "chrome/common/extensions/extension_action.h"
22 #include "content/common/notification_details.h" 24 #include "content/common/notification_details.h"
23 #include "content/common/notification_source.h" 25 #include "content/common/notification_source.h"
24 #include "grit/generated_resources.h" 26 #include "grit/generated_resources.h"
25 #include "grit/theme_resources_standard.h" 27 #include "grit/theme_resources_standard.h"
26 #include "ui/base/l10n/l10n_util.h" 28 #include "ui/base/l10n/l10n_util.h"
27 #include "ui/base/resource/resource_bundle.h" 29 #include "ui/base/resource/resource_bundle.h"
28 #include "views/controls/button/image_button.h" 30 #include "views/controls/button/image_button.h"
29 #include "views/controls/image_view.h" 31 #include "views/controls/image_view.h"
30 #include "views/controls/label.h" 32 #include "views/controls/label.h"
33 #include "views/controls/link.h"
34 #include "views/controls/link_listener.h"
31 #include "views/layout/layout_constants.h" 35 #include "views/layout/layout_constants.h"
32 #include "views/view.h" 36 #include "views/view.h"
33 37
34 namespace { 38 namespace {
35 39
36 const int kIconSize = 43; 40 const int kIconSize = 43;
37 41
38 const int kRightColumnWidth = 285; 42 const int kRightColumnWidth = 285;
39 43
40 // The Bubble uses a BubbleBorder which adds about 6 pixels of whitespace 44 // The Bubble uses a BubbleBorder which adds about 6 pixels of whitespace
(...skipping 30 matching lines...) Expand all
71 Profile* profile) { 75 Profile* profile) {
72 ExtensionInstalledBubble::Show(extension, browser, icon); 76 ExtensionInstalledBubble::Show(extension, browser, icon);
73 } 77 }
74 78
75 } // namespace browser 79 } // namespace browser
76 80
77 // InstalledBubbleContent is the content view which is placed in the 81 // InstalledBubbleContent is the content view which is placed in the
78 // ExtensionInstalledBubble. It displays the install icon and explanatory 82 // ExtensionInstalledBubble. It displays the install icon and explanatory
79 // text about the installed extension. 83 // text about the installed extension.
80 class InstalledBubbleContent : public views::View, 84 class InstalledBubbleContent : public views::View,
81 public views::ButtonListener { 85 public views::ButtonListener,
86 public views::LinkListener {
82 public: 87 public:
83 InstalledBubbleContent(const Extension* extension, 88 InstalledBubbleContent(Browser* browser,
89 const Extension* extension,
84 ExtensionInstalledBubble::BubbleType type, 90 ExtensionInstalledBubble::BubbleType type,
85 SkBitmap* icon) 91 SkBitmap* icon)
86 : bubble_(NULL), 92 : browser_(browser),
93 extension_id_(extension->id()),
94 bubble_(NULL),
87 type_(type), 95 type_(type),
88 info_(NULL) { 96 info_(NULL) {
89 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 97 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
90 const gfx::Font& font = rb.GetFont(ResourceBundle::BaseFont); 98 const gfx::Font& font = rb.GetFont(ResourceBundle::BaseFont);
91 99
92 // Scale down to 43x43, but allow smaller icons (don't scale up). 100 // Scale down to 43x43, but allow smaller icons (don't scale up).
93 gfx::Size size(icon->width(), icon->height()); 101 gfx::Size size(icon->width(), icon->height());
94 if (size.width() > kIconSize || size.height() > kIconSize) 102 if (size.width() > kIconSize || size.height() > kIconSize)
95 size = gfx::Size(kIconSize, kIconSize); 103 size = gfx::Size(kIconSize, kIconSize);
96 icon_ = new views::ImageView(); 104 icon_ = new views::ImageView();
97 icon_->SetImageSize(size); 105 icon_->SetImageSize(size);
98 icon_->SetImage(*icon); 106 icon_->SetImage(*icon);
99 AddChildView(icon_); 107 AddChildView(icon_);
100 108
101 string16 extension_name = UTF8ToUTF16(extension->name()); 109 string16 extension_name = UTF8ToUTF16(extension->name());
102 base::i18n::AdjustStringForLocaleDirection(&extension_name); 110 base::i18n::AdjustStringForLocaleDirection(&extension_name);
103 heading_ = new views::Label(UTF16ToWide( 111 heading_ = new views::Label(UTF16ToWide(
104 l10n_util::GetStringFUTF16(IDS_EXTENSION_INSTALLED_HEADING, 112 l10n_util::GetStringFUTF16(IDS_EXTENSION_INSTALLED_HEADING,
105 extension_name))); 113 extension_name)));
106 heading_->SetFont(rb.GetFont(ResourceBundle::MediumFont)); 114 heading_->SetFont(rb.GetFont(ResourceBundle::MediumFont));
107 heading_->SetMultiLine(true); 115 heading_->SetMultiLine(true);
108 heading_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 116 heading_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
109 AddChildView(heading_); 117 AddChildView(heading_);
110 118
111 if (type_ == ExtensionInstalledBubble::PAGE_ACTION) { 119 if (type_ == ExtensionInstalledBubble::PAGE_ACTION) {
sky 2011/08/03 22:23:24 nit: seems weird to have three separate ifs for th
asargent_no_longer_on_chrome 2011/08/04 00:00:16 Good suggestion - that looks a little cleaner.
112 info_ = new views::Label(UTF16ToWide(l10n_util::GetStringUTF16( 120 info_ = new views::Label(UTF16ToWide(l10n_util::GetStringUTF16(
113 IDS_EXTENSION_INSTALLED_PAGE_ACTION_INFO))); 121 IDS_EXTENSION_INSTALLED_PAGE_ACTION_INFO)));
114 info_->SetFont(font); 122 info_->SetFont(font);
115 info_->SetMultiLine(true); 123 info_->SetMultiLine(true);
116 info_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 124 info_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
117 AddChildView(info_); 125 AddChildView(info_);
118 } 126 }
119 127
120 if (type_ == ExtensionInstalledBubble::OMNIBOX_KEYWORD) { 128 if (type_ == ExtensionInstalledBubble::OMNIBOX_KEYWORD) {
121 info_ = new views::Label(UTF16ToWide(l10n_util::GetStringFUTF16( 129 info_ = new views::Label(UTF16ToWide(l10n_util::GetStringFUTF16(
122 IDS_EXTENSION_INSTALLED_OMNIBOX_KEYWORD_INFO, 130 IDS_EXTENSION_INSTALLED_OMNIBOX_KEYWORD_INFO,
123 UTF8ToUTF16(extension->omnibox_keyword())))); 131 UTF8ToUTF16(extension->omnibox_keyword()))));
124 info_->SetFont(font); 132 info_->SetFont(font);
125 info_->SetMultiLine(true); 133 info_->SetMultiLine(true);
126 info_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 134 info_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
127 AddChildView(info_); 135 AddChildView(info_);
128 } 136 }
129 137
130 manage_ = new views::Label(UTF16ToWide( 138 if (type_ == ExtensionInstalledBubble::APP) {
131 l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALLED_MANAGE_INFO))); 139 views::Link* link = new views::Link(UTF16ToWide(l10n_util::GetStringUTF16(
132 manage_->SetFont(font); 140 IDS_EXTENSION_INSTALLED_APP_INFO)));
133 manage_->SetMultiLine(true); 141 link->set_listener(this);
134 manage_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 142 manage_ = link;
135 AddChildView(manage_); 143 manage_->SetFont(font);
144 manage_->SetMultiLine(true);
145 manage_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
146 AddChildView(manage_);
147 } else {
148 manage_ = new views::Label(UTF16ToWide(
149 l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALLED_MANAGE_INFO)));
150 manage_->SetFont(font);
151 manage_->SetMultiLine(true);
152 manage_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
153 AddChildView(manage_);
154 }
136 155
137 close_button_ = new views::ImageButton(this); 156 close_button_ = new views::ImageButton(this);
138 close_button_->SetImage(views::CustomButton::BS_NORMAL, 157 close_button_->SetImage(views::CustomButton::BS_NORMAL,
139 rb.GetBitmapNamed(IDR_CLOSE_BAR)); 158 rb.GetBitmapNamed(IDR_CLOSE_BAR));
140 close_button_->SetImage(views::CustomButton::BS_HOT, 159 close_button_->SetImage(views::CustomButton::BS_HOT,
141 rb.GetBitmapNamed(IDR_CLOSE_BAR_H)); 160 rb.GetBitmapNamed(IDR_CLOSE_BAR_H));
142 close_button_->SetImage(views::CustomButton::BS_PUSHED, 161 close_button_->SetImage(views::CustomButton::BS_PUSHED,
143 rb.GetBitmapNamed(IDR_CLOSE_BAR_P)); 162 rb.GetBitmapNamed(IDR_CLOSE_BAR_P));
144 AddChildView(close_button_); 163 AddChildView(close_button_);
145 } 164 }
146 165
147 void set_bubble(Bubble* bubble) { bubble_ = bubble; } 166 void set_bubble(Bubble* bubble) { bubble_ = bubble; }
148 167
149 virtual void ButtonPressed( 168 virtual void ButtonPressed(
150 views::Button* sender, 169 views::Button* sender,
151 const views::Event& event) { 170 const views::Event& event) {
152 if (sender == close_button_) { 171 if (sender == close_button_) {
153 bubble_->set_fade_away_on_close(true); 172 bubble_->set_fade_away_on_close(true);
154 GetWidget()->Close(); 173 GetWidget()->Close();
155 } else { 174 } else {
156 NOTREACHED() << "Unknown view"; 175 NOTREACHED() << "Unknown view";
157 } 176 }
158 } 177 }
159 178
179 // Implements the views::LinkListener interface.
180 virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE {
181 GetWidget()->Close();
182 ExtensionInstallUI::OpenAppInstalledNTP(browser_, extension_id_);
183 };
sky 2011/08/03 22:23:24 nit: no ;
asargent_no_longer_on_chrome 2011/08/04 00:00:16 oops! Done.
184
160 private: 185 private:
161 virtual gfx::Size GetPreferredSize() { 186 virtual gfx::Size GetPreferredSize() {
162 int width = kHorizOuterMargin; 187 int width = kHorizOuterMargin;
163 width += kIconSize; 188 width += kIconSize;
164 width += views::kPanelHorizMargin; 189 width += views::kPanelHorizMargin;
165 width += kRightColumnWidth; 190 width += kRightColumnWidth;
166 width += 2 * views::kPanelHorizMargin; 191 width += 2 * views::kPanelHorizMargin;
167 width += kHorizOuterMargin; 192 width += kHorizOuterMargin;
168 193
169 int height = kVertOuterMargin; 194 int height = kVertOuterMargin;
170 height += heading_->GetHeightForWidth(kRightColumnWidth); 195 height += heading_->GetHeightForWidth(kRightColumnWidth);
171 height += kVertInnerMargin; 196 height += kVertInnerMargin;
172 if (type_ == ExtensionInstalledBubble::PAGE_ACTION || 197 if (info_) {
173 type_ == ExtensionInstalledBubble::OMNIBOX_KEYWORD) {
174 height += info_->GetHeightForWidth(kRightColumnWidth); 198 height += info_->GetHeightForWidth(kRightColumnWidth);
175 height += kVertInnerMargin; 199 height += kVertInnerMargin;
176 } 200 }
177 height += manage_->GetHeightForWidth(kRightColumnWidth); 201 height += manage_->GetHeightForWidth(kRightColumnWidth);
178 height += kVertOuterMargin; 202 height += kVertOuterMargin;
179 203
180 return gfx::Size(width, std::max(height, kIconSize + 2 * kVertOuterMargin)); 204 return gfx::Size(width, std::max(height, kIconSize + 2 * kVertOuterMargin));
181 } 205 }
182 206
183 virtual void Layout() { 207 virtual void Layout() {
184 int x = kHorizOuterMargin; 208 int x = kHorizOuterMargin;
185 int y = kVertOuterMargin; 209 int y = kVertOuterMargin;
186 210
187 icon_->SetBounds(x, y, kIconSize, kIconSize); 211 icon_->SetBounds(x, y, kIconSize, kIconSize);
188 x += kIconSize; 212 x += kIconSize;
189 x += views::kPanelHorizMargin; 213 x += views::kPanelHorizMargin;
190 214
191 y += kRightcolumnVerticalShift; 215 y += kRightcolumnVerticalShift;
192 heading_->SizeToFit(kRightColumnWidth); 216 heading_->SizeToFit(kRightColumnWidth);
193 heading_->SetX(x); 217 heading_->SetX(x);
194 heading_->SetY(y); 218 heading_->SetY(y);
195 y += heading_->height(); 219 y += heading_->height();
196 y += kVertInnerMargin; 220 y += kVertInnerMargin;
197 221
198 if (type_ == ExtensionInstalledBubble::PAGE_ACTION || 222 if (info_) {
199 type_ == ExtensionInstalledBubble::OMNIBOX_KEYWORD) {
200 info_->SizeToFit(kRightColumnWidth); 223 info_->SizeToFit(kRightColumnWidth);
201 info_->SetX(x); 224 info_->SetX(x);
202 info_->SetY(y); 225 info_->SetY(y);
203 y += info_->height(); 226 y += info_->height();
204 y += kVertInnerMargin; 227 y += kVertInnerMargin;
205 } 228 }
206 229
207 manage_->SizeToFit(kRightColumnWidth); 230 manage_->SizeToFit(kRightColumnWidth);
208 manage_->SetX(x); 231 manage_->SetX(x);
209 manage_->SetY(y); 232 manage_->SetY(y);
210 y += manage_->height(); 233 y += manage_->height();
211 y += kVertInnerMargin; 234 y += kVertInnerMargin;
212 235
213 gfx::Size sz; 236 gfx::Size sz;
214 x += kRightColumnWidth + 2 * views::kPanelHorizMargin + kHorizOuterMargin - 237 x += kRightColumnWidth + 2 * views::kPanelHorizMargin + kHorizOuterMargin -
215 close_button_->GetPreferredSize().width(); 238 close_button_->GetPreferredSize().width();
216 y = kVertOuterMargin; 239 y = kVertOuterMargin;
217 sz = close_button_->GetPreferredSize(); 240 sz = close_button_->GetPreferredSize();
218 // x-1 & y-1 is just slop to get the close button visually aligned with the 241 // x-1 & y-1 is just slop to get the close button visually aligned with the
219 // title text and bubble arrow. 242 // title text and bubble arrow.
220 close_button_->SetBounds(x - 1, y - 1, sz.width(), sz.height()); 243 close_button_->SetBounds(x - 1, y - 1, sz.width(), sz.height());
221 } 244 }
222 245
246 // The browser we're associated with.
247 Browser* browser_;
248
249 // The id of the extension just installed.
250 std::string extension_id_;
sky 2011/08/03 22:23:24 nit: const
asargent_no_longer_on_chrome 2011/08/04 00:00:16 Done.
251
223 // The Bubble showing us. 252 // The Bubble showing us.
224 Bubble* bubble_; 253 Bubble* bubble_;
225 254
226 ExtensionInstalledBubble::BubbleType type_; 255 ExtensionInstalledBubble::BubbleType type_;
227 views::ImageView* icon_; 256 views::ImageView* icon_;
228 views::Label* heading_; 257 views::Label* heading_;
229 views::Label* info_; 258 views::Label* info_;
230 views::Label* manage_; 259 views::Label* manage_;
231 views::ImageButton* close_button_; 260 views::ImageButton* close_button_;
232 261
233 DISALLOW_COPY_AND_ASSIGN(InstalledBubbleContent); 262 DISALLOW_COPY_AND_ASSIGN(InstalledBubbleContent);
234 }; 263 };
235 264
236 void ExtensionInstalledBubble::Show(const Extension* extension, 265 void ExtensionInstalledBubble::Show(const Extension* extension,
237 Browser *browser, 266 Browser *browser,
238 const SkBitmap& icon) { 267 const SkBitmap& icon) {
239 new ExtensionInstalledBubble(extension, browser, icon); 268 new ExtensionInstalledBubble(extension, browser, icon);
240 } 269 }
241 270
242 ExtensionInstalledBubble::ExtensionInstalledBubble(const Extension* extension, 271 ExtensionInstalledBubble::ExtensionInstalledBubble(const Extension* extension,
243 Browser *browser, 272 Browser *browser,
244 const SkBitmap& icon) 273 const SkBitmap& icon)
245 : extension_(extension), 274 : extension_(extension),
246 browser_(browser), 275 browser_(browser),
247 icon_(icon), 276 icon_(icon),
248 animation_wait_retries_(0) { 277 animation_wait_retries_(0) {
249 AddRef(); // Balanced in BubbleClosing. 278 AddRef(); // Balanced in BubbleClosing.
250 279
251 if (!extension_->omnibox_keyword().empty()) { 280 if (extension->is_app()) {
281 type_ = APP;
282 } else if (!extension_->omnibox_keyword().empty()) {
252 type_ = OMNIBOX_KEYWORD; 283 type_ = OMNIBOX_KEYWORD;
253 } else if (extension_->browser_action()) { 284 } else if (extension_->browser_action()) {
254 type_ = BROWSER_ACTION; 285 type_ = BROWSER_ACTION;
255 } else if (extension->page_action() && 286 } else if (extension->page_action() &&
256 !extension->page_action()->default_icon_path().empty()) { 287 !extension->page_action()->default_icon_path().empty()) {
257 type_ = PAGE_ACTION; 288 type_ = PAGE_ACTION;
258 } else { 289 } else {
259 type_ = GENERIC; 290 type_ = GENERIC;
260 } 291 }
261 292
(...skipping 29 matching lines...) Expand all
291 } else { 322 } else {
292 NOTREACHED() << L"Received unexpected notification"; 323 NOTREACHED() << L"Received unexpected notification";
293 } 324 }
294 } 325 }
295 326
296 void ExtensionInstalledBubble::ShowInternal() { 327 void ExtensionInstalledBubble::ShowInternal() {
297 BrowserView* browser_view = BrowserView::GetBrowserViewForNativeWindow( 328 BrowserView* browser_view = BrowserView::GetBrowserViewForNativeWindow(
298 browser_->window()->GetNativeHandle()); 329 browser_->window()->GetNativeHandle());
299 330
300 const views::View* reference_view = NULL; 331 const views::View* reference_view = NULL;
301 if (type_ == BROWSER_ACTION) { 332 if (type_ == APP) {
333 AbstractTabStripView* tabstrip = browser_view->tabstrip();
sky 2011/08/03 22:23:24 There are two cases that are probably worth checki
asargent_no_longer_on_chrome 2011/08/04 00:00:16 Thanks for pointing this out! I've modified the CL
334 if (tabstrip->GetNewTabButton()) {
335 reference_view = tabstrip->GetNewTabButton();
336 } else {
337 // If this tab strip doesn't have a new tab button, just have the bubble
338 // point at the tab strip.
339 reference_view = tabstrip;
340 }
341 } else if (type_ == BROWSER_ACTION) {
302 BrowserActionsContainer* container = 342 BrowserActionsContainer* container =
303 browser_view->GetToolbarView()->browser_actions(); 343 browser_view->GetToolbarView()->browser_actions();
304 if (container->animating() && 344 if (container->animating() &&
305 animation_wait_retries_++ < kAnimationWaitMaxRetry) { 345 animation_wait_retries_++ < kAnimationWaitMaxRetry) {
306 // We don't know where the view will be until the container has stopped 346 // We don't know where the view will be until the container has stopped
307 // animating, so check back in a little while. 347 // animating, so check back in a little while.
308 MessageLoopForUI::current()->PostDelayedTask( 348 MessageLoopForUI::current()->PostDelayedTask(
309 FROM_HERE, NewRunnableMethod(this, 349 FROM_HERE, NewRunnableMethod(this,
310 &ExtensionInstalledBubble::ShowInternal), kAnimationWaitTime); 350 &ExtensionInstalledBubble::ShowInternal), kAnimationWaitTime);
311 return; 351 return;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 385
346 // For omnibox keyword bubbles, move the arrow to point to the left edge 386 // For omnibox keyword bubbles, move the arrow to point to the left edge
347 // of the omnibox, just to the right of the icon. 387 // of the omnibox, just to the right of the icon.
348 if (type_ == OMNIBOX_KEYWORD) { 388 if (type_ == OMNIBOX_KEYWORD) {
349 bounds.set_origin( 389 bounds.set_origin(
350 browser_view->GetLocationBarView()->GetLocationEntryOrigin()); 390 browser_view->GetLocationBarView()->GetLocationEntryOrigin());
351 bounds.set_width(0); 391 bounds.set_width(0);
352 arrow_location = BubbleBorder::TOP_LEFT; 392 arrow_location = BubbleBorder::TOP_LEFT;
353 } 393 }
354 394
355 bubble_content_ = new InstalledBubbleContent(extension_, type_, &icon_); 395 bubble_content_ = new InstalledBubbleContent(
396 browser_, extension_, type_, &icon_);
356 Bubble* bubble = Bubble::Show(browser_view->GetWidget(), bounds, 397 Bubble* bubble = Bubble::Show(browser_view->GetWidget(), bounds,
357 arrow_location, bubble_content_, this); 398 arrow_location, bubble_content_, this);
358 bubble_content_->set_bubble(bubble); 399 bubble_content_->set_bubble(bubble);
359 } 400 }
360 401
361 // BubbleDelegate 402 // BubbleDelegate
362 void ExtensionInstalledBubble::BubbleClosing(Bubble* bubble, 403 void ExtensionInstalledBubble::BubbleClosing(Bubble* bubble,
363 bool closed_by_escape) { 404 bool closed_by_escape) {
364 if (extension_ && type_ == PAGE_ACTION) { 405 if (extension_ && type_ == PAGE_ACTION) {
365 BrowserView* browser_view = BrowserView::GetBrowserViewForNativeWindow( 406 BrowserView* browser_view = BrowserView::GetBrowserViewForNativeWindow(
366 browser_->window()->GetNativeHandle()); 407 browser_->window()->GetNativeHandle());
367 browser_view->GetLocationBarView()->SetPreviewEnabledPageAction( 408 browser_view->GetLocationBarView()->SetPreviewEnabledPageAction(
368 extension_->page_action(), 409 extension_->page_action(),
369 false); // preview_enabled 410 false); // preview_enabled
370 } 411 }
371 412
372 Release(); // Balanced in ctor. 413 Release(); // Balanced in ctor.
373 } 414 }
374 415
375 bool ExtensionInstalledBubble::CloseOnEscape() { 416 bool ExtensionInstalledBubble::CloseOnEscape() {
376 return true; 417 return true;
377 } 418 }
378 419
379 bool ExtensionInstalledBubble::FadeInOnShow() { 420 bool ExtensionInstalledBubble::FadeInOnShow() {
380 return true; 421 return true;
381 } 422 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698