Commit 0e628aec authored by Harkiran Bolaria's avatar Harkiran Bolaria Committed by Commit Bot

Reland: [bfcache] Blocklist documents/frames with picture-in-picture functionality from bfcache

Delta: fix flakey testing failures on linux-chromeos-dbg trybot

From previous submit:
Bfcache is disabled for documents and frames when picture-in-picture
functionality is used because the functionality does not close and the
video continues to be displayed even while the page is in the cache.

Some background on why we sometimes need to disable bfcache:
https://docs.google.com/document/d/1NjZeusdS1kyEkZyfLggndU1A6qVt0Y1sa-LRUxnMoK8

Bug: 1073224
Change-Id: Icea97b3f3f408ad9b677a39ad4d3bfe924c69309

TBR=haraken@chromium.org

Change-Id: Icea97b3f3f408ad9b677a39ad4d3bfe924c69309
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2188654
Commit-Queue: Harkiran Bolaria <hbolaria@google.com>
Reviewed-by: default avatarNoel Gordon <noel@chromium.org>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#768896}
parent 9747d36e
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "chrome/browser/ui/content_settings/content_setting_bubble_model.h" #include "chrome/browser/ui/content_settings/content_setting_bubble_model.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_types.h" #include "components/content_settings/core/common/content_settings_types.h"
...@@ -247,6 +248,34 @@ IN_PROC_BROWSER_TEST_F(ChromeBackForwardCacheBrowserTest, ...@@ -247,6 +248,34 @@ IN_PROC_BROWSER_TEST_F(ChromeBackForwardCacheBrowserTest,
delete_observer_rfh_a.WaitUntilDeleted(); delete_observer_rfh_a.WaitUntilDeleted();
} }
IN_PROC_BROWSER_TEST_F(ChromeBackForwardCacheBrowserTest,
DoesNotCacheIfPictureInPicture) {
embedded_test_server()->ServeFilesFromSourceDirectory("content/test/data");
ASSERT_TRUE(embedded_test_server()->Start());
// Navigate to a page with picture-in-picture functionality.
const base::FilePath::CharType picture_in_picture_page[] =
FILE_PATH_LITERAL("media/picture-in-picture/window-size.html");
GURL test_page_url = ui_test_utils::GetTestUrl(
base::FilePath(base::FilePath::kCurrentDirectory),
base::FilePath(picture_in_picture_page));
EXPECT_TRUE(content::NavigateToURL(web_contents(), test_page_url));
// Execute picture-in-picture on the page.
bool result = false;
ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
web_contents(), "enterPictureInPicture();", &result));
EXPECT_TRUE(result);
content::RenderFrameDeletedObserver deleted(current_frame_host());
// Navigate away.
EXPECT_TRUE(content::NavigateToURL(web_contents(), GetURL("b.com")));
// The page uses Picture-in-Picture so it should be deleted.
deleted.WaitUntilDeleted();
}
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
IN_PROC_BROWSER_TEST_F(ChromeBackForwardCacheBrowserTest, IN_PROC_BROWSER_TEST_F(ChromeBackForwardCacheBrowserTest,
DoesNotCacheIfWebShare) { DoesNotCacheIfWebShare) {
......
...@@ -151,7 +151,8 @@ uint64_t GetDisallowedFeatures(RenderFrameHostImpl* rfh) { ...@@ -151,7 +151,8 @@ uint64_t GetDisallowedFeatures(RenderFrameHostImpl* rfh) {
FeatureToBit(WebSchedulerTrackedFeature::kWebFileSystem) | FeatureToBit(WebSchedulerTrackedFeature::kWebFileSystem) |
FeatureToBit(WebSchedulerTrackedFeature::kAppBanner) | FeatureToBit(WebSchedulerTrackedFeature::kAppBanner) |
FeatureToBit(WebSchedulerTrackedFeature::kPrinting) | FeatureToBit(WebSchedulerTrackedFeature::kPrinting) |
FeatureToBit(WebSchedulerTrackedFeature::kWebDatabase); FeatureToBit(WebSchedulerTrackedFeature::kWebDatabase) |
FeatureToBit(WebSchedulerTrackedFeature::kPictureInPicture);
uint64_t result = kAlwaysDisallowedFeatures; uint64_t result = kAlwaysDisallowedFeatures;
......
...@@ -53,6 +53,13 @@ void PictureInPictureServiceImpl::StartSession( ...@@ -53,6 +53,13 @@ void PictureInPictureServiceImpl::StartSession(
natural_size, show_play_pause_button, natural_size, show_play_pause_button,
session_remote.InitWithNewPipeAndPassReceiver(), std::move(observer), session_remote.InitWithNewPipeAndPassReceiver(), std::move(observer),
&window_size); &window_size);
// Frames are to be blocklisted from the back-forward cache because the
// picture-in-picture continues to be displayed while the page is in the
// cache instead of closing.
static_cast<RenderFrameHostImpl*>(render_frame_host_)
->OnSchedulerTrackedFeatureUsed(
blink::scheduler::WebSchedulerTrackedFeature::kPictureInPicture);
} }
std::move(callback).Run(std::move(session_remote), window_size); std::move(callback).Run(std::move(session_remote), window_size);
......
...@@ -95,6 +95,8 @@ const char* FeatureToString(WebSchedulerTrackedFeature feature) { ...@@ -95,6 +95,8 @@ const char* FeatureToString(WebSchedulerTrackedFeature feature) {
return "Printing"; return "Printing";
case WebSchedulerTrackedFeature::kWebDatabase: case WebSchedulerTrackedFeature::kWebDatabase:
return "WebDatabase"; return "WebDatabase";
case WebSchedulerTrackedFeature::kPictureInPicture:
return "PictureInPicture";
} }
} }
......
...@@ -87,9 +87,10 @@ enum class WebSchedulerTrackedFeature { ...@@ -87,9 +87,10 @@ enum class WebSchedulerTrackedFeature {
kAppBanner = 42, kAppBanner = 42,
kPrinting = 43, kPrinting = 43,
kWebDatabase = 44, kWebDatabase = 44,
kPictureInPicture = 45,
// NB: This enum is used in a bitmask, so kMaxValue must be less than 64. // NB: This enum is used in a bitmask, so kMaxValue must be less than 64.
kMaxValue = kWebDatabase kMaxValue = kPictureInPicture
}; };
static_assert(static_cast<uint32_t>(WebSchedulerTrackedFeature::kMaxValue) < 64, static_assert(static_cast<uint32_t>(WebSchedulerTrackedFeature::kMaxValue) < 64,
......
...@@ -53,6 +53,7 @@ bool SchedulingPolicy::IsFeatureSticky(SchedulingPolicy::Feature feature) { ...@@ -53,6 +53,7 @@ bool SchedulingPolicy::IsFeatureSticky(SchedulingPolicy::Feature feature) {
case Feature::kWebFileSystem: case Feature::kWebFileSystem:
case Feature::kAppBanner: case Feature::kAppBanner:
case Feature::kPrinting: case Feature::kPrinting:
case Feature::kPictureInPicture:
return true; return true;
} }
} }
......
...@@ -70577,6 +70577,7 @@ Called by update_scheduler_enums.py.--> ...@@ -70577,6 +70577,7 @@ Called by update_scheduler_enums.py.-->
<int value="42" label="AppBanner"/> <int value="42" label="AppBanner"/>
<int value="43" label="Printing"/> <int value="43" label="Printing"/>
<int value="44" label="WebDatabase"/> <int value="44" label="WebDatabase"/>
<int value="45" label="PictureInPicture"/>
</enum> </enum>
<enum name="WebShareMethod"> <enum name="WebShareMethod">
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment