OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/banners/app_banner_manager.h" | 5 #include "chrome/browser/banners/app_banner_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 load_finished_ = true; | 398 load_finished_ = true; |
399 validated_url_ = validated_url; | 399 validated_url_ = validated_url; |
400 | 400 |
401 // If the bypass flag is on, or if we require no engagement to trigger the | 401 // If the bypass flag is on, or if we require no engagement to trigger the |
402 // banner, the rest of the banner pipeline should operate as if the engagement | 402 // banner, the rest of the banner pipeline should operate as if the engagement |
403 // threshold has been met. | 403 // threshold has been met. |
404 if (AppBannerSettingsHelper::HasSufficientEngagement(0)) | 404 if (AppBannerSettingsHelper::HasSufficientEngagement(0)) |
405 has_sufficient_engagement_ = true; | 405 has_sufficient_engagement_ = true; |
406 | 406 |
407 // Start the pipeline immediately if we pass (or bypass) the engagement check, | 407 // Start the pipeline immediately if we pass (or bypass) the engagement check, |
408 // or if the feature to run the installability check on page load is enabled. | 408 // or if the feature to run the installability check on page load is enabled, |
| 409 // or if the experimental banner flow is enabled. |
409 if (has_sufficient_engagement_ || | 410 if (has_sufficient_engagement_ || |
410 base::FeatureList::IsEnabled( | 411 base::FeatureList::IsEnabled( |
411 features::kCheckInstallabilityForBannerOnLoad)) { | 412 features::kCheckInstallabilityForBannerOnLoad) || |
| 413 IsExperimentalAppBannersEnabled()) { |
412 RequestAppBanner(validated_url, false /* is_debug_mode */); | 414 RequestAppBanner(validated_url, false /* is_debug_mode */); |
413 } | 415 } |
414 } | 416 } |
415 | 417 |
416 void AppBannerManager::MediaStartedPlaying(const MediaPlayerInfo& media_info, | 418 void AppBannerManager::MediaStartedPlaying(const MediaPlayerInfo& media_info, |
417 const MediaPlayerId& id) { | 419 const MediaPlayerId& id) { |
418 active_media_players_.push_back(id); | 420 active_media_players_.push_back(id); |
419 } | 421 } |
420 | 422 |
421 void AppBannerManager::MediaStoppedPlaying(const MediaPlayerInfo& media_info, | 423 void AppBannerManager::MediaStoppedPlaying(const MediaPlayerInfo& media_info, |
(...skipping 30 matching lines...) Expand all Loading... |
452 UpdateState(State::ACTIVE); | 454 UpdateState(State::ACTIVE); |
453 SendBannerPromptRequest(); | 455 SendBannerPromptRequest(); |
454 } else if (load_finished_) { | 456 } else if (load_finished_) { |
455 // This performs some simple tests and starts async checks to test | 457 // This performs some simple tests and starts async checks to test |
456 // installability. It should be safe to start in response to user input. | 458 // installability. It should be safe to start in response to user input. |
457 RequestAppBanner(url, false /* is_debug_mode */); | 459 RequestAppBanner(url, false /* is_debug_mode */); |
458 } | 460 } |
459 } | 461 } |
460 } | 462 } |
461 | 463 |
| 464 // static |
| 465 bool AppBannerManager::IsExperimentalAppBannersEnabled() { |
| 466 return base::FeatureList::IsEnabled(features::kExperimentalAppBanners); |
| 467 } |
| 468 |
462 void AppBannerManager::RecordCouldShowBanner() { | 469 void AppBannerManager::RecordCouldShowBanner() { |
463 content::WebContents* contents = web_contents(); | 470 content::WebContents* contents = web_contents(); |
464 DCHECK(contents); | 471 DCHECK(contents); |
465 | 472 |
466 AppBannerSettingsHelper::RecordBannerEvent( | 473 AppBannerSettingsHelper::RecordBannerEvent( |
467 contents, validated_url_, GetAppIdentifier(), | 474 contents, validated_url_, GetAppIdentifier(), |
468 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW, GetCurrentTime()); | 475 AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW, GetCurrentTime()); |
469 } | 476 } |
470 | 477 |
471 bool AppBannerManager::CheckIfShouldShowBanner() { | 478 bool AppBannerManager::CheckIfShouldShowBanner() { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 } | 514 } |
508 return true; | 515 return true; |
509 } | 516 } |
510 | 517 |
511 void AppBannerManager::OnBannerPromptReply( | 518 void AppBannerManager::OnBannerPromptReply( |
512 blink::mojom::AppBannerPromptReply reply, | 519 blink::mojom::AppBannerPromptReply reply, |
513 const std::string& referrer) { | 520 const std::string& referrer) { |
514 // We don't need the controller any more, so reset it so the Blink-side object | 521 // We don't need the controller any more, so reset it so the Blink-side object |
515 // is destroyed. | 522 // is destroyed. |
516 controller_.reset(); | 523 controller_.reset(); |
517 content::WebContents* contents = web_contents(); | |
518 | 524 |
519 // The renderer might have requested the prompt to be canceled. They may | 525 // The renderer might have requested the prompt to be canceled. They may |
520 // request that it is redisplayed later, so don't Stop() here. However, log | 526 // request that it is redisplayed later, so don't Stop() here. However, log |
521 // that the cancelation was requested, so Stop() can be called if a redisplay | 527 // that the cancelation was requested, so Stop() can be called if a redisplay |
522 // isn't asked for. | 528 // isn't asked for. |
523 // | 529 // |
524 // We use the additional page_requested_prompt_ variable because the redisplay | 530 // We use the additional page_requested_prompt_ variable because the redisplay |
525 // request may be received *before* the Cancel prompt reply (e.g. if redisplay | 531 // request may be received *before* the Cancel prompt reply (e.g. if redisplay |
526 // is requested in the beforeinstallprompt event handler). | 532 // is requested in the beforeinstallprompt event handler). |
527 referrer_ = referrer; | 533 referrer_ = referrer; |
528 if (reply == blink::mojom::AppBannerPromptReply::CANCEL) { | 534 if (IsExperimentalAppBannersEnabled() || |
| 535 reply == blink::mojom::AppBannerPromptReply::CANCEL) { |
529 UpdateState(State::PENDING_EVENT); | 536 UpdateState(State::PENDING_EVENT); |
530 TrackBeforeInstallEvent(BEFORE_INSTALL_EVENT_PREVENT_DEFAULT_CALLED); | 537 TrackBeforeInstallEvent(BEFORE_INSTALL_EVENT_PREVENT_DEFAULT_CALLED); |
531 if (!page_requested_prompt_) | 538 if (!page_requested_prompt_) |
532 return; | 539 return; |
533 } | 540 } |
534 | 541 |
| 542 if (!IsExperimentalAppBannersEnabled()) |
| 543 ShowBanner(); |
| 544 } |
| 545 |
| 546 void AppBannerManager::ShowBanner() { |
535 // If we haven't yet returned, but we're in the PENDING_EVENT state or | 547 // If we haven't yet returned, but we're in the PENDING_EVENT state or |
536 // |page_requested_prompt_| is true, the page has requested a delayed showing | 548 // |page_requested_prompt_| is true, the page has requested a delayed showing |
537 // of the prompt. Otherwise, the prompt was never canceled by the page. | 549 // of the prompt. Otherwise, the prompt was never canceled by the page. |
538 if (is_pending_event()) { | 550 if (is_pending_event()) { |
539 TrackBeforeInstallEvent( | 551 TrackBeforeInstallEvent( |
540 BEFORE_INSTALL_EVENT_PROMPT_CALLED_AFTER_PREVENT_DEFAULT); | 552 BEFORE_INSTALL_EVENT_PROMPT_CALLED_AFTER_PREVENT_DEFAULT); |
541 UpdateState(State::ACTIVE); | 553 UpdateState(State::ACTIVE); |
542 } else { | 554 } else { |
543 TrackBeforeInstallEvent(BEFORE_INSTALL_EVENT_NO_ACTION); | 555 TrackBeforeInstallEvent(BEFORE_INSTALL_EVENT_NO_ACTION); |
| 556 // In the experimental flow, the banner is only shown if the site explicitly |
| 557 // requests it to be shown. |
| 558 DCHECK(!IsExperimentalAppBannersEnabled()); |
544 } | 559 } |
545 | 560 |
| 561 content::WebContents* contents = web_contents(); |
546 AppBannerSettingsHelper::RecordMinutesFromFirstVisitToShow( | 562 AppBannerSettingsHelper::RecordMinutesFromFirstVisitToShow( |
547 contents, validated_url_, GetAppIdentifier(), GetCurrentTime()); | 563 contents, validated_url_, GetAppIdentifier(), GetCurrentTime()); |
548 | 564 |
549 DCHECK(!manifest_url_.is_empty()); | 565 DCHECK(!manifest_url_.is_empty()); |
550 DCHECK(!manifest_.IsEmpty()); | 566 DCHECK(!manifest_.IsEmpty()); |
551 DCHECK(!primary_icon_url_.is_empty()); | 567 DCHECK(!primary_icon_url_.is_empty()); |
552 DCHECK(!primary_icon_.drawsNothing()); | 568 DCHECK(!primary_icon_.drawsNothing()); |
553 | 569 |
554 TrackBeforeInstallEvent(BEFORE_INSTALL_EVENT_COMPLETE); | 570 TrackBeforeInstallEvent(BEFORE_INSTALL_EVENT_COMPLETE); |
555 ShowBanner(); | 571 ShowBannerUI(); |
556 UpdateState(State::COMPLETE); | 572 UpdateState(State::COMPLETE); |
557 } | 573 } |
558 | 574 |
559 void AppBannerManager::DisplayAppBanner(bool user_gesture) { | 575 void AppBannerManager::DisplayAppBanner(bool user_gesture) { |
| 576 // In the experimental flow, a user gesture is required for the prompt to be |
| 577 // shown. |
| 578 if (IsExperimentalAppBannersEnabled() && !user_gesture) { |
| 579 // TODO: do some logging / error here |
| 580 return; |
| 581 } |
| 582 |
560 if (is_pending_event()) { | 583 if (is_pending_event()) { |
561 // Simulate a non-canceled OnBannerPromptReply to show the delayed banner. | 584 // Simulate a non-canceled OnBannerPromptReply to show the delayed banner. |
562 OnBannerPromptReply(blink::mojom::AppBannerPromptReply::NONE, referrer_); | 585 ShowBanner(); |
563 } else { | 586 } else { |
564 // Log that the prompt request was made for when we get the prompt reply. | 587 // Log that the prompt request was made for when we get the prompt reply. |
565 page_requested_prompt_ = true; | 588 page_requested_prompt_ = true; |
566 } | 589 } |
567 } | 590 } |
568 | 591 |
569 } // namespace banners | 592 } // namespace banners |
OLD | NEW |