[Modern Media Controls] Turn media/modern-media-controls/ios-inline-media-controls...
[WebKit-https.git] / LayoutTests / media / trackmenu-test.js
1 var captionsButtonCoordinates = null;
2
3 function clickCCButton()
4 {
5     if (!video || (video.nodeName != "VIDEO" && video.nodeName != "AUDIO")) {
6         consoleWrite(`<br>*** ERROR: 'video' global = "${video} in clickCCButton`);
7         endTest();
8     }
9
10     if (!captionsButtonCoordinates) {
11         try {
12             captionsButtonCoordinates = mediaControlsButtonCoordinates(video, "toggle-closed-captions-button");
13         } catch (exception) {
14             failTest(`clickCCButton failed with exception: "${exception.description}:`);
15             return;
16         }
17     }
18
19     eventSender.mouseMoveTo(captionsButtonCoordinates[0], captionsButtonCoordinates[1]);
20     eventSender.mouseDown();
21     eventSender.mouseUp();
22 }
23
24 function startTrackMenuTest(testFunction)
25 {
26     internals.suspendAnimations();
27
28     if (window.eventSender) {
29         consoleWrite("<br>*** Set the user language preference.");
30         run("internals.setUserPreferredLanguages(['en'])");
31
32         clickCCButton();
33         window.setTimeout(testFunction, 100);
34     }
35 }
36
37 function getTrackListElement()
38 {
39   var trackListElement;
40   try {
41       trackListElement = mediaControlsElement(internals.shadowRoot(video).firstChild, "-webkit-media-controls-closed-captions-container");
42   } catch (exception) {
43       failTest(exception.description);
44       return null;
45   }
46
47   return trackListElement;
48 }
49
50 function trackMenuListByLabel(label)
51 {
52     trackListElement = getTrackListElement();
53     if (!trackListElement){
54         failTest("Could not find the track list menu");
55         return;
56     }
57
58     var trackLists = trackListElement.querySelectorAll("ul");
59     var trackList = Array.prototype.find.call(trackLists, function(item) {
60         return item.getAttribute('aria-labelledby') === label;
61     });
62
63
64     // Track list should have a <ul> with <li> children.
65     if (!trackList) {
66         failTest("Could not find a child ul element in track list menu");
67         return;
68     }
69     var trackListItems = trackList.querySelectorAll("li");
70     if (!trackListItems) {
71         failTest("Could not find child li elements in track list menu");
72         return;
73     }
74
75     return trackListItems;
76 }
77
78 function captionTrackMenuList()
79 {
80     return trackMenuListByLabel('webkitMediaControlsClosedCaptionsHeading');
81 }
82
83 function audioTrackMenuList()
84 {
85     return trackMenuListByLabel('webkitMediaControlsAudioTrackHeading');
86 }
87
88 function indexOfMenuItemBeginningWith(title, trackMenuItems)
89 {
90     for (i = 0; i < trackMenuItems.length; ++i) {
91         if (trackMenuItems[i].textContent.indexOf(title) == 0)
92             break;
93     }
94     return (i < trackMenuItems.length) ? i : -1;
95 }
96
97 function indexOfCaptionMenuItemBeginningWith(title)
98 {
99     return indexOfMenuItemBeginningWith(title, captionTrackMenuList());
100 }
101
102 function indexOfAudioTrackMenuItemBeginningWith(title)
103 {
104     return indexOfMenuItemBeginningWith(title, audioTrackMenuList());
105 }
106
107 function selectMenuItemFromList(title, trackMenuItems, index)
108 {
109     consoleWrite("- click on '" + title + "' menu item.");
110     var selectedTrackItem = trackMenuItems[index];
111     var boundingRect = selectedTrackItem.getBoundingClientRect();
112     var x = boundingRect.left + boundingRect.width / 2;
113     var y = boundingRect.top + boundingRect.height / 2;
114     eventSender.mouseMoveTo(x, y);
115     eventSender.mouseDown();
116     eventSender.mouseUp();
117 }
118
119 function selectCaptionMenuItem(title)
120 {
121     var index = indexOfCaptionMenuItemBeginningWith(title);
122     if (index < 0) {
123         failTest("Menu item " + title + " not found in track list menu.");
124         return;
125     }
126
127     selectMenuItemFromList(title, captionTrackMenuList(), index);
128 }
129
130 function selectAudioTrackMenuItem(title)
131 {
132     var index = indexOfAudioTrackMenuItemBeginningWith(title);
133     if (index < 0) {
134         failTest("Menu item " + title + " not found in track list menu.");
135         return;
136     }
137
138     selectMenuItemFromList(title, audioTrackMenuList(), index);
139 }
140
141 function showTrackMenu()
142 {
143     clickCCButton();
144 }
145
146 function hideTrackMenu()
147 {
148     if (!window.eventSender)
149         return;
150
151     eventSender.mouseMoveTo(1, 1);
152     eventSender.mouseDown();
153     eventSender.mouseUp();
154 }
155
156 function listTrackMenu()
157 {
158     var trackListItems = captionTrackMenuList();
159     consoleWrite("Track menu:");
160     for (i = 0; i < trackListItems.length; i++) {
161         var logString = i + ": \"" + trackListItems[i].textContent + "\"";
162         if (trackListItems[i].className == "selected")
163             logString += ", checked";
164         consoleWrite(logString);
165     }
166 }