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 12 matching lines...) Expand all Loading... |
329 views::BubbleDelegateView::CreateBubble(bubble_delegate); | 335 views::BubbleDelegateView::CreateBubble(bubble_delegate); |
330 weak_controller->Show(bubble_delegate); | 336 weak_controller->Show(bubble_delegate); |
331 | 337 |
332 return true; | 338 return true; |
333 } | 339 } |
334 | 340 |
335 bool ExtensionMessageBubbleFactory::MaybeShowStartupOverrideExtensionsBubble( | 341 bool ExtensionMessageBubbleFactory::MaybeShowStartupOverrideExtensionsBubble( |
336 views::View* anchor_view) { | 342 views::View* anchor_view) { |
337 #if !defined(OS_WIN) | 343 #if !defined(OS_WIN) |
338 return false; | 344 return false; |
339 #endif | 345 #else |
340 | |
341 DCHECK(!shown_startup_override_extensions_bubble_); | 346 DCHECK(!shown_startup_override_extensions_bubble_); |
342 | 347 |
343 const Extension* extension = OverridesStartupPages(profile_, NULL); | 348 const Extension* extension = |
| 349 GetExtensionOverridingStartupPages(profile_, NULL); |
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, | 363 return true; |
358 settings_api_bubble.PassAs<ExtensionMessageBubbleController>()); | 364 #endif |
359 views::BubbleDelegateView::CreateBubble(bubble_delegate); | 365 } |
360 weak_controller->Show(bubble_delegate); | |
361 | 366 |
| 367 bool ExtensionMessageBubbleFactory::MaybeShowProxyOverrideExtensionsBubble( |
| 368 views::View* anchor_view) { |
| 369 #if !defined(OS_WIN) |
| 370 return false; |
| 371 #else |
| 372 DCHECK(!shown_proxy_override_extensions_bubble_); |
| 373 |
| 374 const Extension* extension = GetExtensionOverridingProxy(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); |
362 return true; | 386 return true; |
| 387 #endif |
363 } | 388 } |
364 | 389 |
365 bool ExtensionMessageBubbleFactory::MaybeShowDevModeExtensionsBubble( | 390 bool ExtensionMessageBubbleFactory::MaybeShowDevModeExtensionsBubble( |
366 views::View* anchor_view) { | 391 views::View* anchor_view) { |
367 DCHECK(!shown_dev_mode_extensions_bubble_); | 392 DCHECK(!shown_dev_mode_extensions_bubble_); |
368 | 393 |
369 // Check the Developer Mode extensions. | 394 // Check the Developer Mode extensions. |
370 scoped_ptr<DevModeBubbleController> dev_mode_extensions( | 395 scoped_ptr<DevModeBubbleController> dev_mode_extensions( |
371 new DevModeBubbleController(profile_)); | 396 new DevModeBubbleController(profile_)); |
372 | 397 |
373 // Return early if we have none to show. | 398 // Return early if we have none to show. |
374 if (!dev_mode_extensions->ShouldShow()) | 399 if (!dev_mode_extensions->ShouldShow()) |
375 return false; | 400 return false; |
376 | 401 |
377 shown_dev_mode_extensions_bubble_ = true; | 402 shown_dev_mode_extensions_bubble_ = true; |
378 | 403 PrepareToHighlightExtensions( |
379 // We should be in the start stage (i.e., should not have a pending attempt to | 404 dev_mode_extensions.PassAs<ExtensionMessageBubbleController>(), |
380 // show a bubble). | 405 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; | 406 return true; |
396 } | 407 } |
397 | 408 |
398 void ExtensionMessageBubbleFactory::MaybeObserve() { | 409 void ExtensionMessageBubbleFactory::MaybeObserve() { |
399 if (!is_observing_) { | 410 if (!is_observing_) { |
400 is_observing_ = true; | 411 is_observing_ = true; |
401 container_->AddObserver(this); | 412 container_->AddObserver(this); |
402 } | 413 } |
403 } | 414 } |
404 | 415 |
405 void ExtensionMessageBubbleFactory::MaybeStopObserving() { | 416 void ExtensionMessageBubbleFactory::MaybeStopObserving() { |
406 if (is_observing_) { | 417 if (is_observing_) { |
407 is_observing_ = false; | 418 is_observing_ = false; |
408 container_->RemoveObserver(this); | 419 container_->RemoveObserver(this); |
409 } | 420 } |
410 } | 421 } |
411 | 422 |
412 void ExtensionMessageBubbleFactory::RecordProfileCheck(Profile* profile) { | 423 void ExtensionMessageBubbleFactory::RecordProfileCheck(Profile* profile) { |
413 g_profiles_evaluated.Get().insert(profile); | 424 g_profiles_evaluated.Get().insert(profile); |
414 } | 425 } |
415 | 426 |
416 bool ExtensionMessageBubbleFactory::IsInitialProfileCheck(Profile* profile) { | 427 bool ExtensionMessageBubbleFactory::IsInitialProfileCheck(Profile* profile) { |
417 return g_profiles_evaluated.Get().count(profile) == 0; | 428 return g_profiles_evaluated.Get().count(profile) == 0; |
418 } | 429 } |
419 | 430 |
420 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerAnimationEnded() { | 431 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerAnimationEnded() { |
421 MaybeStopObserving(); | 432 MaybeStopObserving(); |
422 if (stage_ == STAGE_START) { | 433 if (stage_ == STAGE_START) { |
423 HighlightDevModeExtensions(); | 434 HighlightExtensions(); |
424 } else if (stage_ == STAGE_HIGHLIGHTED) { | 435 } else if (stage_ == STAGE_HIGHLIGHTED) { |
425 ShowDevModeBubble(); | 436 ShowHighlightingBubble(); |
426 } else { // We shouldn't be observing if we've completed the process. | 437 } else { // We shouldn't be observing if we've completed the process. |
427 NOTREACHED(); | 438 NOTREACHED(); |
428 Finish(); | 439 Finish(); |
429 } | 440 } |
430 } | 441 } |
431 | 442 |
432 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerDestroyed() { | 443 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerDestroyed() { |
433 // If the container associated with the bubble is destroyed, abandon the | 444 // If the container associated with the bubble is destroyed, abandon the |
434 // process. | 445 // process. |
435 Finish(); | 446 Finish(); |
436 } | 447 } |
437 | 448 |
438 void ExtensionMessageBubbleFactory::HighlightDevModeExtensions() { | 449 void ExtensionMessageBubbleFactory::PrepareToHighlightExtensions( |
| 450 scoped_ptr<ExtensionMessageBubbleController> controller, |
| 451 views::View* anchor_view) { |
| 452 // We should be in the start stage (i.e., should not have a pending attempt to |
| 453 // show a bubble). |
| 454 DCHECK_EQ(stage_, STAGE_START); |
| 455 |
| 456 // Prepare to display and highlight the extensions before showing the bubble. |
| 457 // Since this is an asynchronous process, set member variables for later use. |
| 458 controller_ = controller.Pass(); |
| 459 anchor_view_ = anchor_view; |
| 460 container_ = toolbar_view_->browser_actions(); |
| 461 |
| 462 if (container_->animating()) |
| 463 MaybeObserve(); |
| 464 else |
| 465 HighlightExtensions(); |
| 466 } |
| 467 |
| 468 void ExtensionMessageBubbleFactory::HighlightExtensions() { |
439 DCHECK_EQ(STAGE_START, stage_); | 469 DCHECK_EQ(STAGE_START, stage_); |
440 stage_ = STAGE_HIGHLIGHTED; | 470 stage_ = STAGE_HIGHLIGHTED; |
441 | 471 |
442 const ExtensionIdList extension_list = controller_->GetExtensionIdList(); | 472 const ExtensionIdList extension_list = controller_->GetExtensionIdList(); |
443 DCHECK(!extension_list.empty()); | 473 DCHECK(!extension_list.empty()); |
444 ExtensionToolbarModel::Get(profile_)->HighlightExtensions(extension_list); | 474 ExtensionToolbarModel::Get(profile_)->HighlightExtensions(extension_list); |
445 if (container_->animating()) | 475 if (container_->animating()) |
446 MaybeObserve(); | 476 MaybeObserve(); |
447 else | 477 else |
448 ShowDevModeBubble(); | 478 ShowHighlightingBubble(); |
449 } | 479 } |
450 | 480 |
451 void ExtensionMessageBubbleFactory::ShowDevModeBubble() { | 481 void ExtensionMessageBubbleFactory::ShowHighlightingBubble() { |
452 DCHECK_EQ(stage_, STAGE_HIGHLIGHTED); | 482 DCHECK_EQ(stage_, STAGE_HIGHLIGHTED); |
453 stage_ = STAGE_COMPLETE; | 483 stage_ = STAGE_COMPLETE; |
454 | 484 |
455 views::View* reference_view = NULL; | 485 views::View* reference_view = NULL; |
456 if (container_->num_browser_actions() > 0) | 486 if (container_->num_browser_actions() > 0) |
457 reference_view = container_->GetBrowserActionViewAt(0); | 487 reference_view = container_->GetBrowserActionViewAt(0); |
458 if (reference_view && reference_view->visible()) | 488 if (reference_view && reference_view->visible()) |
459 anchor_view_ = reference_view; | 489 anchor_view_ = reference_view; |
460 | 490 |
461 DevModeBubbleController* weak_controller = controller_.get(); | 491 ExtensionMessageBubbleController* weak_controller = controller_.get(); |
462 ExtensionMessageBubbleView* bubble_delegate = new ExtensionMessageBubbleView( | 492 ExtensionMessageBubbleView* bubble_delegate = |
463 anchor_view_, | 493 new ExtensionMessageBubbleView( |
464 views::BubbleBorder::TOP_RIGHT, | 494 anchor_view_, |
465 scoped_ptr<ExtensionMessageBubbleController>(controller_.release())); | 495 views::BubbleBorder::TOP_RIGHT, |
| 496 scoped_ptr<ExtensionMessageBubbleController>( |
| 497 controller_.release())); |
466 views::BubbleDelegateView::CreateBubble(bubble_delegate); | 498 views::BubbleDelegateView::CreateBubble(bubble_delegate); |
467 weak_controller->Show(bubble_delegate); | 499 weak_controller->Show(bubble_delegate); |
468 | 500 |
469 Finish(); | 501 Finish(); |
470 } | 502 } |
471 | 503 |
472 void ExtensionMessageBubbleFactory::Finish() { | 504 void ExtensionMessageBubbleFactory::Finish() { |
473 MaybeStopObserving(); | 505 MaybeStopObserving(); |
474 controller_.reset(); | 506 controller_.reset(); |
475 anchor_view_ = NULL; | 507 anchor_view_ = NULL; |
476 container_ = NULL; | 508 container_ = NULL; |
477 } | 509 } |
478 | 510 |
479 } // namespace extensions | 511 } // namespace extensions |
OLD | NEW |