accuracy_web_contents_observer.cc 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/accuracy_tips/accuracy_web_contents_observer.h"
  5. #include "base/feature_list.h"
  6. #include "base/metrics/histogram_macros.h"
  7. #include "components/accuracy_tips/accuracy_service.h"
  8. #include "components/accuracy_tips/accuracy_tip_status.h"
  9. #include "components/safe_browsing/core/common/features.h"
  10. #include "content/public/browser/browser_context.h"
  11. #include "content/public/browser/navigation_handle.h"
  12. #include "content/public/common/page_visibility_state.h"
  13. #include "services/metrics/public/cpp/ukm_builders.h"
  14. #include "url/gurl.h"
  15. namespace accuracy_tips {
  16. // static
  17. bool AccuracyWebContentsObserver::IsEnabled(
  18. content::WebContents* web_contents) {
  19. return base::FeatureList::IsEnabled(safe_browsing::kAccuracyTipsFeature) &&
  20. !web_contents->GetBrowserContext()->IsOffTheRecord();
  21. }
  22. AccuracyWebContentsObserver::~AccuracyWebContentsObserver() = default;
  23. AccuracyWebContentsObserver::AccuracyWebContentsObserver(
  24. content::WebContents* web_contents,
  25. AccuracyService* accuracy_service)
  26. : WebContentsObserver(web_contents),
  27. content::WebContentsUserData<AccuracyWebContentsObserver>(*web_contents),
  28. accuracy_service_(accuracy_service) {
  29. DCHECK(!web_contents->GetBrowserContext()->IsOffTheRecord());
  30. DCHECK(accuracy_service);
  31. }
  32. void AccuracyWebContentsObserver::DidFinishNavigation(
  33. content::NavigationHandle* navigation) {
  34. if (!navigation->IsInPrimaryMainFrame() || navigation->IsSameDocument() ||
  35. !navigation->HasCommitted() || navigation->IsErrorPage()) {
  36. return;
  37. }
  38. if (web_contents()->GetPrimaryMainFrame()->GetVisibilityState() !=
  39. content::PageVisibilityState::kVisible) {
  40. return;
  41. }
  42. const GURL& url = web_contents()->GetLastCommittedURL();
  43. if (!url.SchemeIsHTTPOrHTTPS()) {
  44. return;
  45. }
  46. accuracy_service_->CheckAccuracyStatus(
  47. url,
  48. base::BindOnce(&AccuracyWebContentsObserver::OnAccuracyStatusObtained,
  49. weak_factory_.GetWeakPtr(), url));
  50. }
  51. void AccuracyWebContentsObserver::OnAccuracyStatusObtained(
  52. const GURL& url,
  53. AccuracyTipStatus result) {
  54. // We are not on this site any more, so the result is invalid.
  55. if (url != web_contents()->GetLastCommittedURL())
  56. return;
  57. // Don't show tip on insecure pages. This can't be checked in the
  58. // AccuracyService because it requires a WebContents.
  59. if (result == AccuracyTipStatus::kShowAccuracyTip &&
  60. !accuracy_service_->IsSecureConnection(web_contents())) {
  61. result = AccuracyTipStatus::kNotSecure;
  62. }
  63. UMA_HISTOGRAM_ENUMERATION("Privacy.AccuracyTip.PageStatus", result);
  64. ukm::builders::AccuracyTipStatus(
  65. web_contents()->GetPrimaryMainFrame()->GetPageUkmSourceId())
  66. .SetStatus(static_cast<int>(result))
  67. .Record(ukm::UkmRecorder::Get());
  68. if (result != AccuracyTipStatus::kShowAccuracyTip)
  69. return;
  70. accuracy_service_->MaybeShowAccuracyTip(web_contents());
  71. }
  72. WEB_CONTENTS_USER_DATA_KEY_IMPL(AccuracyWebContentsObserver);
  73. } // namespace accuracy_tips