OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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_message_bubble_view.h" | 5 #include "chrome/browser/ui/views/extensions/extension_message_bubble_view.h" |
6 | 6 |
7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "chrome/browser/extensions/dev_mode_bubble_controller.h" | 10 #include "chrome/browser/extensions/dev_mode_bubble_controller.h" |
11 #include "chrome/browser/extensions/extension_action_manager.h" | 11 #include "chrome/browser/extensions/extension_action_manager.h" |
12 #include "chrome/browser/extensions/extension_message_bubble_controller.h" | 12 #include "chrome/browser/extensions/extension_message_bubble_controller.h" |
13 #include "chrome/browser/extensions/extension_service.h" | 13 #include "chrome/browser/extensions/extension_service.h" |
14 #include "chrome/browser/extensions/proxy_overridden_bubble_controller.h" | |
14 #include "chrome/browser/extensions/settings_api_bubble_controller.h" | 15 #include "chrome/browser/extensions/settings_api_bubble_controller.h" |
15 #include "chrome/browser/extensions/settings_api_helpers.h" | 16 #include "chrome/browser/extensions/settings_api_helpers.h" |
16 #include "chrome/browser/extensions/suspicious_extension_bubble_controller.h" | 17 #include "chrome/browser/extensions/suspicious_extension_bubble_controller.h" |
17 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
18 #include "chrome/browser/ui/views/frame/browser_view.h" | 19 #include "chrome/browser/ui/views/frame/browser_view.h" |
19 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" | 20 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" |
20 #include "chrome/browser/ui/views/toolbar/browser_actions_container_observer.h" | 21 #include "chrome/browser/ui/views/toolbar/browser_actions_container_observer.h" |
21 #include "chrome/browser/ui/views/toolbar/toolbar_view.h" | 22 #include "chrome/browser/ui/views/toolbar/toolbar_view.h" |
22 #include "extensions/browser/extension_prefs.h" | 23 #include "extensions/browser/extension_prefs.h" |
23 #include "extensions/browser/extension_system.h" | 24 #include "extensions/browser/extension_system.h" |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
265 //////////////////////////////////////////////////////////////////////////////// | 266 //////////////////////////////////////////////////////////////////////////////// |
266 // ExtensionMessageBubbleFactory | 267 // ExtensionMessageBubbleFactory |
267 | 268 |
268 ExtensionMessageBubbleFactory::ExtensionMessageBubbleFactory( | 269 ExtensionMessageBubbleFactory::ExtensionMessageBubbleFactory( |
269 Profile* profile, | 270 Profile* profile, |
270 ToolbarView* toolbar_view) | 271 ToolbarView* toolbar_view) |
271 : profile_(profile), | 272 : profile_(profile), |
272 toolbar_view_(toolbar_view), | 273 toolbar_view_(toolbar_view), |
273 shown_suspicious_extensions_bubble_(false), | 274 shown_suspicious_extensions_bubble_(false), |
274 shown_startup_override_extensions_bubble_(false), | 275 shown_startup_override_extensions_bubble_(false), |
276 shown_proxy_override_extensions_bubble_(false), | |
275 shown_dev_mode_extensions_bubble_(false), | 277 shown_dev_mode_extensions_bubble_(false), |
276 is_observing_(false), | 278 is_observing_(false), |
277 stage_(STAGE_START), | 279 stage_(STAGE_START), |
278 container_(NULL), | 280 container_(NULL), |
279 anchor_view_(NULL) {} | 281 anchor_view_(NULL) {} |
280 | 282 |
281 ExtensionMessageBubbleFactory::~ExtensionMessageBubbleFactory() { | 283 ExtensionMessageBubbleFactory::~ExtensionMessageBubbleFactory() { |
282 MaybeStopObserving(); | 284 MaybeStopObserving(); |
283 } | 285 } |
284 | 286 |
(...skipping 12 matching lines...) Expand all Loading... | |
297 // way, we're not too spammy with the bubbles. | 299 // way, we're not too spammy with the bubbles. |
298 if (!shown_suspicious_extensions_bubble_ && | 300 if (!shown_suspicious_extensions_bubble_ && |
299 MaybeShowSuspiciousExtensionsBubble(anchor_view)) | 301 MaybeShowSuspiciousExtensionsBubble(anchor_view)) |
300 return; | 302 return; |
301 | 303 |
302 if (!shown_startup_override_extensions_bubble_ && | 304 if (!shown_startup_override_extensions_bubble_ && |
303 is_initial_check && | 305 is_initial_check && |
304 MaybeShowStartupOverrideExtensionsBubble(anchor_view)) | 306 MaybeShowStartupOverrideExtensionsBubble(anchor_view)) |
305 return; | 307 return; |
306 | 308 |
309 if (!shown_proxy_override_extensions_bubble_ && | |
310 MaybeShowProxyOverrideExtensionsBubble(anchor_view)) | |
311 return; | |
312 | |
307 if (!shown_dev_mode_extensions_bubble_) | 313 if (!shown_dev_mode_extensions_bubble_) |
308 MaybeShowDevModeExtensionsBubble(anchor_view); | 314 MaybeShowDevModeExtensionsBubble(anchor_view); |
309 #endif // OS_WIN | 315 #endif // OS_WIN |
310 } | 316 } |
311 | 317 |
312 bool ExtensionMessageBubbleFactory::MaybeShowSuspiciousExtensionsBubble( | 318 bool ExtensionMessageBubbleFactory::MaybeShowSuspiciousExtensionsBubble( |
313 views::View* anchor_view) { | 319 views::View* anchor_view) { |
314 DCHECK(!shown_suspicious_extensions_bubble_); | 320 DCHECK(!shown_suspicious_extensions_bubble_); |
315 | 321 |
316 scoped_ptr<SuspiciousExtensionBubbleController> suspicious_extensions( | 322 scoped_ptr<SuspiciousExtensionBubbleController> suspicious_extensions( |
(...skipping 27 matching lines...) Expand all Loading... | |
344 if (!extension) | 350 if (!extension) |
345 return false; | 351 return false; |
346 | 352 |
347 scoped_ptr<SettingsApiBubbleController> settings_api_bubble( | 353 scoped_ptr<SettingsApiBubbleController> settings_api_bubble( |
348 new SettingsApiBubbleController(profile_, | 354 new SettingsApiBubbleController(profile_, |
349 BUBBLE_TYPE_STARTUP_PAGES)); | 355 BUBBLE_TYPE_STARTUP_PAGES)); |
350 if (!settings_api_bubble->ShouldShow(extension->id())) | 356 if (!settings_api_bubble->ShouldShow(extension->id())) |
351 return false; | 357 return false; |
352 | 358 |
353 shown_startup_override_extensions_bubble_ = true; | 359 shown_startup_override_extensions_bubble_ = true; |
354 SettingsApiBubbleController* weak_controller = settings_api_bubble.get(); | 360 PrepareToHighlightExtensions( |
355 ExtensionMessageBubbleView* bubble_delegate = new ExtensionMessageBubbleView( | 361 settings_api_bubble.PassAs<ExtensionMessageBubbleController>(), |
356 anchor_view, | 362 anchor_view); |
357 views::BubbleBorder::TOP_RIGHT, | |
358 settings_api_bubble.PassAs<ExtensionMessageBubbleController>()); | |
359 views::BubbleDelegateView::CreateBubble(bubble_delegate); | |
360 weak_controller->Show(bubble_delegate); | |
361 | |
362 return true; | 363 return true; |
363 } | 364 } |
364 | 365 |
366 bool ExtensionMessageBubbleFactory::MaybeShowProxyOverrideExtensionsBubble( | |
367 views::View* anchor_view) { | |
368 #if !defined(OS_WIN) | |
369 return false; | |
Devlin
2014/05/20 17:26:31
Hopefully no compilers complain that lines 371-386
Finnur
2014/05/21 16:30:32
Meh... less code to compile on other platforms...
| |
370 #endif | |
371 | |
372 DCHECK(!shown_proxy_override_extensions_bubble_); | |
373 | |
374 const Extension* extension = OverridesProxy(profile_); | |
375 if (!extension) | |
376 return false; | |
377 | |
378 scoped_ptr<ProxyOverriddenBubbleController> proxy_bubble( | |
379 new ProxyOverriddenBubbleController(profile_)); | |
380 if (!proxy_bubble->ShouldShow(extension->id())) | |
381 return false; | |
382 | |
383 shown_proxy_override_extensions_bubble_ = true; | |
384 PrepareToHighlightExtensions( | |
385 proxy_bubble.PassAs<ExtensionMessageBubbleController>(), anchor_view); | |
386 return true; | |
387 } | |
388 | |
365 bool ExtensionMessageBubbleFactory::MaybeShowDevModeExtensionsBubble( | 389 bool ExtensionMessageBubbleFactory::MaybeShowDevModeExtensionsBubble( |
366 views::View* anchor_view) { | 390 views::View* anchor_view) { |
367 DCHECK(!shown_dev_mode_extensions_bubble_); | 391 DCHECK(!shown_dev_mode_extensions_bubble_); |
368 | 392 |
369 // Check the Developer Mode extensions. | 393 // Check the Developer Mode extensions. |
370 scoped_ptr<DevModeBubbleController> dev_mode_extensions( | 394 scoped_ptr<DevModeBubbleController> dev_mode_extensions( |
371 new DevModeBubbleController(profile_)); | 395 new DevModeBubbleController(profile_)); |
372 | 396 |
373 // Return early if we have none to show. | 397 // Return early if we have none to show. |
374 if (!dev_mode_extensions->ShouldShow()) | 398 if (!dev_mode_extensions->ShouldShow()) |
375 return false; | 399 return false; |
376 | 400 |
377 shown_dev_mode_extensions_bubble_ = true; | 401 shown_dev_mode_extensions_bubble_ = true; |
378 | 402 PrepareToHighlightExtensions( |
379 // We should be in the start stage (i.e., should not have a pending attempt to | 403 dev_mode_extensions.PassAs<ExtensionMessageBubbleController>(), |
380 // show a bubble). | 404 anchor_view); |
381 DCHECK_EQ(stage_, STAGE_START); | |
382 | |
383 // Prepare to display and highlight the developer mode extensions before | |
384 // showing the bubble. Since this is an asynchronous process, set member | |
385 // variables for later use. | |
386 controller_ = dev_mode_extensions.Pass(); | |
387 anchor_view_ = anchor_view; | |
388 container_ = toolbar_view_->browser_actions(); | |
389 | |
390 if (container_->animating()) | |
391 MaybeObserve(); | |
392 else | |
393 HighlightDevModeExtensions(); | |
394 | |
395 return true; | 405 return true; |
396 } | 406 } |
397 | 407 |
398 void ExtensionMessageBubbleFactory::MaybeObserve() { | 408 void ExtensionMessageBubbleFactory::MaybeObserve() { |
399 if (!is_observing_) { | 409 if (!is_observing_) { |
400 is_observing_ = true; | 410 is_observing_ = true; |
401 container_->AddObserver(this); | 411 container_->AddObserver(this); |
402 } | 412 } |
403 } | 413 } |
404 | 414 |
405 void ExtensionMessageBubbleFactory::MaybeStopObserving() { | 415 void ExtensionMessageBubbleFactory::MaybeStopObserving() { |
406 if (is_observing_) { | 416 if (is_observing_) { |
407 is_observing_ = false; | 417 is_observing_ = false; |
408 container_->RemoveObserver(this); | 418 container_->RemoveObserver(this); |
409 } | 419 } |
410 } | 420 } |
411 | 421 |
412 void ExtensionMessageBubbleFactory::RecordProfileCheck(Profile* profile) { | 422 void ExtensionMessageBubbleFactory::RecordProfileCheck(Profile* profile) { |
413 g_profiles_evaluated.Get().insert(profile); | 423 g_profiles_evaluated.Get().insert(profile); |
414 } | 424 } |
415 | 425 |
416 bool ExtensionMessageBubbleFactory::IsInitialProfileCheck(Profile* profile) { | 426 bool ExtensionMessageBubbleFactory::IsInitialProfileCheck(Profile* profile) { |
417 return g_profiles_evaluated.Get().count(profile) == 0; | 427 return g_profiles_evaluated.Get().count(profile) == 0; |
418 } | 428 } |
419 | 429 |
420 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerAnimationEnded() { | 430 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerAnimationEnded() { |
421 MaybeStopObserving(); | 431 MaybeStopObserving(); |
422 if (stage_ == STAGE_START) { | 432 if (stage_ == STAGE_START) { |
423 HighlightDevModeExtensions(); | 433 HighlightExtensions(); |
424 } else if (stage_ == STAGE_HIGHLIGHTED) { | 434 } else if (stage_ == STAGE_HIGHLIGHTED) { |
425 ShowDevModeBubble(); | 435 ShowHighlightingBubble(); |
426 } else { // We shouldn't be observing if we've completed the process. | 436 } else { // We shouldn't be observing if we've completed the process. |
427 NOTREACHED(); | 437 NOTREACHED(); |
428 Finish(); | 438 Finish(); |
429 } | 439 } |
430 } | 440 } |
431 | 441 |
432 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerDestroyed() { | 442 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerDestroyed() { |
433 // If the container associated with the bubble is destroyed, abandon the | 443 // If the container associated with the bubble is destroyed, abandon the |
434 // process. | 444 // process. |
435 Finish(); | 445 Finish(); |
436 } | 446 } |
437 | 447 |
438 void ExtensionMessageBubbleFactory::HighlightDevModeExtensions() { | 448 void ExtensionMessageBubbleFactory::PrepareToHighlightExtensions( |
449 scoped_ptr<ExtensionMessageBubbleController> controller, | |
450 views::View* anchor_view) { | |
451 // We should be in the start stage (i.e., should not have a pending attempt to | |
452 // show a bubble). | |
453 DCHECK_EQ(stage_, STAGE_START); | |
454 | |
455 // Prepare to display and highlight the extensions before showing the bubble. | |
456 // Since this is an asynchronous process, set member variables for later use. | |
457 controller_ = controller.Pass(); | |
458 anchor_view_ = anchor_view; | |
459 container_ = toolbar_view_->browser_actions(); | |
460 | |
461 if (container_->animating()) | |
462 MaybeObserve(); | |
463 else | |
464 HighlightExtensions(); | |
465 } | |
466 | |
467 void ExtensionMessageBubbleFactory::HighlightExtensions() { | |
439 DCHECK_EQ(STAGE_START, stage_); | 468 DCHECK_EQ(STAGE_START, stage_); |
440 stage_ = STAGE_HIGHLIGHTED; | 469 stage_ = STAGE_HIGHLIGHTED; |
441 | 470 |
442 const ExtensionIdList extension_list = controller_->GetExtensionIdList(); | 471 const ExtensionIdList extension_list = controller_->GetExtensionIdList(); |
443 DCHECK(!extension_list.empty()); | 472 DCHECK(!extension_list.empty()); |
444 ExtensionToolbarModel::Get(profile_)->HighlightExtensions(extension_list); | 473 ExtensionToolbarModel::Get(profile_)->HighlightExtensions(extension_list); |
445 if (container_->animating()) | 474 if (container_->animating()) |
446 MaybeObserve(); | 475 MaybeObserve(); |
447 else | 476 else |
448 ShowDevModeBubble(); | 477 ShowHighlightingBubble(); |
449 } | 478 } |
450 | 479 |
451 void ExtensionMessageBubbleFactory::ShowDevModeBubble() { | 480 void ExtensionMessageBubbleFactory::ShowHighlightingBubble() { |
452 DCHECK_EQ(stage_, STAGE_HIGHLIGHTED); | 481 DCHECK_EQ(stage_, STAGE_HIGHLIGHTED); |
453 stage_ = STAGE_COMPLETE; | 482 stage_ = STAGE_COMPLETE; |
454 | 483 |
455 views::View* reference_view = NULL; | 484 views::View* reference_view = NULL; |
456 if (container_->num_browser_actions() > 0) | 485 if (container_->num_browser_actions() > 0) |
457 reference_view = container_->GetBrowserActionViewAt(0); | 486 reference_view = container_->GetBrowserActionViewAt(0); |
458 if (reference_view && reference_view->visible()) | 487 if (reference_view && reference_view->visible()) |
459 anchor_view_ = reference_view; | 488 anchor_view_ = reference_view; |
460 | 489 |
461 DevModeBubbleController* weak_controller = controller_.get(); | 490 ExtensionMessageBubbleController* weak_controller = controller_.get(); |
462 ExtensionMessageBubbleView* bubble_delegate = new ExtensionMessageBubbleView( | 491 ExtensionMessageBubbleView* bubble_delegate = |
463 anchor_view_, | 492 new ExtensionMessageBubbleView( |
464 views::BubbleBorder::TOP_RIGHT, | 493 anchor_view_, |
465 scoped_ptr<ExtensionMessageBubbleController>(controller_.release())); | 494 views::BubbleBorder::TOP_RIGHT, |
495 scoped_ptr<ExtensionMessageBubbleController>( | |
496 controller_.release())); | |
466 views::BubbleDelegateView::CreateBubble(bubble_delegate); | 497 views::BubbleDelegateView::CreateBubble(bubble_delegate); |
467 weak_controller->Show(bubble_delegate); | 498 weak_controller->Show(bubble_delegate); |
468 | 499 |
469 Finish(); | 500 Finish(); |
470 } | 501 } |
471 | 502 |
472 void ExtensionMessageBubbleFactory::Finish() { | 503 void ExtensionMessageBubbleFactory::Finish() { |
473 MaybeStopObserving(); | 504 MaybeStopObserving(); |
474 controller_.reset(); | 505 controller_.reset(); |
475 anchor_view_ = NULL; | 506 anchor_view_ = NULL; |
476 container_ = NULL; | 507 container_ = NULL; |
477 } | 508 } |
478 | 509 |
479 } // namespace extensions | 510 } // namespace extensions |
OLD | NEW |