Skip to content

Commit ecafe10

Browse files
committed
automatically set playsinline on videos in a-assets (fixes #1906)
1 parent aa478cf commit ecafe10

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

‎src/core/a-assets.js‎

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ module.exports = registerElement('a-assets', {
3838
// Wait for <img>s.
3939
imgEls = this.querySelectorAll('img');
4040
for (i = 0; i < imgEls.length; i++) {
41-
imgEl = setCrossOrigin(imgEls[i]);
41+
imgEl = fixUpMediaElement(imgEls[i]);
4242
loaded.push(new Promise(function (resolve, reject) {
4343
imgEl.onload = resolve;
4444
imgEl.onerror = reject;
@@ -48,7 +48,7 @@ module.exports = registerElement('a-assets', {
4848
// Wait for <audio>s and <video>s.
4949
mediaEls = this.querySelectorAll('audio, video');
5050
for (i = 0; i < mediaEls.length; i++) {
51-
mediaEl = setCrossOrigin(mediaEls[i]);
51+
mediaEl = fixUpMediaElement(mediaEls[i]);
5252
loaded.push(mediaElementLoaded(mediaEl));
5353
}
5454

@@ -159,6 +159,27 @@ function mediaElementLoaded (el) {
159159
});
160160
}
161161

162+
/**
163+
* Automatically add attributes to media elements where convenient.
164+
* crossorigin, playsinline.
165+
*/
166+
function fixUpMediaElement (mediaEl) {
167+
// Cross-origin.
168+
var newMediaEl = setCrossOrigin(mediaEl);
169+
170+
// Plays inline for mobile.
171+
if (newMediaEl.tagName === 'VIDEO') {
172+
newMediaEl.setAttribute('playsinline', '');
173+
newMediaEl.setAttribute('webkit-playsinline', '');
174+
}
175+
176+
if (newMediaEl !== mediaEl) {
177+
mediaEl.parentNode.appendChild(newMediaEl);
178+
mediaEl.parentNode.removeChild(mediaEl);
179+
}
180+
return newMediaEl;
181+
}
182+
162183
/**
163184
* Automatically set `crossorigin` if not defined on the media element.
164185
* If it is not defined, we must create and re-append a new media element <img> and
@@ -188,8 +209,6 @@ function setCrossOrigin (mediaEl) {
188209
'A-Frame will re-request the asset with `crossorigin` attribute set.', src);
189210
mediaEl.crossOrigin = 'anonymous';
190211
newMediaEl = mediaEl.cloneNode(true);
191-
mediaEl.parentNode.appendChild(newMediaEl);
192-
mediaEl.parentNode.removeChild(mediaEl);
193212
return newMediaEl;
194213
}
195214

‎tests/core/a-assets.test.js‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ suite('a-assets', function () {
104104
document.body.appendChild(scene);
105105
});
106106

107-
suite('crossorigin', function () {
107+
suite('fixUpMediaElement', function () {
108108
test('recreates media elements with crossorigin if necessary', function (done) {
109109
var el = this.el;
110110
var scene = this.scene;
@@ -181,6 +181,19 @@ suite('a-assets', function () {
181181

182182
document.body.appendChild(scene);
183183
});
184+
185+
test('sets playsinline', function () {
186+
var el = this.el;
187+
var scene = this.scene;
188+
var video = document.createElement('video');
189+
190+
video.setAttribute('id', 'test');
191+
video.setAttribute('src', 'dummy.mp4');
192+
el.appendChild(video);
193+
document.body.appendChild(scene);
194+
assert.ok(video.hasAttribute('webkit-playsinline'));
195+
assert.ok(video.hasAttribute('playsinline'));
196+
});
184197
});
185198
});
186199

0 commit comments

Comments
 (0)