Changeset 209108 in webkit
- Timestamp:
- Nov 29, 2016 6:26:04 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 11 added
- 18 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r209100 r209108 1 2016-11-29 Antoine Quint <graouts@apple.com> 2 3 [Modern Media Controls] Only show controls when the controls attribute is set 4 https://bugs.webkit.org/show_bug.cgi?id=165175 5 6 We add new tests to check that the media's "control" attribute is respected. We also update a 7 series of tests to be more robust and turn the media "controls" attribute on so that the controls 8 bar is displayed as required by the tests. 9 10 Reviewed by Dean Jackson. 11 12 * media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-off-audio-expected.txt: Added. 13 * media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-off-audio.html: Added. 14 * media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-off-expected.txt: Added. 15 * media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-off.html: Added. 16 * media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-on-audio-expected.txt: Added. 17 * media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-on-audio.html: Added. 18 * media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-on-expected.txt: Added. 19 * media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-on.html: Added. 20 * media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-toggle-expected.txt: Added. 21 * media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-toggle.html: Added. 22 * media/modern-media-controls/fullscreen-support/fullscreen-support-click.html: 23 * media/modern-media-controls/media-controls/media-controls-constructor-expected.txt: 24 * media/modern-media-controls/media-controls/media-controls-constructor.html: 25 * media/modern-media-controls/pip-support/pip-support-click.html: 26 * media/modern-media-controls/placard-support/placard-support-airplay.html: 27 * media/modern-media-controls/scrubber-support/scrubber-support-click-expected.txt: 28 * media/modern-media-controls/scrubber-support/scrubber-support-click.html: 29 * media/modern-media-controls/scrubber-support/scrubber-support-drag-expected.txt: 30 * media/modern-media-controls/scrubber-support/scrubber-support-drag.html: 31 * media/modern-media-controls/volume-support/volume-support-click.html: 32 * media/modern-media-controls/volume-support/volume-support-drag.html: 33 1 34 2016-11-29 Ryan Haddad <ryanhaddad@apple.com> 2 35 -
trunk/LayoutTests/media/modern-media-controls/fullscreen-support/fullscreen-support-click.html
r208274 r209108 16 16 17 17 </style> 18 <video src="../../content/test.mp4" autoplay></video>18 <video src="../../content/test.mp4" controls autoplay></video> 19 19 <div id="host"></div> 20 20 <script type="text/javascript"> -
trunk/LayoutTests/media/modern-media-controls/media-controls/media-controls-constructor-expected.txt
r208456 r209108 23 23 PASS mediaControls.pipPlacard instanceof PiPPlacard is true 24 24 25 PASS mediaControls.controlsBar instanceof LayoutItemis true25 PASS mediaControls.controlsBar instanceof ControlsBar is true 26 26 PASS mediaControls.controlsBar.element.localName is "div" 27 27 PASS mediaControls.controlsBar.element.className is "controls-bar" -
trunk/LayoutTests/media/modern-media-controls/media-controls/media-controls-constructor.html
r208456 r209108 30 30 31 31 debug(""); 32 shouldBeTrue("mediaControls.controlsBar instanceof LayoutItem");32 shouldBeTrue("mediaControls.controlsBar instanceof ControlsBar"); 33 33 shouldBeEqualToString("mediaControls.controlsBar.element.localName", "div"); 34 34 shouldBeEqualToString("mediaControls.controlsBar.element.className", "controls-bar"); -
trunk/LayoutTests/media/modern-media-controls/pip-support/pip-support-click.html
r208271 r209108 16 16 17 17 </style> 18 <video src="../../content/test.mp4" autoplay ></video>18 <video src="../../content/test.mp4" autoplay controls></video> 19 19 <div id="host"></div> 20 20 <script type="text/javascript"> -
trunk/LayoutTests/media/modern-media-controls/placard-support/placard-support-airplay.html
r208242 r209108 16 16 17 17 </style> 18 <video src="../../content/test.mp4" autoplay></video>18 <video src="../../content/test.mp4" controls autoplay></video> 19 19 <div id="host"></div> 20 20 <script type="text/javascript"> -
trunk/LayoutTests/media/modern-media-controls/scrubber-support/scrubber-support-click-expected.txt
r208042 r209108 4 4 5 5 6 PASS media.currentTime is 3.18726 PASS media.currentTime is within 0.2 of 3.1872 7 7 PASS successfullyParsed is true 8 8 -
trunk/LayoutTests/media/modern-media-controls/scrubber-support/scrubber-support-click.html
r208226 r209108 16 16 17 17 </style> 18 <video src="../../content/test.mp4" ></video>18 <video src="../../content/test.mp4" controls autoplay></video> 19 19 <div id="host"></div> 20 20 <script type="text/javascript"> … … 30 30 mediaController.controls.showsStartButton = false; 31 31 32 media.addEventListener("canplaythrough", () => { 32 scheduler.frameDidFire = function() { 33 if (media.paused) 34 return; 35 36 media.pause(); 33 37 34 38 media.addEventListener("timeupdate", () => { 35 shouldBe ("media.currentTime", "3.1872");39 shouldBeCloseTo("media.currentTime", 3.1872, 0.2); 36 40 container.remove(); 37 41 media.remove(); … … 47 51 eventSender.mouseDown(); 48 52 eventSender.mouseUp(); 49 } );53 }; 50 54 51 55 </script> -
trunk/LayoutTests/media/modern-media-controls/scrubber-support/scrubber-support-drag-expected.txt
r208042 r209108 4 4 5 5 6 PASS media.currentTime is media.duration / 26 PASS media.currentTime is within 0.01 of 3.0136 7 7 PASS media.currentTime is 0 8 8 PASS successfullyParsed is true -
trunk/LayoutTests/media/modern-media-controls/scrubber-support/scrubber-support-drag.html
r208226 r209108 16 16 17 17 </style> 18 <video src="../../content/test.mp4" autoplay ></video>18 <video src="../../content/test.mp4" autoplay controls></video> 19 19 <div id="host"></div> 20 20 <script type="text/javascript"> … … 29 29 30 30 let numberOfEvents = 0; 31 media.addEventListener("play", () => { 31 scheduler.frameDidFire = function() { 32 if (media.paused) 33 return; 34 32 35 media.pause(); 33 36 34 37 const input = mediaController.controls.timeControl.scrubber.children[1].element; 35 38 const bounds = input.getBoundingClientRect(); 39 40 if (bounds.width === 0) 41 return; 42 36 43 const minX = bounds.left; 37 44 const dragStartX = bounds.left + bounds.width / 2; … … 43 50 44 51 if (numberOfEvents == 1) { 45 shouldBe ("media.currentTime", "media.duration / 2");52 shouldBeCloseTo("media.currentTime", media.duration / 2, 0.01); 46 53 const delta = dragEndX - dragStartX; 47 54 const iterations = Math.abs(delta); … … 62 69 eventSender.mouseMoveTo(dragStartX, centerY); 63 70 eventSender.mouseDown(); 64 } );71 }; 65 72 66 73 </script> -
trunk/LayoutTests/media/modern-media-controls/volume-support/volume-support-click.html
r208226 r209108 16 16 17 17 </style> 18 <video src="../../content/test.mp4" ></video>18 <video src="../../content/test.mp4" controls autoplay></video> 19 19 <div id="host"></div> 20 20 <script type="text/javascript"> … … 30 30 let numberOfFrames = 0; 31 31 scheduler.frameDidFire = function() { 32 if (media.paused) 33 return; 34 32 35 numberOfFrames++; 33 36 -
trunk/LayoutTests/media/modern-media-controls/volume-support/volume-support-drag.html
r208226 r209108 16 16 17 17 </style> 18 <video src="../../content/test.mp4" muted ></video>18 <video src="../../content/test.mp4" muted autoplay controls></video> 19 19 <div id="host"></div> 20 20 <script type="text/javascript"> … … 33 33 let numberOfFrames = 0; 34 34 scheduler.frameDidFire = function() { 35 if (media.paused) 36 return; 37 35 38 numberOfFrames++; 36 39 -
trunk/Source/WebCore/ChangeLog
r209104 r209108 1 2016-11-29 Antoine Quint <graouts@apple.com> 2 3 [Modern Media Controls] Only show controls when the controls attribute is set 4 https://bugs.webkit.org/show_bug.cgi?id=165175 5 6 We now respect the value of the media's "controls" attribute so that the start button and the controls 7 bar are only shown when that attribute is set to "true". 8 9 Reviewed by Dean Jackson. 10 11 Tests: media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-off-audio.html 12 media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-off.html 13 media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-on-audio.html 14 media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-on.html 15 media/modern-media-controls/controls-visibility-support/controls-visibility-support-controls-toggle.html 16 17 * Modules/modern-media-controls/controls/controls-bar.js: Added. 18 (ControlsBar): 19 * Modules/modern-media-controls/controls/media-controls.js: 20 (MediaControls.): Deleted. 21 * Modules/modern-media-controls/js-files: 22 * Modules/modern-media-controls/media/controls-visibility-support.js: Added. 23 (ControlsVisibilitySupport): 24 (ControlsVisibilitySupport.prototype.destroy): 25 (ControlsVisibilitySupport.prototype.get mediaEvents): 26 (ControlsVisibilitySupport.prototype.syncControl): 27 * Modules/modern-media-controls/media/media-controller-support.js: 28 (MediaControllerSupport): 29 (MediaControllerSupport.prototype.handleEvent): 30 * Modules/modern-media-controls/media/media-controller.js: 31 (MediaController.prototype._updateControlsIfNeeded): 32 * WebCore.xcodeproj/project.pbxproj: 33 1 34 2016-11-29 Brady Eidson <beidson@apple.com> 2 35 -
trunk/Source/WebCore/Modules/modern-media-controls/controls/controls-bar.js
r209104 r209108 24 24 */ 25 25 26 class MediaControllerSupport26 class ControlsBar extends LayoutNode 27 27 { 28 28 29 constructor( mediaController)29 constructor() 30 30 { 31 this.mediaController = mediaController; 32 33 for (let eventType of this.mediaEvents) 34 mediaController.media.addEventListener(eventType, this); 35 36 if (!this.control) 37 return; 38 39 this.control.uiDelegate = this; 40 41 this.syncControl(); 31 super(`<div class="controls-bar">`); 42 32 } 43 33 44 // Public45 46 destroy()47 {48 const media = this.mediaController.media;49 for (let eventType of this.mediaEvents)50 media.removeEventListener(eventType, this);51 52 if (this.control)53 this.control.uiDelegate = null;54 }55 56 // Protected57 58 get control()59 {60 // Implemented by subclasses.61 }62 63 get mediaEvents()64 {65 // Implemented by subclasses.66 return [];67 }68 69 buttonWasClicked(control)70 {71 // Implemented by subclasses.72 }73 74 handleEvent(event)75 {76 // Implemented by subclasses.77 if (this.control)78 this.syncControl();79 }80 81 syncControl()82 {83 // Implemented by subclasses.84 }85 34 } -
trunk/Source/WebCore/Modules/modern-media-controls/controls/media-controls.js
r208456 r209108 46 46 this.timeControl = new TimeControl(this); 47 47 48 this.controlsBar = new LayoutItem({ 49 element: `<div class="controls-bar">`, 50 layoutDelegate: this 51 }); 48 this.controlsBar = new ControlsBar; 52 49 53 50 this.airplayPlacard = new AirplayPlacard(this); -
trunk/Source/WebCore/Modules/modern-media-controls/js-files
r208585 r209108 23 23 controls/buttons-container.js 24 24 controls/status-label.js 25 controls/controls-bar.js 25 26 controls/media-controls.js 26 27 controls/ios-inline-media-controls.js … … 33 34 media/media-controller-support.js 34 35 media/airplay-support.js 36 media/controls-visibility-support.js 35 37 media/elapsed-time-support.js 36 38 media/fullscreen-support.js -
trunk/Source/WebCore/Modules/modern-media-controls/media/controls-visibility-support.js
r209104 r209108 24 24 */ 25 25 26 class MediaControllerSupport26 class ControlsVisibilitySupport extends MediaControllerSupport 27 27 { 28 28 29 29 constructor(mediaController) 30 30 { 31 this.mediaController = mediaController;31 super(mediaController); 32 32 33 for (let eventType of this.mediaEvents) 34 mediaController.media.addEventListener(eventType, this); 35 36 if (!this.control) 37 return; 38 39 this.control.uiDelegate = this; 40 41 this.syncControl(); 42 } 43 44 // Public 45 46 destroy() 47 { 48 const media = this.mediaController.media; 49 for (let eventType of this.mediaEvents) 50 media.removeEventListener(eventType, this); 51 52 if (this.control) 53 this.control.uiDelegate = null; 33 this._controlsAttributeObserver = new MutationObserver(this.syncControl.bind(this)); 34 this._controlsAttributeObserver.observe(mediaController.media, { attributes: true, attributeFilter: ["controls"] }); 54 35 } 55 36 56 37 // Protected 57 38 58 get control()39 destroy() 59 40 { 60 // Implemented by subclasses.41 this._controlsAttributeObserver.disconnect(); 61 42 } 62 43 63 44 get mediaEvents() 64 45 { 65 // Implemented by subclasses. 66 return []; 67 } 68 69 buttonWasClicked(control) 70 { 71 // Implemented by subclasses. 72 } 73 74 handleEvent(event) 75 { 76 // Implemented by subclasses. 77 if (this.control) 78 this.syncControl(); 46 return ["loadedmetadata"]; 79 47 } 80 48 81 49 syncControl() 82 50 { 83 // Implemented by subclasses. 51 let shouldShowControls = this.mediaController.media.controls; 52 if (media instanceof HTMLVideoElement) 53 shouldShowControls = shouldShowControls && this.mediaController.media.readyState > HTMLMediaElement.HAVE_NOTHING; 54 55 this.mediaController.controls.startButton.visible = shouldShowControls; 56 this.mediaController.controls.controlsBar.visible = shouldShowControls; 84 57 } 58 85 59 } -
trunk/Source/WebCore/Modules/modern-media-controls/media/media-controller-support.js
r208537 r209108 34 34 mediaController.media.addEventListener(eventType, this); 35 35 36 this.syncControl(); 37 36 38 if (!this.control) 37 39 return; 38 40 39 41 this.control.uiDelegate = this; 40 41 this.syncControl();42 42 } 43 43 … … 75 75 { 76 76 // Implemented by subclasses. 77 if (this.control) 78 this.syncControl(); 77 this.syncControl(); 79 78 } 80 79 -
trunk/Source/WebCore/Modules/modern-media-controls/media/media-controller.js
r208585 r209108 93 93 this._updateControlsSize(); 94 94 95 this._supportingObjects = [AirplaySupport, ElapsedTimeSupport, FullscreenSupport, MuteSupport, PiPSupport, PlacardSupport, PlaybackSupport, RemainingTimeSupport, ScrubbingSupport, SkipBackSupport, StartSupport, StatusSupport, TracksSupport, VolumeSupport].map(SupportClass => {95 this._supportingObjects = [AirplaySupport, ControlsVisibilitySupport, ElapsedTimeSupport, FullscreenSupport, MuteSupport, PiPSupport, PlacardSupport, PlaybackSupport, RemainingTimeSupport, ScrubbingSupport, SkipBackSupport, StartSupport, StatusSupport, TracksSupport, VolumeSupport].map(SupportClass => { 96 96 return new SupportClass(this); 97 97 }, this); -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r209070 r209108 10020 10020 71004B9B1DC1109300A52A38 /* remaining-time-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "remaining-time-support.js"; sourceTree = "<group>"; }; 10021 10021 71004B9D1DC1398800A52A38 /* playback-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "playback-support.js"; sourceTree = "<group>"; }; 10022 710FA74B1DEE576D004C715E /* controls-bar.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "controls-bar.js"; sourceTree = "<group>"; }; 10023 710FA74C1DEE577E004C715E /* controls-visibility-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "controls-visibility-support.js"; sourceTree = "<group>"; }; 10022 10024 7117445614BC34E200EE5FC8 /* SVGTextMetricsBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGTextMetricsBuilder.cpp; sourceTree = "<group>"; }; 10023 10025 7117445714BC34E200EE5FC8 /* SVGTextMetricsBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTextMetricsBuilder.h; sourceTree = "<group>"; }; … … 18054 18056 716FA0DE1DB26591007323CC /* buttons-container.css */, 18055 18057 716FA0DF1DB26591007323CC /* buttons-container.js */, 18058 710FA74B1DEE576D004C715E /* controls-bar.js */, 18056 18059 716FA0E01DB26591007323CC /* forward-button.js */, 18057 18060 716FA0E11DB26591007323CC /* fullscreen-button.js */, … … 18102 18105 children = ( 18103 18106 717F90581DC4BB600006F520 /* airplay-support.js */, 18107 710FA74C1DEE577E004C715E /* controls-visibility-support.js */, 18104 18108 71004B9A1DC1109300A52A38 /* elapsed-time-support.js */, 18105 18109 714131471DC9D6AF00336107 /* fullscreen-support.js */,
Note: See TracChangeset
for help on using the changeset viewer.