feat: enable picture-in-picture mode for video tags (#17686)
* feat: enable picture in picture mode for video tags * test: add test to verify picture in picture support * lint: fix indent * fix: clean up after rebase * test: update test with 16:9 test video * fix: .paches after rebase
This commit is contained in:
parent
46b6bcd99b
commit
9ccd6aa0dd
15 changed files with 318 additions and 0 deletions
|
@ -402,6 +402,9 @@ void AtomBrowserClient::OverrideWebkitPrefs(content::RenderViewHost* host,
|
|||
prefs->default_minimum_page_scale_factor = 1.f;
|
||||
prefs->default_maximum_page_scale_factor = 1.f;
|
||||
prefs->navigate_on_drag_drop = false;
|
||||
#if !BUILDFLAG(ENABLE_PICTURE_IN_PICTURE)
|
||||
prefs->picture_in_picture_enabled = false;
|
||||
#endif
|
||||
|
||||
ui::NativeTheme* native_theme = ui::NativeTheme::GetInstanceForNativeUi();
|
||||
prefs->preferred_color_scheme = native_theme->ShouldUseDarkColors()
|
||||
|
@ -684,6 +687,14 @@ bool AtomBrowserClient::CanCreateWindow(
|
|||
return false;
|
||||
}
|
||||
|
||||
#if BUILDFLAG(ENABLE_PICTURE_IN_PICTURE)
|
||||
std::unique_ptr<content::OverlayWindow>
|
||||
AtomBrowserClient::CreateWindowForPictureInPicture(
|
||||
content::PictureInPictureWindowController* controller) {
|
||||
return content::OverlayWindow::Create(controller);
|
||||
}
|
||||
#endif
|
||||
|
||||
void AtomBrowserClient::GetAdditionalAllowedSchemesForFileSystem(
|
||||
std::vector<std::string>* additional_schemes) {
|
||||
auto schemes_list = api::GetStandardSchemes();
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "base/synchronization/lock.h"
|
||||
#include "content/public/browser/content_browser_client.h"
|
||||
#include "content/public/browser/render_process_host_observer.h"
|
||||
#include "electron/buildflags/buildflags.h"
|
||||
#include "net/ssl/client_cert_identity.h"
|
||||
|
||||
namespace content {
|
||||
|
@ -127,6 +128,10 @@ class AtomBrowserClient : public content::ContentBrowserClient,
|
|||
bool user_gesture,
|
||||
bool opener_suppressed,
|
||||
bool* no_javascript_access) override;
|
||||
#if BUILDFLAG(ENABLE_PICTURE_IN_PICTURE)
|
||||
std::unique_ptr<content::OverlayWindow> CreateWindowForPictureInPicture(
|
||||
content::PictureInPictureWindowController* controller) override;
|
||||
#endif
|
||||
void GetAdditionalAllowedSchemesForFileSystem(
|
||||
std::vector<std::string>* additional_schemes) override;
|
||||
void GetAdditionalWebUISchemes(
|
||||
|
|
|
@ -55,6 +55,10 @@
|
|||
#include "shell/browser/printing/print_preview_message_handler.h"
|
||||
#endif
|
||||
|
||||
#if BUILDFLAG(ENABLE_PICTURE_IN_PICTURE)
|
||||
#include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h"
|
||||
#endif
|
||||
|
||||
using content::BrowserThread;
|
||||
|
||||
namespace electron {
|
||||
|
@ -636,4 +640,23 @@ void CommonWebContentsDelegate::SetHtmlApiFullscreen(bool enter_fullscreen) {
|
|||
native_fullscreen_ = false;
|
||||
}
|
||||
|
||||
content::PictureInPictureResult
|
||||
CommonWebContentsDelegate::EnterPictureInPicture(
|
||||
content::WebContents* web_contents,
|
||||
const viz::SurfaceId& surface_id,
|
||||
const gfx::Size& natural_size) {
|
||||
#if BUILDFLAG(ENABLE_PICTURE_IN_PICTURE)
|
||||
return PictureInPictureWindowManager::GetInstance()->EnterPictureInPicture(
|
||||
web_contents, surface_id, natural_size);
|
||||
#else
|
||||
return content::PictureInPictureResult::kNotSupported;
|
||||
#endif
|
||||
}
|
||||
|
||||
void CommonWebContentsDelegate::ExitPictureInPicture() {
|
||||
#if BUILDFLAG(ENABLE_PICTURE_IN_PICTURE)
|
||||
PictureInPictureWindowManager::GetInstance()->ExitPictureInPicture();
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace electron
|
||||
|
|
|
@ -102,6 +102,11 @@ class CommonWebContentsDelegate : public content::WebContentsDelegate,
|
|||
bool HandleKeyboardEvent(
|
||||
content::WebContents* source,
|
||||
const content::NativeWebKeyboardEvent& event) override;
|
||||
content::PictureInPictureResult EnterPictureInPicture(
|
||||
content::WebContents* web_contents,
|
||||
const viz::SurfaceId&,
|
||||
const gfx::Size& natural_size) override;
|
||||
void ExitPictureInPicture() override;
|
||||
|
||||
// InspectableWebContentsDelegate:
|
||||
void DevToolsSaveToFile(const std::string& url,
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
#include "base/command_line.h"
|
||||
#include "base/feature_list.h"
|
||||
#include "content/public/common/content_features.h"
|
||||
#include "electron/buildflags/buildflags.h"
|
||||
#include "media/base/media_switches.h"
|
||||
|
||||
namespace electron {
|
||||
|
||||
|
@ -25,6 +27,9 @@ void InitializeFeatureList() {
|
|||
// when node integration is enabled.
|
||||
disable_features +=
|
||||
std::string(",") + features::kSpareRendererForSitePerProcess.name;
|
||||
#if !BUILDFLAG(ENABLE_PICTURE_IN_PICTURE)
|
||||
disable_features += std::string(",") + media::kPictureInPicture.name;
|
||||
#endif
|
||||
base::FeatureList::InitializeInstance(enable_features, disable_features);
|
||||
}
|
||||
|
||||
|
|
|
@ -45,6 +45,10 @@ bool IsExtensionsEnabled() {
|
|||
return BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS);
|
||||
}
|
||||
|
||||
bool IsPictureInPictureEnabled() {
|
||||
return BUILDFLAG(ENABLE_PICTURE_IN_PICTURE);
|
||||
}
|
||||
|
||||
bool IsComponentBuild() {
|
||||
#if defined(COMPONENT_BUILD)
|
||||
return true;
|
||||
|
@ -67,6 +71,7 @@ void Initialize(v8::Local<v8::Object> exports,
|
|||
dict.SetMethod("isViewApiEnabled", &IsViewApiEnabled);
|
||||
dict.SetMethod("isTtsEnabled", &IsTtsEnabled);
|
||||
dict.SetMethod("isPrintingEnabled", &IsPrintingEnabled);
|
||||
dict.SetMethod("isPictureInPictureEnabled", &IsPictureInPictureEnabled);
|
||||
dict.SetMethod("isComponentBuild", &IsComponentBuild);
|
||||
dict.SetMethod("isExtensionsEnabled", &IsExtensionsEnabled);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue