File: kiosk_browser_window_handler.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (131 lines) | stat: -rw-r--r-- 4,959 bytes parent folder | download | duplicates (5)
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_BROWSER_WINDOW_HANDLER_H_
#define CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_BROWSER_WINDOW_HANDLER_H_

#include <map>
#include <memory>

#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/timer/timer.h"
#include "chrome/browser/chromeos/app_mode/kiosk_policies.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list_observer.h"

namespace chromeos {

class KioskTroubleshootingController;
class NavigationWaiter;

extern const char kKioskNewBrowserWindowHistogram[];

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
// Keep in sync with respective enum in tools/metrics/histograms/enums.xml
enum class KioskBrowserWindowType {
  kSettingsPage = 0,
  kClosedRegularBrowser = 1,
  kOpenedRegularBrowser = 2,
  kOpenedDevToolsBrowser = 3,
  kOpenedTroubleshootingNormalBrowser = 4,
  kOpenedSystemWebApp = 5,
  // Removed: kClosedAshBrowserWithLacrosEnabled = 6,
  kMaxValue = kOpenedSystemWebApp
};

// This class monitors for the addition and removal of new browser windows
// during the kiosk session. On construction for web kiosk sessions, it gets a
// web app name stored as `web_app_name_`.
//
//
// If a new browser window is opened, this gets closed immediately, unless it's
// an allowed Settings window or `CanOpenNewBrowserWindow` method returns true.
//
// If the last browser window gets closed, the session gets ended.
//
// It also manages showing required settings pages in a consistent browser.
class KioskBrowserWindowHandler : public BrowserListObserver {
 public:
  KioskBrowserWindowHandler(
      Profile* profile,
      const std::optional<std::string>& web_app_name,
      base::RepeatingCallback<void(bool is_closing)>
          on_browser_window_added_callback,
      base::OnceClosure shutdown_kiosk_browser_session_callback);
  KioskBrowserWindowHandler(const KioskBrowserWindowHandler&) = delete;
  KioskBrowserWindowHandler& operator=(const KioskBrowserWindowHandler&) =
      delete;
  ~KioskBrowserWindowHandler() override;

  Browser* GetSettingsBrowserForTesting() { return settings_browser_; }

 private:
  void OnCompleteBrowserAdded(Browser* browser);
  bool TriageNewBrowserWindow(Browser* browser);
  void HandleNewSettingsWindow(Browser* browser, const std::string& url_string);

  void CloseBrowserWindowsIf(base::FunctionRef<bool(const Browser&)> filter);
  void CloseBrowserAndSetTimer(Browser* browser);
  void OnCloseBrowserTimeout();
  void CloseAllUnexpectedBrowserWindows();

  // BrowserListObserver
  void OnBrowserAdded(Browser* browser) override;
  void OnBrowserRemoved(Browser* browser) override;

  // Returns true if open by web application and allowed by policy.
  bool IsNewBrowserWindowAllowed(Browser* browser) const;

  // Returns true if open devtools browser and it is allowed by policy.
  bool IsDevToolsAllowedBrowser(Browser* browser) const;

  // Returns true if open normal browser and it is allowed by troubleshooting
  // policy.
  bool IsNormalTroubleshootingBrowserAllowed(Browser* browser) const;

  // Returns true in case of the initial browser window existed for web kiosks.
  bool ShouldExitKioskWhenLastBrowserRemoved() const;

  // Checks that there is no app browser and only `settings_browser_` remains
  // open.
  bool IsOnlySettingsBrowserRemainOpen() const;

  // Calls `shutdown_kiosk_browser_session_callback_` once.
  void Shutdown();

  // Owned by `ProfileManager`.
  const raw_ptr<Profile, DanglingUntriaged> profile_;
  // `web_app_name_` is set only for web kiosk sessions.
  const std::optional<std::string> web_app_name_;
  base::RepeatingCallback<void(bool is_closing)>
      on_browser_window_added_callback_;
  base::OnceClosure shutdown_kiosk_browser_session_callback_;

  std::unique_ptr<KioskTroubleshootingController>
      kiosk_troubleshooting_controller_;

  // Browser in which settings are shown, restricted by
  // KioskSettingsNavigationThrottle.
  raw_ptr<Browser> settings_browser_ = nullptr;

  // Provides access to app session related policies.
  KioskPolicies kiosk_policies_;

  // Map that keeps track of all unexpected browser windows until they are
  // confirmed to be closed via `OnBrowserRemoved`. If they did not get closed
  // before the timer fires, we will crash as we consider the kiosk session
  // compromised.
  std::map<Browser*, base::OneShotTimer> closing_browsers_;

  std::map<Browser*, std::unique_ptr<NavigationWaiter>> url_waiters_;

  base::WeakPtrFactory<KioskBrowserWindowHandler> weak_ptr_factory_{this};
};

}  // namespace chromeos
#endif  // CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_BROWSER_WINDOW_HANDLER_H_