File: chrome_supervised_user_web_content_handler_base.cc

package info (click to toggle)
chromium 138.0.7204.157-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,864 kB
  • sloc: cpp: 34,936,859; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,967; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (106 lines) | stat: -rw-r--r-- 4,033 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/supervised_user/chrome_supervised_user_web_content_handler_base.h"

#include "chrome/browser/supervised_user/supervised_user_interstitial_tab_closer.h"
#include "chrome/browser/supervised_user/supervised_user_navigation_observer.h"
#include "components/infobars/content/content_infobar_manager.h"
#include "components/infobars/core/infobar.h"
#include "content/public/browser/navigation_details.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents.h"

ChromeSupervisedUserWebContentHandlerBase::
    ChromeSupervisedUserWebContentHandlerBase(
        content::WebContents* web_contents,
        content::FrameTreeNodeId frame_id,
        int64_t interstitial_navigation_id)
    : web_contents_(web_contents),
      frame_id_(frame_id),
      interstitial_navigation_id_(interstitial_navigation_id) {
  CHECK(web_contents_);
}

ChromeSupervisedUserWebContentHandlerBase::
    ~ChromeSupervisedUserWebContentHandlerBase() = default;

bool ChromeSupervisedUserWebContentHandlerBase::IsMainFrame() const {
  return web_contents_->GetPrimaryMainFrame()->GetFrameTreeNodeId() ==
         frame_id_;
}

void ChromeSupervisedUserWebContentHandlerBase::CleanUpInfoBarOnMainFrame() {
  if (!IsMainFrame()) {
    return;
  }
  infobars::ContentInfoBarManager* manager =
      infobars::ContentInfoBarManager::FromWebContents(web_contents_);
  if (!manager) {
    return;
  }
  content::LoadCommittedDetails details;
  // |details.is_same_document| is default false, and |details.is_main_frame|
  // is default true. This results in is_navigation_to_different_page()
  // returning true.
  CHECK(details.is_navigation_to_different_page());
  content::NavigationController& controller = web_contents_->GetController();
  details.entry = controller.GetVisibleEntry();
  if (controller.GetLastCommittedEntry()) {
    details.previous_entry_index = controller.GetLastCommittedEntryIndex();
    details.previous_main_frame_url =
        controller.GetLastCommittedEntry()->GetURL();
  }
  // Copy the infobars to allow safe iteration while removing elements.
  const auto infobars = manager->infobars();
  for (infobars::InfoBar* infobar : infobars) {
    if (infobar->delegate()->ShouldExpire(
            infobars::ContentInfoBarManager::
                NavigationDetailsFromLoadCommittedDetails(details))) {
      manager->RemoveInfoBar(infobar);
    }
  }
}

int64_t ChromeSupervisedUserWebContentHandlerBase::GetInterstitialNavigationId()
    const {
  return interstitial_navigation_id_;
}

void ChromeSupervisedUserWebContentHandlerBase::GoBack() {
  // GoBack only for main frame.
  CHECK(IsMainFrame());
  if (!AttemptMoveAwayFromCurrentFrameURL()) {
    TabCloser::CheckIfInBrowserThenCloseTab(web_contents_);
  }
  OnInterstitialDone();
}

void ChromeSupervisedUserWebContentHandlerBase::MaybeCloseLocalApproval() {}

bool ChromeSupervisedUserWebContentHandlerBase::
    AttemptMoveAwayFromCurrentFrameURL() {
  // No need to do anything if the WebContents is in the process of being
  // destroyed anyway.
  if (web_contents_->IsBeingDestroyed()) {
    return true;
  }
  // If the interstitial was shown over an existing page, navigate back from
  // that page. If that is not possible, attempt to close the entire tab.
  if (web_contents_->GetController().CanGoBack()) {
    web_contents_->GetController().GoBack();
    return true;
  }
  return false;
}

void ChromeSupervisedUserWebContentHandlerBase::OnInterstitialDone() {
  auto* navigation_observer =
      SupervisedUserNavigationObserver::FromWebContents(web_contents_);
  // After this, the WebContents may be destroyed. Make sure we don't try to use
  // it again. `OnInterstitialDone` will destruct the web content handler,
  // and consequently the web_contents_ pointer.
  web_contents_ = nullptr;
  navigation_observer->OnInterstitialDone(frame_id_);
}