aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-05-25 07:12:11 -0500
committerGitHub <noreply@github.com>2017-05-25 07:12:11 -0500
commit3c267d7fddd036f6bcc9ebf000ed37665cf7496d (patch)
tree1b643c9429d03dc56196a3771b9a8f1b22ab9a4f /components/script/dom
parent7780ef5e431b7c346c0f50ff914fbda9b5017900 (diff)
parent5ac106cbbe30054ee9440082049ccad0595937d5 (diff)
downloadservo-3c267d7fddd036f6bcc9ebf000ed37665cf7496d.tar.gz
servo-3c267d7fddd036f6bcc9ebf000ed37665cf7496d.zip
Auto merge of #17031 - MortimerGoro:update_webvr, r=emilio
Update rust-webvr <!-- Please describe your changes on the following line: --> Required for https://github.com/servo/servo/issues/16556 --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [ ] These changes fix #__ (github issue number if applicable). <!-- Either: --> - [x] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/17031) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/vr.rs7
-rw-r--r--components/script/dom/vrdisplay.rs34
-rw-r--r--components/script/dom/vrdisplayevent.rs7
3 files changed, 46 insertions, 2 deletions
diff --git a/components/script/dom/vr.rs b/components/script/dom/vr.rs
index 9497405e8c9..d906d0e9964 100644
--- a/components/script/dom/vr.rs
+++ b/components/script/dom/vr.rs
@@ -152,6 +152,13 @@ impl VR {
WebVRDisplayEvent::Change(ref display) => {
let display = self.sync_display(&display);
display.handle_webvr_event(&event);
+ },
+ WebVRDisplayEvent::Pause(id) |
+ WebVRDisplayEvent::Resume(id) |
+ WebVRDisplayEvent::Exit(id) => {
+ if let Some(display) = self.find_display(id) {
+ display.handle_webvr_event(&event);
+ }
}
};
}
diff --git a/components/script/dom/vrdisplay.rs b/components/script/dom/vrdisplay.rs
index b9b65264c44..da5c12e8c54 100644
--- a/components/script/dom/vrdisplay.rs
+++ b/components/script/dom/vrdisplay.rs
@@ -71,7 +71,9 @@ pub struct VRDisplay {
frame_data_status: Cell<VRFrameDataStatus>,
#[ignore_heap_size_of = "channels are hard"]
frame_data_receiver: DOMRefCell<Option<IpcReceiver<Result<Vec<u8>, ()>>>>,
- running_display_raf: Cell<bool>
+ running_display_raf: Cell<bool>,
+ paused: Cell<bool>,
+ stopped_on_pause: Cell<bool>,
}
unsafe_no_jsmanaged_fields!(WebVRDisplayData);
@@ -112,6 +114,12 @@ impl VRDisplay {
frame_data_status: Cell::new(VRFrameDataStatus::Waiting),
frame_data_receiver: DOMRefCell::new(None),
running_display_raf: Cell::new(false),
+ // Some VR implementations (e.g. Daydream) can be paused in some life cycle situations
+ // such as showing and hiding the controller pairing screen.
+ paused: Cell::new(false),
+ // This flag is set when the Display was presenting when it received a VR Pause event.
+ // When the VR Resume event is received and the flag is set, VR presentation automatically restarts.
+ stopped_on_pause: Cell::new(false)
}
}
@@ -428,6 +436,30 @@ impl VRDisplay {
// Change event doesn't exist in WebVR spec.
// So we update display data but don't notify JS.
self.update_display(&display);
+ },
+ WebVRDisplayEvent::Pause(_) => {
+ if self.paused.get() {
+ return;
+ }
+ self.paused.set(true);
+ if self.presenting.get() {
+ self.stop_present();
+ self.stopped_on_pause.set(true);
+ }
+
+ },
+ WebVRDisplayEvent::Resume(_) => {
+ self.paused.set(false);
+ if self.stopped_on_pause.get() {
+ self.stopped_on_pause.set(false);
+ self.init_present();
+ }
+ },
+ WebVRDisplayEvent::Exit(_) => {
+ self.stopped_on_pause.set(false);
+ if self.presenting.get() {
+ self.stop_present();
+ }
}
};
}
diff --git a/components/script/dom/vrdisplayevent.rs b/components/script/dom/vrdisplayevent.rs
index 956229ead4c..4db24687dcc 100644
--- a/components/script/dom/vrdisplayevent.rs
+++ b/components/script/dom/vrdisplayevent.rs
@@ -66,7 +66,12 @@ impl VRDisplayEvent {
WebVRDisplayEvent::Blur(_) => ("blur", None),
WebVRDisplayEvent::Focus(_) => ("focus", None),
WebVRDisplayEvent::PresentChange(_, _) => ("presentchange", None),
- WebVRDisplayEvent::Change(_) => panic!("VRDisplayEvent:Change event not available in WebVR")
+ WebVRDisplayEvent::Change(_) |
+ WebVRDisplayEvent::Pause(_) |
+ WebVRDisplayEvent::Resume(_) |
+ WebVRDisplayEvent::Exit(_) => {
+ panic!("{:?} event not available in WebVR", event)
+ }
};
// map to JS enum values