123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Shelley Vohr <[email protected]>
- Date: Mon, 25 Oct 2021 21:45:57 +0200
- Subject: fix: adapt exclusive_access for electron needs
- This patch is necessary in order to properly enable
- navigator.keyboard.{(un)?lock}() functionality. We don't have a concept
- of PermissionManager nor of a Profile, so this would not affect usage of
- the API.
- We also need to ensure that NotifyExclusiveTabAccessLost is called
- on all platforms in FullscreenController::ExitFullscreenModeInternal()
- and not just macOS, since Electron's native window impls report state
- change fairly instantly as well, and so pressing escape won't work on
- Linux or Windows to un-fullscreen in some circumstances without this
- change.
- diff --git a/chrome/browser/ui/exclusive_access/fullscreen_controller.cc b/chrome/browser/ui/exclusive_access/fullscreen_controller.cc
- index 530199f4d873efdf66c7084cd09651ef85e74ead..6dcefd75a2fc9164eae24de3efaded0fc665e024 100644
- --- a/chrome/browser/ui/exclusive_access/fullscreen_controller.cc
- +++ b/chrome/browser/ui/exclusive_access/fullscreen_controller.cc
- @@ -21,12 +21,16 @@
- #include "chrome/browser/history/history_service_factory.h"
- #include "chrome/browser/profiles/profile.h"
- #include "chrome/browser/safe_browsing/safe_browsing_service.h"
- +#if 0
- #include "chrome/browser/ui/blocked_content/popunder_preventer.h"
- +#endif
- #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h"
- #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
- #include "chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h"
- +#if 0
- #include "chrome/browser/ui/status_bubble.h"
- #include "chrome/browser/ui/tabs/tab_strip_model.h"
- +#endif
- #include "chrome/common/chrome_switches.h"
- #include "components/history/core/browser/history_service.h"
- #include "components/history/core/browser/history_types.h"
- @@ -256,10 +260,12 @@ void FullscreenController::EnterFullscreenModeForTab(
- return;
- }
-
- +#if 0
- if (!popunder_preventer_)
- popunder_preventer_ = std::make_unique<PopunderPreventer>(web_contents);
- else
- popunder_preventer_->WillActivateWebContents(web_contents);
- +#endif
-
- // Keep the current state. |SetTabWithExclusiveAccess| may change the return
- // value of |IsWindowFullscreenForTabOrPending|.
- @@ -371,12 +377,14 @@ void FullscreenController::ExitFullscreenModeForTab(WebContents* web_contents) {
- void FullscreenController::FullscreenTabOpeningPopup(
- content::WebContents* opener,
- content::WebContents* popup) {
- +#if 0
- if (!popunder_preventer_) {
- return;
- }
-
- DCHECK_EQ(exclusive_access_tab(), opener);
- popunder_preventer_->AddPotentialPopunder(popup);
- +#endif
- }
-
- void FullscreenController::OnTabDeactivated(
- @@ -462,10 +470,12 @@ void FullscreenController::FullscreenTransitionCompleted() {
- #endif // DCHECK_IS_ON()
- tab_fullscreen_target_display_id_ = display::kInvalidDisplayId;
- started_fullscreen_transition_ = false;
- +#if 0
- if (!IsTabFullscreen()) {
- // Activate any popup windows created while content fullscreen, after exit.
- popunder_preventer_.reset();
- }
- +#endif
- }
-
- void FullscreenController::RunOrDeferUntilTransitionIsComplete(
- @@ -573,18 +583,17 @@ void FullscreenController::EnterFullscreenModeInternal(
- // Do not enter fullscreen mode if disallowed by pref. This prevents the user
- // from manually entering fullscreen mode and also disables kiosk mode on
- // desktop platforms.
- - if (!exclusive_access_manager()
- - ->context()
- - ->GetProfile()
- - ->GetPrefs()
- - ->GetBoolean(prefs::kFullscreenAllowed)) {
- + auto* profile = exclusive_access_manager()->context()->GetProfile();
- + if (!profile || !profile->GetPrefs()->GetBoolean(prefs::kFullscreenAllowed))
- return;
- - }
- #endif
- started_fullscreen_transition_ = true;
- toggled_into_fullscreen_ = true;
- +#if 0
- bool entering_tab_fullscreen = option == TAB && !tab_fullscreen_;
- +#endif
- GURL url;
- +#if 0
- if (option == TAB) {
- url = GetRequestingOrigin();
- tab_fullscreen_ = true;
- @@ -617,6 +626,7 @@ void FullscreenController::EnterFullscreenModeInternal(
- if (!extension_caused_fullscreen_.is_empty())
- url = extension_caused_fullscreen_;
- }
- +#endif
-
- fullscreen_start_time_ = base::TimeTicks::Now();
- if (option == BROWSER)
- @@ -636,6 +646,7 @@ void FullscreenController::ExitFullscreenModeInternal() {
- if (chrome::IsRunningInAppMode())
- return;
-
- +#if 0
- // `fullscreen_start_time_` is null if a fullscreen tab moves to a new window.
- if (fullscreen_start_time_ && exclusive_access_tab()) {
- ukm::SourceId source_id =
- @@ -647,15 +658,16 @@ void FullscreenController::ExitFullscreenModeInternal() {
- .Record(ukm::UkmRecorder::Get());
- fullscreen_start_time_.reset();
- }
- +#endif
-
- toggled_into_fullscreen_ = false;
- started_fullscreen_transition_ = true;
- -#if BUILDFLAG(IS_MAC)
- - // Mac windows report a state change instantly, and so we must also clear
- +
- + // Electron native windows report a state change instantly, and so we must also clear
- // state_prior_to_tab_fullscreen_ to match them else other logic using
- // state_prior_to_tab_fullscreen_ will be incorrect.
- NotifyTabExclusiveAccessLost();
- -#endif
- +
- exclusive_access_manager()->context()->ExitFullscreen();
- extension_caused_fullscreen_ = GURL();
- exclusive_access_manager()->UpdateBubble(base::NullCallback());
- @@ -717,8 +729,12 @@ GURL FullscreenController::GetEmbeddingOrigin() const {
- void FullscreenController::RecordMetricsOnFullscreenApiRequested(
- content::RenderFrameHost* requesting_frame) {
- history::HistoryService* service =
- + #if 0
- HistoryServiceFactory::GetForProfileWithoutCreating(
- exclusive_access_manager()->context()->GetProfile());
- + #else
- + nullptr;
- + #endif
- if (service) {
- // Check if the origin has been visited more than a day ago and whether it's
- // on an allowlist, then record those bits of information in a metric.
- diff --git a/chrome/browser/ui/exclusive_access/fullscreen_controller.h b/chrome/browser/ui/exclusive_access/fullscreen_controller.h
- index 97003f03b69c9435ee1f79e42476003b63b8a66d..859b9d21985c14c9e9f95c65edfbd89e13ef16e7 100644
- --- a/chrome/browser/ui/exclusive_access/fullscreen_controller.h
- +++ b/chrome/browser/ui/exclusive_access/fullscreen_controller.h
- @@ -250,10 +250,12 @@ class FullscreenController : public ExclusiveAccessControllerBase {
- // Used in testing to set the state to tab fullscreen.
- bool is_tab_fullscreen_for_testing_ = false;
-
- +#if 0
- // Tracks related popups that lost activation or were shown without activation
- // during content fullscreen sessions. This also activates the popups when
- // fullscreen exits, to prevent sites from creating persistent popunders.
- std::unique_ptr<PopunderPreventer> popunder_preventer_;
- +#endif
-
- base::ObserverList<FullscreenObserver> observer_list_;
-
|