Skip to content

Commit ed726c7

Browse files
authored
Docs Integration Examples : add Events UI page for Video Module (#9934)
* adds UI for events * improves visuals * removes duplicate event * adds title * fixes scoping var bug * adds videojs page
1 parent 425cc56 commit ed726c7

File tree

4 files changed

+1000
-0
lines changed

4 files changed

+1000
-0
lines changed
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
html {
2+
width: 100%;
3+
}
4+
body {
5+
background: #ccc;
6+
margin: 20px 5px;
7+
font: 42px/60px Helvetica, Arial, sans-serif;
8+
min-width: 320px;
9+
max-width: 1920px;
10+
}
11+
#player:first-child {
12+
width: 100%;
13+
}
14+
15+
#player {
16+
margin: auto;
17+
background: rgba(0, 0, 20, 0.8);
18+
}
19+
#eventsLog.group-player-disabled .group-player,
20+
#eventsLog.group-media-disabled .group-media,
21+
#eventsLog.group-ads-disabled .group-ads,
22+
#eventsLog.group-auction-disabled .group-auction,
23+
#eventsLog.group-adRequest-disabled .group-adRequest,
24+
#eventsLog.group-adBreak-disabled .group-adBreak,
25+
#eventsLog.group-related-disabled .group-related,
26+
#eventsLog.group-ping-disabled .group-ping,
27+
#eventsLog.group-unknown-disabled .group-unknown,
28+
#eventsLog.group-quickPeek-disabled .group-quickPeek,
29+
#eventsLog.group-provider-disabled .group-provider,
30+
#eventsLog.group-video-disabled .group-video {
31+
display: none;
32+
}
33+
.input-field {
34+
padding: 0 0.25em;
35+
margin: 0 0 0 4px;
36+
border: 0;
37+
background-color: #232323;
38+
color: #F8F8F8;
39+
}
40+
.input-field:invalid {
41+
text-decoration: underline;
42+
text-decoration-color: red;
43+
}
44+
#eventsLog .sequence > .pre.filter-not-matched {
45+
display: none;
46+
opacity: 0.2;
47+
}
48+
a.button {
49+
-webkit-appearance: button;
50+
cursor: pointer;
51+
margin: 2px;
52+
background: #ccc;
53+
border-color: rgb(216, 216, 216) rgb(209, 209, 209) rgb(186, 186, 186);
54+
border-style: solid;
55+
border-width: 1px;
56+
padding: 1px 7px 2px;
57+
color: inherit;
58+
text-decoration: inherit;
59+
user-select: none;
60+
}
61+
.right {
62+
float: right;
63+
}
64+
.disabled {
65+
opacity: 0.5;
66+
}
67+
.nav.disabled {
68+
user-select: none;
69+
cursor: default;
70+
}
71+
.block {
72+
margin: 5px;
73+
background-color: #eee;
74+
}
75+
div.mode-player {
76+
background: #acc;
77+
}
78+
div.mode-ads {
79+
background: #fea;
80+
}
81+
div.sequence {
82+
display: block;
83+
}
84+
.group-player {
85+
background: #acc;
86+
}
87+
.group-media {
88+
background: #fa6;
89+
}
90+
.group-ads {
91+
background: #fcc;
92+
}
93+
.group-auction {
94+
background: #228;
95+
color: #eee;
96+
}
97+
pre {
98+
margin: 0;
99+
}
100+
div.toggle-block pre {
101+
margin: 1px 3px;
102+
}
103+
.events-block {
104+
min-height: 1440px;
105+
}
106+
.events-block .pre,
107+
.toggle-block pre {
108+
display: inline-block;
109+
padding: 0 5px;
110+
margin: 1px 3px 1px 20px;
111+
border-radius: 5px;
112+
font-family: monospace;
113+
white-space: pre;
114+
}
115+
.pre.group-ads,
116+
.pre.group-media,
117+
.pre.group-player,
118+
.pre.group-auction,
119+
.pre.event-ready {
120+
display: inline-block;
121+
padding: 0 5px;
122+
margin: 1px 3px 1px 20px;
123+
border-radius: 5px;
124+
font-family: monospace;
125+
white-space: pre;
126+
}
127+
128+
.list-events.events-block .pre.group-player,
129+
.list-events.events-block .pre.group-media,
130+
.list-events.events-block .pre.group-ads,
131+
.list-events.events-block .pre.group-auction {
132+
display: block;
133+
margin: 0;
134+
padding: 1px 10px;
135+
border-radius: 0;
136+
}
137+
138+
.pre.event-playlistItem {
139+
margin: 1px 3px 1px 10px;
140+
}
141+
.pre.event-adBreakStart,
142+
.pre.event-adBreakEnd {
143+
margin: 1px 3px 1px 20px;
144+
}
145+
.pre.event-adBreakStart,
146+
.pre.event-ready,
147+
.pre.event-adImpression,
148+
.pre.event-adError,
149+
.pre.event-adWarning {
150+
font-weight: 800;
151+
}
152+
.pre pre {
153+
display: inline;
154+
margin: 0 0 0 20px;
155+
}
156+
.toggle {
157+
cursor: pointer;
158+
user-select: none;
159+
}
160+
button,
161+
input,
162+
optgroup,
163+
select,
164+
textarea {
165+
color: inherit;
166+
font: inherit;
167+
}
168+
button {
169+
overflow: visible;
170+
padding: 1px 7px 2px;
171+
}
172+
button,
173+
select {
174+
text-transform: none;
175+
}
176+
button,
177+
html input[type="button"],
178+
input[type="reset"],
179+
input[type="submit"] {
180+
-webkit-appearance: button;
181+
cursor: pointer;
182+
margin: 2px;
183+
}
184+
button[disabled],
185+
html input[disabled] {
186+
cursor: default;
187+
}
188+
button::-moz-focus-inner,
189+
input::-moz-focus-inner {
190+
border: 0;
191+
padding: 0;
192+
}
193+
label {
194+
display: inline-block;
195+
max-width: 100%;
196+
margin-bottom: 5px;
197+
font-weight: bold;
198+
}
199+
200+
@media only screen and (min-device-width : 320px) and (max-device-width : 768px) {
201+
body {
202+
font-size: 2vw;
203+
line-height: 3vw;
204+
}
205+
}
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
"use strict";
2+
3+
let sequenceCount = 0;
4+
const eventLogGroups = {};
5+
const Uint8Array = window.Uint8Array;
6+
const TimeRanges = window.TimeRanges;
7+
8+
function stringify(value, replacer, space) {
9+
try {
10+
return truncate(JSON.stringify(value, replacer || stringifyReplacer(value), space), 100000);
11+
} catch (error) {
12+
return `[${error}]`;
13+
}
14+
}
15+
16+
function truncate(str, length) {
17+
return (str && str.length) > length ? (str.substr(0, length) +
18+
'\n... Event truncated due to length (see console for complete output)') : str;
19+
}
20+
21+
function stringifyReplacer(parentValue) {
22+
const references = [];
23+
const safeResults = [];
24+
let complexity = 0;
25+
return function stringifyKeyValue(key, value) {
26+
if (typeof value === 'object') {
27+
if (value === null || value instanceof Date || value instanceof RegExp) {
28+
return value;
29+
}
30+
if (!!Uint8Array && value instanceof Uint8Array) {
31+
// Stub values of Arrays with more than 1000 items
32+
let str = ('' + value);
33+
str = (str.length > 40 ? (str.substr(0, 40) + '...(see console)') : str);
34+
return `Uint8Array(${value.length}) [${str}]`;
35+
}
36+
if (!!TimeRanges && value instanceof TimeRanges) {
37+
const ranges = [];
38+
for (let i = 0; i < value.length; i++) {
39+
ranges[i] = `start(${i}) = ${value.start(i)} end(${i}) = ${value.end(i)}`;
40+
}
41+
return `TimeRanges(${value.length}) [${ranges}]`;
42+
}
43+
if (value === parentValue && complexity > 0) {
44+
return '<parent object>';
45+
}
46+
const referenceIndex = references.indexOf(value);
47+
if (referenceIndex !== -1) {
48+
// Duplicate reference found
49+
const safe = safeResults[referenceIndex];
50+
if (safe) {
51+
return safe;
52+
}
53+
try {
54+
// Test for circular references
55+
JSON.stringify(value);
56+
} catch (error) {
57+
return (safeResults[referenceIndex] = '<' + value + '...(see console)>');
58+
}
59+
safeResults[referenceIndex] = value;
60+
}
61+
if (complexity++ > 10000) {
62+
return '<complexity exceeded>';
63+
}
64+
references.push(value);
65+
return value;
66+
}
67+
if (typeof value === 'function') {
68+
return `${value}`;
69+
}
70+
return value;
71+
};
72+
}
73+
74+
function createEventSequenceElement(eventGroup) {
75+
const element = document.createElement('div');
76+
element.classList.add('sequence', `mode-${eventGroup}`);
77+
element.setAttribute('data-sequence', `${sequenceCount++}`);
78+
return element;
79+
}
80+
81+
function appendSequenceElement(container, element) {
82+
container.appendChild(element);
83+
}
84+
85+
function textContentGrouped(inEvent, group) {
86+
if (group) {
87+
return `${inEvent} (${group[inEvent]})`;
88+
}
89+
return inEvent;
90+
}
91+
92+
function appendEvent(container, currentEventType, currentEventGroup, data) {
93+
const div = document.createElement('div');
94+
div.classList.add('group-' + currentEventGroup, 'event-' + currentEventType, 'pre');
95+
div.textContent = textContentGrouped(currentEventType);
96+
div.setAttribute('title', `${currentEventGroup} event "${currentEventType}"`);
97+
div.setAttribute('tabindex', '0');
98+
const theData = Object.assign({}, data);
99+
div.onclick = div.onkeyup = function(e) {
100+
if (e && e.keyCode && e.keyCode !== 13) {
101+
return;
102+
}
103+
104+
console.log(theData);
105+
div.textContent = ((div.expanded = !div.expanded)) ?
106+
textContentExpanded(currentEventType, [theData]) : textContentGrouped(currentEventType);
107+
if (e) {
108+
e.preventDefault();
109+
}
110+
return [theData];
111+
};
112+
container.appendChild(div);
113+
return div;
114+
}
115+
116+
function textContentExpanded(inEvent, allData) {
117+
return `${inEvent} (${allData.map((item, i) =>
118+
(allData.length > 1 ? `[${i}] = ` : '') + stringify(item, null, 4)).join('\n')})`;
119+
}
120+
121+
function incrementEvent(group, currentEventType, currentEventGroup, div, datum) {
122+
group[currentEventType]++;
123+
div.textContent = textContentGrouped(currentEventType, group);
124+
const logPreviousEvents = div.onclick;
125+
const scopedDatum = Object.assign({}, datum);
126+
div.onclick = div.onkeyup = function(e) {
127+
if (e && e.keyCode && e.keyCode !== 13) {
128+
return;
129+
}
130+
131+
const allData = logPreviousEvents();
132+
allData.push(scopedDatum);
133+
console.log(scopedDatum);
134+
div.textContent = (div.expanded) ? textContentExpanded(currentEventType, allData) : textContentGrouped(currentEventType, group);
135+
if (e) {
136+
e.preventDefault();
137+
}
138+
return allData;
139+
};
140+
}
141+
142+
function getGenericEventHandler() {
143+
const logContainer = document.querySelector('#eventsLog');
144+
let currentEventGroup = '';
145+
let currentEventType = '';
146+
let lastEvent = '';
147+
let lastGroup;
148+
const genericEventHandler = function(e, type, eventGroup) {
149+
currentEventGroup = eventGroup;
150+
currentEventType = type;
151+
152+
let group = eventLogGroups[eventGroup];
153+
if (!group || group !== lastGroup) {
154+
const beforeReadyElement = createEventSequenceElement(currentEventGroup);
155+
appendSequenceElement(logContainer, beforeReadyElement);
156+
group = eventLogGroups[currentEventGroup] = {
157+
eventGroup: currentEventGroup,
158+
event: currentEventType,
159+
container: logContainer,
160+
eventElement: beforeReadyElement
161+
};
162+
lastGroup = lastGroup || group;
163+
}
164+
if (lastEvent === currentEventType && !(/^(?:meta|hlsBufferAppend)/).test(currentEventType)) {
165+
incrementEvent(group, currentEventType, currentEventGroup, group.pre, e);
166+
} else {
167+
const eventElement = createEventSequenceElement(currentEventGroup);
168+
group[currentEventType] = 1;
169+
group.eventElement = eventElement;
170+
group.lastEventGroup = currentEventGroup;
171+
group.pre = appendEvent(eventElement, currentEventType, currentEventGroup, e);
172+
appendSequenceElement(group.container, eventElement);
173+
}
174+
lastEvent = currentEventType;
175+
lastGroup = group;
176+
};
177+
178+
return genericEventHandler;
179+
}
180+
181+
window.getGenericEventHandler = getGenericEventHandler;

0 commit comments

Comments
 (0)