diff --git a/src/data/surrogates.js b/src/data/surrogates.js index 80e22f9265..5588bdf23c 100644 --- a/src/data/surrogates.js +++ b/src/data/surrogates.js @@ -131,6 +131,13 @@ const hostnames = { ], widgetName: "Google reCAPTCHA" }, + 'embed.twitch.tv': { + match: MATCH_PREFIX, + tokens: [ + '/embed/v1.js' + ], + widgetName: "Twitch Player" + }, 'platform.twitter.com': { match: MATCH_PREFIX, tokens: [ @@ -207,6 +214,8 @@ const surrogates = { '/omweb-v1.js': 'noop.js', + '/embed/v1.js': 'twitch.js', + 'noopjs': 'noop.js' }; diff --git a/src/data/web_accessible_resources/twitch.js b/src/data/web_accessible_resources/twitch.js new file mode 100644 index 0000000000..68e88a414a --- /dev/null +++ b/src/data/web_accessible_resources/twitch.js @@ -0,0 +1,20 @@ +(function () { + // https://dev.twitch.tv/docs/embed/everything/ + class Embed { + constructor(id, conf) { + let detail = { + type: "widgetFromSurrogate", + name: "Twitch Player", + widgetData: { + domId: id, + videoId: conf.channel + } + }; + document.dispatchEvent(new CustomEvent("pbSurrogateMessage", { detail })); + } + } + + window.Twitch = { + Embed + }; +}()); diff --git a/src/js/webrequest.js b/src/js/webrequest.js index cc0e64d17c..18e8492912 100644 --- a/src/js/webrequest.js +++ b/src/js/webrequest.js @@ -1116,6 +1116,35 @@ function getSurrogateWidget(name, data, frame_url) { return widget; } + if (name == "Twitch Player") { + if (!data || !data.domId || !data.videoId) { + return false; + } + + let video_id = data.videoId, + dom_id = data.domId; + + if (!OK.test(video_id) || !OK.test(dom_id)) { + return false; + } + + let widget = { + name, + buttonSelectors: ["#" + dom_id], + scriptSelectors: [ + `script[src^='${CSS.escape("https://embed.twitch.tv/embed/v1.js")}']` + ], + replacementButton: { + "unblockDomains": ["twitch.tv", "*.twitch.tv"], + "type": 4 + }, + directLinkUrl: `https://www.twitch.tv/${video_id}`, + reloadOnActivation: true + }; + + return widget; + } + return false; }