Auto merge of #27530 - jdm:media, r=Manishearth

Fix crashes on video playback in UWP

- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #27529 and fix #27526
- [x] These changes do not require tests because there's no way to test UWP right now.
This commit is contained in:
bors-servo 2020-08-06 16:30:04 -04:00 committed by GitHub
commit 776b564db1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 61 additions and 27 deletions

View file

@ -20,7 +20,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::htmlmediaelement::HTMLMediaElement; use crate::dom::htmlmediaelement::HTMLMediaElement;
use crate::dom::mediametadata::MediaMetadata; use crate::dom::mediametadata::MediaMetadata;
use crate::dom::window::Window; use crate::dom::window::Window;
use crate::realms::{AlreadyInRealm, InRealm}; use crate::realms::{enter_realm, InRealm};
use dom_struct::dom_struct; use dom_struct::dom_struct;
use embedder_traits::MediaMetadata as EmbedderMediaMetadata; use embedder_traits::MediaMetadata as EmbedderMediaMetadata;
use embedder_traits::MediaSessionEvent; use embedder_traits::MediaSessionEvent;
@ -80,8 +80,8 @@ impl MediaSession {
if let Some(media) = self.media_instance.get() { if let Some(media) = self.media_instance.get() {
match action { match action {
MediaSessionActionType::Play => { MediaSessionActionType::Play => {
let in_realm_proof = AlreadyInRealm::assert(&self.global()); let realm = enter_realm(self);
media.Play(InRealm::Already(&in_realm_proof)); media.Play(InRealm::Entered(&realm));
}, },
MediaSessionActionType::Pause => { MediaSessionActionType::Pause => {
media.Pause(); media.Pause();

View file

@ -81,6 +81,8 @@ void BrowserPage::BindServoEvents() {
urlTextbox().GotFocus(std::bind(&BrowserPage::OnURLFocused, this, _1)); urlTextbox().GotFocus(std::bind(&BrowserPage::OnURLFocused, this, _1));
servoView().OnMediaSessionMetadata( servoView().OnMediaSessionMetadata(
[=](hstring title, hstring artist, hstring album) {}); [=](hstring title, hstring artist, hstring album) {});
servoView().OnMediaSessionPosition(
[=](double duration, double position, double rate) {});
servoView().OnMediaSessionPlaybackStateChange([=](const auto &, int state) { servoView().OnMediaSessionPlaybackStateChange([=](const auto &, int state) {
if (state == Servo::MediaSessionPlaybackState::None) { if (state == Servo::MediaSessionPlaybackState::None) {
mediaControls().Visibility(Visibility::Collapsed); mediaControls().Visibility(Visibility::Collapsed);

View file

@ -87,6 +87,8 @@
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(ProjectDir)\..\..\..\target\aarch64-uwp-windows-msvc\debug\</AdditionalIncludeDirectories> <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(ProjectDir)\..\..\..\target\aarch64-uwp-windows-msvc\debug\</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(ProjectDir)\..\..\..\target\x86_64-uwp-windows-msvc\debug\</AdditionalIncludeDirectories> <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(ProjectDir)\..\..\..\target\x86_64-uwp-windows-msvc\debug\</AdditionalIncludeDirectories>
<LanguageStandard Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">stdcpplatest</LanguageStandard>
<LanguageStandard Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">stdcpplatest</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">OneCore.lib;WindowsApp.lib;%(AdditionalDependencies);simpleservo.dll.lib</AdditionalDependencies> <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">OneCore.lib;WindowsApp.lib;%(AdditionalDependencies);simpleservo.dll.lib</AdditionalDependencies>
@ -105,6 +107,8 @@
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(ProjectDir)\..\..\..\target\aarch64-uwp-windows-msvc\release</AdditionalIncludeDirectories> <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(ProjectDir)\..\..\..\target\aarch64-uwp-windows-msvc\release</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(ProjectDir)\..\..\..\target\x86_64-uwp-windows-msvc\release</AdditionalIncludeDirectories> <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories);$(ProjectDir)\..\..\..\target\x86_64-uwp-windows-msvc\release</AdditionalIncludeDirectories>
<LanguageStandard Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">stdcpplatest</LanguageStandard>
<LanguageStandard Condition="'$(Configuration)|$(Platform)'=='Release|x64'">stdcpplatest</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">OneCore.lib;WindowsApp.lib;%(AdditionalDependencies);simpleservo.dll.lib</AdditionalDependencies> <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">OneCore.lib;WindowsApp.lib;%(AdditionalDependencies);simpleservo.dll.lib</AdditionalDependencies>
@ -1010,4 +1014,4 @@
<Error Condition="!Exists('..\packages\ANGLE.WindowsStore.Servo.2.1.19\build\native\ANGLE.WindowsStore.Servo.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ANGLE.WindowsStore.Servo.2.1.19\build\native\ANGLE.WindowsStore.Servo.targets'))" /> <Error Condition="!Exists('..\packages\ANGLE.WindowsStore.Servo.2.1.19\build\native\ANGLE.WindowsStore.Servo.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ANGLE.WindowsStore.Servo.2.1.19\build\native\ANGLE.WindowsStore.Servo.targets'))" />
<Error Condition="!Exists('..\packages\Microsoft.UI.Xaml.2.4.2\build\native\Microsoft.UI.Xaml.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.UI.Xaml.2.4.2\build\native\Microsoft.UI.Xaml.targets'))" /> <Error Condition="!Exists('..\packages\Microsoft.UI.Xaml.2.4.2\build\native\Microsoft.UI.Xaml.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.UI.Xaml.2.4.2\build\native\Microsoft.UI.Xaml.targets'))" />
</Target> </Target>
</Project> </Project>

View file

@ -99,6 +99,12 @@ const char *get_clipboard_contents() {
return nullptr; return nullptr;
} }
void on_media_session_set_position_state(double duration, double position,
double playback_rate) {
return sServo->Delegate().OnServoMediaSessionPosition(duration, position,
playback_rate);
}
void on_media_session_metadata(const char *title, const char *album, void on_media_session_metadata(const char *title, const char *album,
const char *artist) { const char *artist) {
return sServo->Delegate().OnServoMediaSessionMetadata( return sServo->Delegate().OnServoMediaSessionMetadata(
@ -296,29 +302,32 @@ Servo::Servo(std::optional<hstring> initUrl, hstring args, GLsizei width,
std::to_string(GetLastError())); std::to_string(GetLastError()));
} }
capi::CHostCallbacks c; capi::CHostCallbacks c = capi::CHostCallbacks{
c.on_load_started = &on_load_started; .on_load_started = &on_load_started,
c.on_load_ended = &on_load_ended; .on_load_ended = &on_load_ended,
c.on_title_changed = &on_title_changed; .on_title_changed = &on_title_changed,
c.on_url_changed = &on_url_changed; .on_allow_navigation = &on_allow_navigation,
c.on_history_changed = &on_history_changed; .on_url_changed = &on_url_changed,
c.on_animating_changed = &on_animating_changed; .on_history_changed = &on_history_changed,
c.on_shutdown_complete = &on_shutdown_complete; .on_animating_changed = &on_animating_changed,
c.on_allow_navigation = &on_allow_navigation; .on_shutdown_complete = &on_shutdown_complete,
c.on_ime_show = &on_ime_show; .on_ime_show = &on_ime_show,
c.on_ime_hide = &on_ime_hide; .on_ime_hide = &on_ime_hide,
c.get_clipboard_contents = &get_clipboard_contents; .get_clipboard_contents = &get_clipboard_contents,
c.set_clipboard_contents = &set_clipboard_contents; .set_clipboard_contents = &set_clipboard_contents,
c.on_media_session_metadata = &on_media_session_metadata; .on_media_session_metadata = &on_media_session_metadata,
c.on_media_session_playback_state_change = .on_media_session_playback_state_change =
&on_media_session_playback_state_change; &on_media_session_playback_state_change,
c.prompt_alert = &prompt_alert; .on_media_session_set_position_state =
c.prompt_ok_cancel = &prompt_ok_cancel; &on_media_session_set_position_state,
c.prompt_yes_no = &prompt_yes_no; .prompt_alert = &prompt_alert,
c.prompt_input = &prompt_input; .prompt_ok_cancel = &prompt_ok_cancel,
c.on_devtools_started = &on_devtools_started; .prompt_yes_no = &prompt_yes_no,
c.show_context_menu = &show_context_menu; .prompt_input = &prompt_input,
c.on_log_output = &on_log_output; .on_devtools_started = &on_devtools_started,
.show_context_menu = &show_context_menu,
.on_log_output = &on_log_output,
};
capi::register_panic_handler(&on_panic); capi::register_panic_handler(&on_panic);

View file

@ -124,6 +124,7 @@ public:
virtual void OnServoIMEHide() = 0; virtual void OnServoIMEHide() = 0;
virtual void OnServoDevtoolsStarted(bool, const unsigned int, hstring) = 0; virtual void OnServoDevtoolsStarted(bool, const unsigned int, hstring) = 0;
virtual void OnServoMediaSessionMetadata(hstring, hstring, hstring) = 0; virtual void OnServoMediaSessionMetadata(hstring, hstring, hstring) = 0;
virtual void OnServoMediaSessionPosition(double, double, double) = 0;
virtual void OnServoMediaSessionPlaybackStateChange(int) = 0; virtual void OnServoMediaSessionPlaybackStateChange(int) = 0;
virtual void OnServoPromptAlert(hstring, bool) = 0; virtual void OnServoPromptAlert(hstring, bool) = 0;
virtual void OnServoShowContextMenu(std::optional<hstring>, virtual void OnServoShowContextMenu(std::optional<hstring>,

View file

@ -548,6 +548,12 @@ void ServoControl::OnServoIMEShow(hstring text, int32_t x, int32_t y,
}); });
} }
void ServoControl::OnServoMediaSessionPosition(double duration, double position,
double playback_rate) {
RunOnUIThread(
[=] { mOnMediaSessionPositionEvent(duration, position, playback_rate); });
}
void ServoControl::OnServoMediaSessionMetadata(hstring title, hstring artist, void ServoControl::OnServoMediaSessionMetadata(hstring title, hstring artist,
hstring album) { hstring album) {
RunOnUIThread([=] { mOnMediaSessionMetadataEvent(title, artist, album); }); RunOnUIThread([=] { mOnMediaSessionMetadataEvent(title, artist, album); });

View file

@ -151,6 +151,14 @@ struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {
mOnCaptureGesturesEndedEvent.remove(token); mOnCaptureGesturesEndedEvent.remove(token);
} }
winrt::event_token
OnMediaSessionPosition(MediaSessionPositionDelegate const &handler) {
return mOnMediaSessionPositionEvent.add(handler);
};
void OnMediaSessionPosition(winrt::event_token const &token) noexcept {
mOnMediaSessionPositionEvent.remove(token);
}
winrt::event_token winrt::event_token
OnMediaSessionMetadata(MediaSessionMetadataDelegate const &handler) { OnMediaSessionMetadata(MediaSessionMetadataDelegate const &handler) {
return mOnMediaSessionMetadataEvent.add(handler); return mOnMediaSessionMetadataEvent.add(handler);
@ -187,6 +195,7 @@ struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {
virtual void OnServoMediaSessionMetadata(winrt::hstring, winrt::hstring, virtual void OnServoMediaSessionMetadata(winrt::hstring, winrt::hstring,
winrt::hstring); winrt::hstring);
virtual void OnServoMediaSessionPlaybackStateChange(int); virtual void OnServoMediaSessionPlaybackStateChange(int);
virtual void OnServoMediaSessionPosition(double, double, double);
virtual void OnServoPromptAlert(winrt::hstring, bool); virtual void OnServoPromptAlert(winrt::hstring, bool);
virtual void OnServoShowContextMenu(std::optional<winrt::hstring>, virtual void OnServoShowContextMenu(std::optional<winrt::hstring>,
std::vector<winrt::hstring>); std::vector<winrt::hstring>);
@ -210,6 +219,7 @@ private:
winrt::event<EventDelegate> mOnCaptureGesturesStartedEvent; winrt::event<EventDelegate> mOnCaptureGesturesStartedEvent;
winrt::event<EventDelegate> mOnCaptureGesturesEndedEvent; winrt::event<EventDelegate> mOnCaptureGesturesEndedEvent;
winrt::event<MediaSessionMetadataDelegate> mOnMediaSessionMetadataEvent; winrt::event<MediaSessionMetadataDelegate> mOnMediaSessionMetadataEvent;
winrt::event<MediaSessionPositionDelegate> mOnMediaSessionPositionEvent;
winrt::event<Windows::Foundation::EventHandler<int>> winrt::event<Windows::Foundation::EventHandler<int>>
mOnMediaSessionPlaybackStateChangeEvent; mOnMediaSessionPlaybackStateChangeEvent;

View file

@ -3,6 +3,7 @@ namespace ServoApp {
delegate void EventDelegate(); delegate void EventDelegate();
delegate void HistoryChangedDelegate(Boolean back, Boolean forward); delegate void HistoryChangedDelegate(Boolean back, Boolean forward);
delegate void MediaSessionMetadataDelegate(String title, String artist, String album); delegate void MediaSessionMetadataDelegate(String title, String artist, String album);
delegate void MediaSessionPositionDelegate(Double duration, Double position, Double rate);
delegate void DevtoolsStatusChangedDelegate(DevtoolsStatus status, UInt32 port, String token); delegate void DevtoolsStatusChangedDelegate(DevtoolsStatus status, UInt32 port, String token);
enum DevtoolsStatus { enum DevtoolsStatus {
@ -42,6 +43,7 @@ namespace ServoApp {
event Windows.Foundation.EventHandler<String> OnServoPanic; event Windows.Foundation.EventHandler<String> OnServoPanic;
event Windows.Foundation.EventHandler<String> OnURLChanged; event Windows.Foundation.EventHandler<String> OnURLChanged;
event MediaSessionMetadataDelegate OnMediaSessionMetadata; event MediaSessionMetadataDelegate OnMediaSessionMetadata;
event MediaSessionPositionDelegate OnMediaSessionPosition;
event Windows.Foundation.EventHandler<int> OnMediaSessionPlaybackStateChange; event Windows.Foundation.EventHandler<int> OnMediaSessionPlaybackStateChange;
Windows.Foundation.Collections.IVector<Pref> Preferences { get; }; Windows.Foundation.Collections.IVector<Pref> Preferences { get; };
Pref GetPref(String key); Pref GetPref(String key);