├── JSONPeep Links Fix.js
├── LICENSE.md
├── No window.open.js
├── README.md
├── ceskatelevize.cz
└── AirPlay + Picture-in-Picture.js
├── developer.apple.com
├── Night Mode docs.css
└── Night Mode docs.js
├── docs.sygictravelapi.com
├── Nice style.css
└── Omit Nice style in Apple Docs.js
├── github.com
└── styles.css
├── gitlab.com
└── Adjustments.css
├── google.com
└── No agreements.js
├── warforum.cz
└── Clickable URLs.js
└── youtube.com
└── Skip Ad Clicker.js
/JSONPeep Links Fix.js:
--------------------------------------------------------------------------------
1 |
2 | if (document.body.id == 'jsonpeep-ext-body' && document.contentType == 'application/json') {
3 |
4 | function applyFix() {
5 | var links = document.querySelectorAll('a.jsonpeep-ext-a')
6 | links.forEach(function(link) {
7 | link.outerHTML = link.innerText
8 | })
9 | var strings = links = document.querySelectorAll('span.string')
10 | strings.forEach(function(str) {
11 | var s = str.innerText.slice(1,-1)
12 | if (s.indexOf(';amp;') > 0)
13 | s = s.replaceAll(';amp;','')
14 | var reg = /(https?|ftp):\/\/(-\.)?([^\s\/?\.#-]+\.?)+(\/[^\s]*)?$/i
15 | var out = s.match(reg) ?? []
16 | if (out.length > 0 && out[0] == s) {
17 | s = '"'+ ''+ s +'"'
18 | str.outerHTML = s
19 | }
20 | })
21 | }
22 | applyFix()
23 |
24 | // Hook fix on toggling button
25 | document.querySelector('button#jsonpeep-ext-button-toggle').addEventListener('click', applyFix, false)
26 |
27 | // Hide Turn Off The Lights button if found
28 | setTimeout(function(){
29 | var totl = document.querySelector('label#stefanvdnighttheme')
30 | if (totl != null) totl.style['visibility'] = 'hidden'
31 | }, 500)
32 | }
33 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | # MIT License
2 |
3 | Copyright (c) 2020 Michal Zelinka
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/No window.open.js:
--------------------------------------------------------------------------------
1 |
2 | window.open = function() { return false; }
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Tamperish Tweaks
2 |
3 |
4 | [_Tamperish_](http://github.com/username0x0a/Tamperish) is developed to be an easy-to-use user styles & scripts injection tool. 💉 It allows you to tamper with web pages using CSS & JavaScript snippets pretty much any way possible. 👷♂️
5 |
6 | 
7 |
8 | This repository contains some examplary scripts you might want to see & potentially use for your own experience! 👍
9 |
10 | ## How to use the listed tweaks
11 |
12 | - Open the `Tampers` folder, either from the app or using Finder
13 | - Add the _Tamper_ files (either _CSS_ styles or _JavaScript_ scripts) to the corresponding folder according to the hierarchy described below: 🖍 
14 | - `www.google.com` folder will be applied on _Google Search_ page
15 | - `com` folder contents will be applied on all `com` domains
16 | - Tamper files placed directly to the `Tampers` folder will be applied everywhere
17 | - Enable the extension in _Safari_ preferences – can be done by clicking the **On/Off** button in the app
18 | - Refresh the desired web page & profit. 👍
19 |
20 | 
21 |
22 | ## Contributing
23 |
24 | I'm totally open to include your scripts and tweaks here! 🙌 Feel free to open Pull requests with amazing contributions others could also benefit from! 💪
25 |
26 | ## License
27 |
28 | I'd like to keep all of the content kept under the open MIT license so anybody can take, extend and power up our great code as much openly as possible. Please keep that in mind when considering your fantastic contribution. 🤗
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/ceskatelevize.cz/AirPlay + Picture-in-Picture.js:
--------------------------------------------------------------------------------
1 |
2 | if (!document.body.classList.contains('__tampered')) {
3 |
4 | document.body.classList.add("__tampered")
5 |
6 | function process() {
7 |
8 | console.log('[Tamperish] Video features injection')
9 |
10 | var fscBtn = document.querySelector('#fullScreenShell')
11 |
12 | if (fscBtn == undefined) {
13 | setTimeout(process, 5000)
14 | return
15 | }
16 |
17 | var airBtn = fscBtn.cloneNode(true)
18 | airBtn.id = 'airPlayShell'
19 | airBtn.innerHTML = airBtn.innerHTML.replace(/fullScreen/g,'airPlay')
20 | airBtn.querySelector('svg#airPlay').innerHTML = ''
21 | airBtn.querySelector('#smallScreen').remove()
22 | airBtn.title = airBtn.ariaLabel = 'AirPlay'
23 | airBtn.style = 'display: inline-block; margin-right: 10px;'
24 | fscBtn.parentElement.appendChild(airBtn)
25 |
26 | var pipBtn = fscBtn.cloneNode(true)
27 | pipBtn.id = 'airPlayShell'
28 | pipBtn.innerHTML = pipBtn.innerHTML.replace(/fullScreen/g,'airPlay')
29 | pipBtn.querySelector('svg#airPlay').innerHTML = ''
30 | pipBtn.querySelector('#smallScreen').remove()
31 | pipBtn.title = pipBtn.ariaLabel = 'Picture in Picture'
32 | pipBtn.style = 'display: inline-block; margin-right: 10px;'
33 | fscBtn.parentElement.appendChild(pipBtn)
34 |
35 | var video = document.querySelector('#video')
36 |
37 | if (window.WebKitPlaybackTargetAvailabilityEvent)
38 | airBtn.addEventListener('click', function() {
39 | video.webkitShowPlaybackTargetPicker()
40 | })
41 | else airBtn.disabled = true
42 |
43 |
44 | if (video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === "function") {
45 | // Toggle PiP when the user clicks the button.
46 | pipBtn.addEventListener('click', function(event) {
47 | var newMode =
48 | video.webkitPresentationMode === "picture-in-picture" ?
49 | "inline" : "picture-in-picture"
50 | video.webkitSetPresentationMode(newMode)
51 | })
52 | } else pipBtn.disabled = true
53 |
54 | }
55 |
56 | process()
57 | }
58 |
--------------------------------------------------------------------------------
/developer.apple.com/Night Mode docs.css:
--------------------------------------------------------------------------------
1 | @media (prefers-color-scheme: dark) {
2 |
3 | body.tamp_devdocs {
4 | --sbs-primary-bg-color: #272727;
5 | --sbs-secondary-bg-color: #313231;
6 | --sbs-code-bg-color: #414241;
7 | --sbs-primary-heading-color: #fcfcfc;
8 | --sbs-primary-text-color: #ddd;
9 | --sbs-secondary-text-color: #8e8e93;
10 | --sbs-primary-link-color: #66bbff;
11 | }
12 |
13 | body.tamp_devdocs {
14 | background-color: var(--sbs-primary-bg-color) !important;
15 | color: var(--sbs-primary-text-color) !important;
16 | }
17 |
18 | body.tamp_devdocs #main a {
19 | color: var(--sbs-primary-link-color) !important;
20 | }
21 |
22 | /* TOP MENU */
23 |
24 | body.tamp_devdocs #ac-globalnav {
25 | background-color: var(--sbs-primary-bg-color) !important;
26 | }
27 |
28 | body.tamp_devdocs #ac-globalnav .ac-gn-link {
29 | color: var(--sbs-primary-text-color) !important;
30 | }
31 |
32 | body.tamp_devdocs #ac-globalnav .ac-gn-link-apple-developer {
33 | background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjY5cHgiIGhlaWdodD0iNTZweCIgdmlld0JveD0iMCAwIDI2OSA1NiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNjAuMSAoODgxMzMpIC0gaHR0cHM6Ly9za2V0Y2guY29tIC0tPgogICAgPHRpdGxlPkFydGJvYXJkPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IkFydGJvYXJkIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iZGV2IiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0LjAwMDAwMCwgMTEuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTMuMDA2MDUwMSwwLjQ1MDUwMTQgQzIzLjQ3OTY4MjksMC40NTA1MDE0IDI5LjY4MDg1NDgsNi44OTU4MTI5IDI5LjY4MDg1NDgsMTguMDA0MjEyMyBDMjkuNjgwODU0OCwyOS4xMzcwMjQ4IDIzLjUwNDA5NywzNS42ODA0ODE4IDEzLjAwNjA1MDEsMzUuNjgwNDgxOCBMMC41NzkyODg1LDM1LjY4MDQ4MTggTDAuNTc5Mjg4NSwwLjQ1MDUwMTQgTDEzLjAwNjA1MDEsMC40NTA1MDE0IFogTTYuMDQ4MDM4NSwzMC45NDM2NjQ2IEwxMi40OTMzNTQ4LDMwLjk0MzY2NDYgQzE5Ljk2NDA1NzksMzAuOTQzNjY0NiAyNC4wOTAwMzQ1LDI2LjM3ODIzNDkgMjQuMDkwMDM0NSwxOC4wNTMwMzk2IEMyNC4wOTAwMzQ1LDkuNzUyMjU4NCAxOS45Mzk2NDM5LDUuMTYyNDE0NiAxMi40OTMzNTQ4LDUuMTYyNDE0NiBMNi4wNDgwMzg1LDUuMTYyNDE0NiBMNi4wNDgwMzg1LDMwLjk0MzY2NDYgTDYuMDQ4MDM4NSwzMC45NDM2NjQ2IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTU1LjYxNzg2NjUsMjguMTM2MDQ3NCBDNTQuOTA5ODU4NywzMi43OTkxMzMzIDUwLjM2ODg0MzEsMzUuOTk3ODYzOCA0NC41NTgyOTYyLDM1Ljk5Nzg2MzggQzM3LjA4NzU5MzEsMzUuOTk3ODYzOCAzMi40NDg5MjEyLDMwLjk5MjQ5MjcgMzIuNDQ4OTIxMiwyMi45NjAyNjYxIEMzMi40NDg5MjEyLDE0LjkwMzYyNTUgMzcuMTEyMDA3MSw5LjY3OTAxNjEgNDQuMzM4NTY5Niw5LjY3OTAxNjEgQzUxLjQ0MzA2MTgsOS42NzkwMTYxIDU1LjkxMDgzNTIsMTQuNTYxODI4NiA1NS45MTA4MzUyLDIyLjM0OTkxNDUgTDU1LjkxMDgzNTIsMjQuMTU2NTU1MSBMMzcuNzcxMTg2OCwyNC4xNTY1NTUxIEwzNy43NzExODY4LDI0LjQ3MzkzNzkgQzM3Ljc3MTE4NjgsMjguODY4NDY5MSA0MC41Mjk5NzU5LDMxLjc0OTMyODUgNDQuNjgwMzY2NSwzMS43NDkzMjg1IEM0Ny42MTAwNTQsMzEuNzQ5MzI4NSA0OS45MDQ5NzU5LDMwLjM1NzcyNjkgNTAuNjEyOTgzNywyOC4xMzYwNDczIEw1NS42MTc4NjY1LDI4LjEzNjA0NzMgTDU1LjYxNzg2NjUsMjguMTM2MDQ3NCBaIE0zNy43OTU2MDA5LDIwLjQ3MDAzMTcgTDUwLjYzNzM5NzgsMjAuNDcwMDMxNyBDNTAuNTE1MzI3NSwxNi41MzkzNjc2IDQ4LjAwMDY3OSwxMy45NTE0NzcgNDQuMzM4NTY5NywxMy45NTE0NzcgQzQwLjcwMDg3NDMsMTMuOTUxNDc3IDM4LjA2NDE1NTYsMTYuNTg4MTk1OCAzNy43OTU2MDA5LDIwLjQ3MDAzMTcgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iUGF0aCIgcG9pbnRzPSI3Mi4wNTc4MDc5IDM1LjY4MDQ4MSA2Ni4zOTM3NDU0IDM1LjY4MDQ4MSA1Ny4xNDA4MTU3IDkuOTk2Mzk5IDYyLjc1NjA1MDEgOS45OTYzOTkgNjkuMjAxMzYyNiAzMC41Mjg2MjU2IDY5LjI5OTAxODggMzAuNTI4NjI1NiA3NS43NDQzMjM3IDkuOTk2Mzk5IDgxLjI2MTkwMTggOS45OTYzOTkiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDUuMTYwMzM5LDI4LjEzNjA0NzQgQzEwNC40NTIzMzIsMzIuNzk5MTMzMyA5OS45MTEzMTYsMzUuOTk3ODYzOCA5NC4xMDA3NjkxLDM1Ljk5Nzg2MzggQzg2LjYzMDA2NiwzNS45OTc4NjM4IDgxLjk5MTM5NDEsMzAuOTkyNDkyNyA4MS45OTEzOTQxLDIyLjk2MDI2NjEgQzgxLjk5MTM5NDEsMTQuOTAzNjI1NSA4Ni42NTQ0OCw5LjY3OTAxNjEgOTMuODgxMDQyNSw5LjY3OTAxNjEgQzEwMC45ODU1MzUsOS42NzkwMTYxIDEwNS40NTMzMDgsMTQuNTYxODI4NiAxMDUuNDUzMzA4LDIyLjM0OTkxNDUgTDEwNS40NTMzMDgsMjQuMTU2NTU1MSBMODcuMzEzNjU5NywyNC4xNTY1NTUxIEw4Ny4zMTM2NTk3LDI0LjQ3MzkzNzkgQzg3LjMxMzY1OTcsMjguODY4NDY5MSA5MC4wNzI0NDg4LDMxLjc0OTMyODUgOTQuMjIyODM5NCwzMS43NDkzMjg1IEM5Ny4xNTI1MjY5LDMxLjc0OTMyODUgOTkuNDQ3NDQ4OCwzMC4zNTc3MjY5IDEwMC4xNTU0NTcsMjguMTM2MDQ3MyBMMTA1LjE2MDMzOSwyOC4xMzYwNDczIEwxMDUuMTYwMzM5LDI4LjEzNjA0NzQgWiBNODcuMzM4MDczNywyMC40NzAwMzE3IEwxMDAuMTc5ODcxLDIwLjQ3MDAzMTcgQzEwMC4wNTc4LDE2LjUzOTM2NzYgOTcuNTQzMTUxOCwxMy45NTE0NzcgOTMuODgxMDQyNSwxMy45NTE0NzcgQzkwLjI0MzM0NzIsMTMuOTUxNDc3IDg3LjYwNjYyODQsMTYuNTg4MTk1OCA4Ny4zMzgwNzM3LDIwLjQ3MDAzMTcgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iUGF0aCIgcG9pbnRzPSIxMDkuNzI1NzY5IDAuNDUwNTAxNCAxMTQuOTk5MjA3IDAuNDUwNTAxNCAxMTQuOTk5MjA3IDM1LjY4MDQ4MSAxMDkuNzI1NzY5IDM1LjY4MDQ4MSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTExOC44NzIyNTMsMjIuODM4MTk1OCBDMTE4Ljg3MjI1MywxNC43NTcxNDExIDEyMy42MzI5OTYsOS42NzkwMTYxIDEzMS4wNTQ4NzEsOS42NzkwMTYxIEMxMzguNTAxMTYsOS42NzkwMTYxIDE0My4yMzc0ODgsMTQuNzU3MTQxMSAxNDMuMjM3NDg4LDIyLjgzODE5NTggQzE0My4yMzc0ODgsMzAuOTQzNjY0NiAxMzguNTI1NTc0LDM1Ljk5Nzg2MzggMTMxLjA1NDg3MSwzNS45OTc4NjM4IEMxMjMuNTg0MTY4LDM1Ljk5Nzg2MzggMTE4Ljg3MjI1MywzMC45NDM2NjQ2IDExOC44NzIyNTMsMjIuODM4MTk1OCBaIE0xMzcuODY2Mzk0LDIyLjgzODE5NTggQzEzNy44NjYzOTQsMTcuMjk2MjAzNiAxMzUuMzI3MzMyLDE0LjAyNDcxOTIgMTMxLjA1NDg3MSwxNC4wMjQ3MTkyIEMxMjYuNzgyNDEsMTQuMDI0NzE5MiAxMjQuMjQzMzQ3LDE3LjMyMDYxNzYgMTI0LjI0MzM0NywyMi44MzgxOTU4IEMxMjQuMjQzMzQ3LDI4LjQwNDYwMiAxMjYuNzgyNDEsMzEuNjUxNjcyNCAxMzEuMDU0ODcxLDMxLjY1MTY3MjQgQzEzNS4zMjczMzIsMzEuNjUxNjcyNCAxMzcuODY2Mzk0LDI4LjQwNDYwMjEgMTM3Ljg2NjM5NCwyMi44MzgxOTU4IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTE3MS4wMDg5NzIsMjIuODM4MTk1OCBDMTcxLjAwODk3MiwzMC44MjE1OTQyIDE2Ni43MzY1MTEsMzUuOTQ5MDM1NiAxNjAuMjkxMTk5LDM1Ljk0OTAzNTYgQzE1Ni42MjkwODksMzUuOTQ5MDM1NiAxNTMuNzIzODE2LDM0LjMxMzI5MzQgMTUyLjIxMDE0NCwzMS40NTYzNTk4IEwxNTIuMDg4MDc0LDMxLjQ1NjM1OTggTDE1Mi4wODgwNzQsNDQuMTc2NTc0NiBMMTQ2LjgxNDYzNiw0NC4xNzY1NzQ2IEwxNDYuODE0NjM2LDkuOTk2Mzk4OSBMMTUxLjkxNzE3NSw5Ljk5NjM5ODkgTDE1MS45MTcxNzUsMTQuMjY4ODU5OCBMMTUyLjAxNDgzMiwxNC4yNjg4NTk4IEMxNTMuNDc5Njc1LDExLjUxMDA3MDcgMTU2LjYwNDY3NSw5LjcyNzg0NDIgMTYwLjE5MzU0Miw5LjcyNzg0NDIgQzE2Ni43MTIwOTcsOS43Mjc4NDQyIDE3MS4wMDg5NzIsMTQuODc5MjExNCAxNzEuMDA4OTcyLDIyLjgzODE5NTggWiBNMTY1LjU4OTA1LDIyLjgzODE5NTggQzE2NS41ODkwNSwxNy42MzgwMDA1IDE2Mi45MDM1MDMsMTQuMjIwMDMxNyAxNTguODAxOTQxLDE0LjIyMDAzMTcgQzE1NC43NzM2MjEsMTQuMjIwMDMxNyAxNTIuMDYzNjYsMTcuNzExMjQyNiAxNTIuMDYzNjYsMjIuODM4MTk1OCBDMTUyLjA2MzY2LDI4LjAxMzk3NyAxNTQuNzczNjIxLDMxLjQ4MDc3MzkgMTU4LjgwMTk0MSwzMS40ODA3NzM5IEMxNjIuOTAzNTAzLDMxLjQ4MDc3MzkgMTY1LjU4OTA1LDI4LjA4NzIxOTIgMTY1LjU4OTA1LDIyLjgzODE5NTggWiIgaWQ9IlNoYXBlIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTk2Ljg4Mjk5NiwyOC4xMzYwNDc0IEMxOTYuMTc0OTg4LDMyLjc5OTEzMzMgMTkxLjYzMzk3MiwzNS45OTc4NjM4IDE4NS44MjM0MjUsMzUuOTk3ODYzOCBDMTc4LjM1MjcyMiwzNS45OTc4NjM4IDE3My43MTQwNSwzMC45OTI0OTI3IDE3My43MTQwNSwyMi45NjAyNjYxIEMxNzMuNzE0MDUsMTQuOTAzNjI1NSAxNzguMzc3MTM2LDkuNjc5MDE2MSAxODUuNjAzNjk5LDkuNjc5MDE2MSBDMTkyLjcwODE5MSw5LjY3OTAxNjEgMTk3LjE3NTk2NCwxNC41NjE4Mjg2IDE5Ny4xNzU5NjQsMjIuMzQ5OTE0NSBMMTk3LjE3NTk2NCwyNC4xNTY1NTUxIEwxNzkuMDM2MzE2LDI0LjE1NjU1NTEgTDE3OS4wMzYzMTYsMjQuNDczOTM3OSBDMTc5LjAzNjMxNiwyOC44Njg0NjkxIDE4MS43OTUxMDUsMzEuNzQ5MzI4NSAxODUuOTQ1NDk2LDMxLjc0OTMyODUgQzE4OC44NzUxODMsMzEuNzQ5MzI4NSAxOTEuMTcwMTA1LDMwLjM1NzcyNjkgMTkxLjg3ODExMywyOC4xMzYwNDczIEwxOTYuODgyOTk2LDI4LjEzNjA0NzMgTDE5Ni44ODI5OTYsMjguMTM2MDQ3NCBaIE0xNzkuMDYwNzMsMjAuNDcwMDMxNyBMMTkxLjkwMjUyNywyMC40NzAwMzE3IEMxOTEuNzgwNDU3LDE2LjUzOTM2NzYgMTg5LjI2NTgwOCwxMy45NTE0NzcgMTg1LjYwMzY5OSwxMy45NTE0NzcgQzE4MS45NjYwMDMsMTMuOTUxNDc3IDE3OS4zMjkyODUsMTYuNTg4MTk1OCAxNzkuMDYwNzMsMjAuNDcwMDMxNyBaIiBpZD0iU2hhcGUiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMDEuMDAzMTEzLDkuOTk2Mzk4OSBMMjA2LjAzMjQxLDkuOTk2Mzk4OSBMMjA2LjAzMjQxLDE0LjM2NjUxNjEgTDIwNi4xNTQ0OCwxNC4zNjY1MTYxIEMyMDYuOTYwMTQ0LDExLjQ2MTI0MjcgMjA5LjMwMzg5NCw5LjcyNzg0NDIgMjEyLjMzMTIzOCw5LjcyNzg0NDIgQzIxMy4wODgwNzQsOS43Mjc4NDQyIDIxMy43MjI4MzksOS44MjU1MDA0IDIxNC4xMzc4NzgsOS45MjMxNTY3IEwyMTQuMTM3ODc4LDE0Ljg1NDc5NzMgQzIxMy43MjI4MzksMTQuNjgzODk4OSAyMTIuNzk1MTA1LDE0LjUzNzQxNDUgMjExLjc2OTcxNCwxNC41Mzc0MTQ1IEMyMDguMzc2MTYsMTQuNTM3NDE0NSAyMDYuMjc2NTUsMTYuODMyMzM2NCAyMDYuMjc2NTUsMjAuNDQ1NjE3NiBMMjA2LjI3NjU1LDM1LjY4MDQ4MSBMMjAxLjAwMzExMywzNS42ODA0ODEgTDIwMS4wMDMxMTMsOS45OTYzOTg5IEwyMDEuMDAzMTEzLDkuOTk2Mzk4OSBaIiBpZD0iUGF0aCI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIGlkPSJYTUxJRF81XyI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjYuNDYwMTY1LDcuNTEzMzgxIEMyOC4wNzcxOTQyLDUuNDkwODI5NSAyOS4xNzQ1MDE0LDIuNzc1MTIwNSAyOC44ODUwOTc1LDAgQzI2LjUxNzk4ODIsMC4xMTc3MDM5IDIzLjYyOTM4NjksMS41NjE2NjE3IDIxLjk1NzAyMzYsMy41ODU4MDE0IEMyMC40NTU0MjMzLDUuMzE5MTY0MyAxOS4xMjYzODg1LDguMTQ4NTcxMyAxOS40NzI4NjAzLDEwLjgwNzM1OSBDMjIuMTMwMDYwMiwxMS4wMzc4NTggMjQuNzg0ODA1Myw5LjQ3OTE5MjcgMjYuNDYwMTY1LDcuNTEzMzgxIiBpZD0iWE1MSURfMTRfIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjguODU0OTAyMywxMS4zMjY0OTkgQzI0Ljk5NjAwNDEsMTEuMDk2NjM1OCAyMS43MTUwMDIxLDEzLjUxNjYwNDQgMTkuODcyMTc1MiwxMy41MTY2MDQ0IEMxOC4wMjgzMzk0LDEzLjUxNjYwNDQgMTUuMjA2Mzc5OSwxMS40NDIzMzAzIDEyLjE1NDE5NjcsMTEuNDk4MjMgQzguMTgxNTkxLDExLjU1NjU3NzcgNC40OTU0Njg2LDEzLjgwMjcyNzcgMi40Nzk1NDA4LDE3LjM3NTE0MzEgQy0xLjY2Njg4NDQsMjQuNTIxNzM4MSAxLjM4NTI5NzYsMzUuMTIyNjUwMiA1LjQxNzQ3NTQsNDAuOTQzMTYxMSBDNy4zNzU1OTQ4LDQzLjgyMjc0NjQgOS43MzU0NTE5LDQ2Ljk5MzM4OTIgMTIuODQ0OTM4NSw0Ni44Nzk1MDE0IEMxNS43ODI4NzM0LDQ2Ljc2NDIwOTggMTYuOTM0NDE5OSw0NC45NzcxMzg2IDIwLjUwNTYxMzUsNDQuOTc3MTM4NiBDMjQuMDc0MTc1MSw0NC45NzcxMzg2IDI1LjExMTQ3NTIsNDYuODc5NTAxNCAyOC4yMjE0NjYyLDQ2LjgyMTg3MjggQzMxLjQ0NjYwMzksNDYuNzY0MjA5OCAzMy40NjI4OTA4LDQzLjk0MDg0NTYgMzUuNDIwOTcxMSw0MS4wNTg0NTI3IEMzNy42NjczMDE0LDM3Ljc3NTg2NzYgMzguNTg2ODY0NywzNC42MDYyNjk5IDM4LjY0NDcwNjksMzQuNDMyMjcwMSBDMzguNTg2ODY0NiwzNC4zNzQ2NDE1IDMyLjQyNTczNTYsMzIuMDExMDc3OSAzMi4zNjg2MTA2LDI0LjkyMzg3NCBDMzIuMzEwNDQ0MSwxOC45ODk2NTY1IDM3LjIwNTc4MDIsMTYuMTY3MDEzMyAzNy40MzYxODAzLDE1Ljk5MTk3MDIgQzM0LjY3MTc0MTUsMTEuOTAzMzUxOCAzMC4zNTIzNjE3LDExLjQ0MjMzMDQgMjguODU0OTAyMywxMS4zMjY0OTkiIGlkPSJYTUxJRF82XyI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=") !important;
34 | }
35 |
36 | /* MAIN */
37 |
38 | body.tamp_devdocs .topic-summary,
39 | body.tamp_devdocs .eyebrow,
40 | body.tamp_devdocs .datalist-term,
41 | body.tamp_devdocs .datalist-description dt,
42 | body.tamp_devdocs .datalist-description dt code {
43 | color: var(--sbs-secondary-text-color) !important;
44 | }
45 |
46 | body.tamp_devdocs h1, body.tamp_devdocs h2,
47 | body.tamp_devdocs h3, body.tamp_devdocs h4,
48 | body.tamp_devdocs h5, body.tamp_devdocs h6 {
49 | color: var(--sbs-primary-heading-color) !important;
50 | }
51 |
52 | body.tamp_devdocs p.title,
53 | body.tamp_devdocs p.card__title {
54 | color: var(--sbs-primary-text-color) !important;
55 | }
56 |
57 | body.tamp_devdocs .doc-topic {
58 | background: var(--sbs-secondary-bg-color) !important;
59 | }
60 |
61 | body.tamp_devdocs .symbol-name-decorated .decorator,
62 | body.tamp_devdocs .symbol-name-decorated .label {
63 | color: var(--sbs-secondary-text-color) !important;
64 | }
65 |
66 | body.tamp_devdocs #main .svg-icon-small {
67 | fill: var(--sbs-secondary-text-color) !important;
68 | }
69 |
70 | /* Separator below title and summary */
71 | body.tamp_devdocs #main .topic-content::before {
72 | border-top: 1px solid var(--sbs-secondary-text-color) !important;
73 | }
74 |
75 | /* Separator below "See Also" */
76 | body.tamp_devdocs #main .contenttable-container {
77 | border-top: 1px solid var(--sbs-secondary-text-color) !important;
78 | }
79 |
80 | body.tamp_devdocs #main .category:not(:last-child) {
81 | border-bottom: 1px solid var(--sbs-secondary-text-color) !important;
82 | }
83 |
84 | body.tamp_devdocs div.filter__delete-button-wrapper {
85 | background: transparent !important;
86 | }
87 |
88 | /* CODE */
89 |
90 | body.tamp_devdocs .code-listing,
91 | body.tamp_devdocs .code-listing .code-source {
92 | background-color: var(--sbs-code-bg-color) !important;
93 | border: 1px solid #444444 !important;
94 | color: var(--sbs-primary-text-color) !important;
95 | }
96 |
97 | body.tamp_devdocs .syntax-param-name {
98 | color: var(--sbs-primary-text-color) !important;
99 | }
100 |
101 | body.tamp_devdocs .syntax-comment,
102 | body.tamp_devdocs .syntax-quote {
103 | color: #6C7986 !important;
104 | }
105 |
106 | body.tamp_devdocs .syntax-keyword,
107 | body.tamp_devdocs .syntax-keyword .symbolref,
108 | body.tamp_devdocs .syntax-literal, .syntax-selector-tag {
109 | color: #FC5FA3 !important;
110 | }
111 |
112 | body.tamp_devdocs .syntax-bullet,
113 | body.tamp_devdocs .syntax-meta,
114 | body.tamp_devdocs .syntax-number,
115 | body.tamp_devdocs .syntax-symbol,
116 | body.tamp_devdocs .syntax-tag,
117 | body.tamp_devdocs .syntax-title {
118 | color: #D0BF69 !important;
119 | }
120 |
121 | body.tamp_devdocs .symbolref,
122 | body.tamp_devdocs .syntax-attr,
123 | body.tamp_devdocs .syntax-built_in,
124 | body.tamp_devdocs .syntax-builtin-name,
125 | body.tamp_devdocs .syntax-class,
126 | body.tamp_devdocs .syntax-params,
127 | body.tamp_devdocs .syntax-section,
128 | body.tamp_devdocs .syntax-title,
129 | body.tamp_devdocs .syntax-type,
130 | body.tamp_devdocs .syntax-type .symbolref {
131 | color: #D0A8FF !important;
132 | }
133 |
134 | body.tamp_devdocs .syntax-string {
135 | color: #FC6A5D !important;
136 | }
137 |
138 | body.tamp_devdocs .syntax-attribute,
139 | body.tamp_devdocs .syntax-identifier,
140 | body.tamp_devdocs .syntax-subst {
141 | color: #41A1C0 !important;
142 | }
143 |
144 | /* NOTE, TIP & IMPORTANT */
145 |
146 | body.tamp_devdocs aside,
147 | body.tamp_devdocs .aside {
148 | background-color: #666 !important;
149 | color: var(--sbs-primary-text-color) !important;
150 | }
151 |
152 | body.tamp_devdocs .important {
153 | background-color: #70662d !important;
154 | color: var(--sbs-primary-text-color) !important;
155 | }
156 |
157 | body.tamp_devdocs .important p.label {
158 | color: #e2d73e !important;
159 | }
160 |
161 | body.tamp_devdocs .aside-name {
162 | color: var(--sbs-primary-text-color) !important;
163 | }
164 |
165 | body.tamp_devdocs .aside-note,
166 | body.tamp_devdocs .aside-tip {
167 | border-left: 6px solid var(--sbs-secondary-text-color) !important;
168 | }
169 |
170 | /* VIOLATORS */
171 |
172 | body.tamp_devdocs .violator {
173 | border-color: var(--sbs-secondary-text-color) !important;
174 | color: var(--sbs-secondary-text-color) !important;
175 | }
176 |
177 | /* FOOTER */
178 |
179 | body.tamp_devdocs .alt-light {
180 | background-color: var(--sbs-primary-bg-color) !important;
181 | }
182 |
183 | body.tamp_devdocs #globalfooter-wrapper {
184 | background-color: #161716 !important;
185 | }
186 |
187 | body.tamp_devdocs #globalfooter-wrapper a {
188 | color: var(--sbs-primary-link-color) !important;
189 | }
190 |
191 | body.tamp_devdocs #globalfooter-wrapper h3 a {
192 | color: var(--sbs-primary-text-color) !important;
193 | }
194 |
195 | body.tamp_devdocs #globalfooter-wrapper ul li a {
196 | color: var(--sbs-secondary-text-color) !important;
197 | }
198 |
199 | body.tamp_devdocs #globalfooter-wrapper home {
200 | color: var(--sbs-primary-text-color) !important;
201 | }
202 |
203 | body.tamp_devdocs #globalfooter-wrapper .breadcrumbs-home {
204 | background-color: transparent !important;
205 | color: var(--sbs-primary-text-color) !important;
206 | }
207 |
208 | body.tamp_devdocs .footer-breadory .breadcrumbs-home {
209 | background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjY5cHgiIGhlaWdodD0iNTZweCIgdmlld0JveD0iMCAwIDI2OSA1NiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNjAuMSAoODgxMzMpIC0gaHR0cHM6Ly9za2V0Y2guY29tIC0tPgogICAgPHRpdGxlPkFydGJvYXJkPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IkFydGJvYXJkIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iZGV2IiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU0LjAwMDAwMCwgMTEuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTMuMDA2MDUwMSwwLjQ1MDUwMTQgQzIzLjQ3OTY4MjksMC40NTA1MDE0IDI5LjY4MDg1NDgsNi44OTU4MTI5IDI5LjY4MDg1NDgsMTguMDA0MjEyMyBDMjkuNjgwODU0OCwyOS4xMzcwMjQ4IDIzLjUwNDA5NywzNS42ODA0ODE4IDEzLjAwNjA1MDEsMzUuNjgwNDgxOCBMMC41NzkyODg1LDM1LjY4MDQ4MTggTDAuNTc5Mjg4NSwwLjQ1MDUwMTQgTDEzLjAwNjA1MDEsMC40NTA1MDE0IFogTTYuMDQ4MDM4NSwzMC45NDM2NjQ2IEwxMi40OTMzNTQ4LDMwLjk0MzY2NDYgQzE5Ljk2NDA1NzksMzAuOTQzNjY0NiAyNC4wOTAwMzQ1LDI2LjM3ODIzNDkgMjQuMDkwMDM0NSwxOC4wNTMwMzk2IEMyNC4wOTAwMzQ1LDkuNzUyMjU4NCAxOS45Mzk2NDM5LDUuMTYyNDE0NiAxMi40OTMzNTQ4LDUuMTYyNDE0NiBMNi4wNDgwMzg1LDUuMTYyNDE0NiBMNi4wNDgwMzg1LDMwLjk0MzY2NDYgTDYuMDQ4MDM4NSwzMC45NDM2NjQ2IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTU1LjYxNzg2NjUsMjguMTM2MDQ3NCBDNTQuOTA5ODU4NywzMi43OTkxMzMzIDUwLjM2ODg0MzEsMzUuOTk3ODYzOCA0NC41NTgyOTYyLDM1Ljk5Nzg2MzggQzM3LjA4NzU5MzEsMzUuOTk3ODYzOCAzMi40NDg5MjEyLDMwLjk5MjQ5MjcgMzIuNDQ4OTIxMiwyMi45NjAyNjYxIEMzMi40NDg5MjEyLDE0LjkwMzYyNTUgMzcuMTEyMDA3MSw5LjY3OTAxNjEgNDQuMzM4NTY5Niw5LjY3OTAxNjEgQzUxLjQ0MzA2MTgsOS42NzkwMTYxIDU1LjkxMDgzNTIsMTQuNTYxODI4NiA1NS45MTA4MzUyLDIyLjM0OTkxNDUgTDU1LjkxMDgzNTIsMjQuMTU2NTU1MSBMMzcuNzcxMTg2OCwyNC4xNTY1NTUxIEwzNy43NzExODY4LDI0LjQ3MzkzNzkgQzM3Ljc3MTE4NjgsMjguODY4NDY5MSA0MC41Mjk5NzU5LDMxLjc0OTMyODUgNDQuNjgwMzY2NSwzMS43NDkzMjg1IEM0Ny42MTAwNTQsMzEuNzQ5MzI4NSA0OS45MDQ5NzU5LDMwLjM1NzcyNjkgNTAuNjEyOTgzNywyOC4xMzYwNDczIEw1NS42MTc4NjY1LDI4LjEzNjA0NzMgTDU1LjYxNzg2NjUsMjguMTM2MDQ3NCBaIE0zNy43OTU2MDA5LDIwLjQ3MDAzMTcgTDUwLjYzNzM5NzgsMjAuNDcwMDMxNyBDNTAuNTE1MzI3NSwxNi41MzkzNjc2IDQ4LjAwMDY3OSwxMy45NTE0NzcgNDQuMzM4NTY5NywxMy45NTE0NzcgQzQwLjcwMDg3NDMsMTMuOTUxNDc3IDM4LjA2NDE1NTYsMTYuNTg4MTk1OCAzNy43OTU2MDA5LDIwLjQ3MDAzMTcgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iUGF0aCIgcG9pbnRzPSI3Mi4wNTc4MDc5IDM1LjY4MDQ4MSA2Ni4zOTM3NDU0IDM1LjY4MDQ4MSA1Ny4xNDA4MTU3IDkuOTk2Mzk5IDYyLjc1NjA1MDEgOS45OTYzOTkgNjkuMjAxMzYyNiAzMC41Mjg2MjU2IDY5LjI5OTAxODggMzAuNTI4NjI1NiA3NS43NDQzMjM3IDkuOTk2Mzk5IDgxLjI2MTkwMTggOS45OTYzOTkiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDUuMTYwMzM5LDI4LjEzNjA0NzQgQzEwNC40NTIzMzIsMzIuNzk5MTMzMyA5OS45MTEzMTYsMzUuOTk3ODYzOCA5NC4xMDA3NjkxLDM1Ljk5Nzg2MzggQzg2LjYzMDA2NiwzNS45OTc4NjM4IDgxLjk5MTM5NDEsMzAuOTkyNDkyNyA4MS45OTEzOTQxLDIyLjk2MDI2NjEgQzgxLjk5MTM5NDEsMTQuOTAzNjI1NSA4Ni42NTQ0OCw5LjY3OTAxNjEgOTMuODgxMDQyNSw5LjY3OTAxNjEgQzEwMC45ODU1MzUsOS42NzkwMTYxIDEwNS40NTMzMDgsMTQuNTYxODI4NiAxMDUuNDUzMzA4LDIyLjM0OTkxNDUgTDEwNS40NTMzMDgsMjQuMTU2NTU1MSBMODcuMzEzNjU5NywyNC4xNTY1NTUxIEw4Ny4zMTM2NTk3LDI0LjQ3MzkzNzkgQzg3LjMxMzY1OTcsMjguODY4NDY5MSA5MC4wNzI0NDg4LDMxLjc0OTMyODUgOTQuMjIyODM5NCwzMS43NDkzMjg1IEM5Ny4xNTI1MjY5LDMxLjc0OTMyODUgOTkuNDQ3NDQ4OCwzMC4zNTc3MjY5IDEwMC4xNTU0NTcsMjguMTM2MDQ3MyBMMTA1LjE2MDMzOSwyOC4xMzYwNDczIEwxMDUuMTYwMzM5LDI4LjEzNjA0NzQgWiBNODcuMzM4MDczNywyMC40NzAwMzE3IEwxMDAuMTc5ODcxLDIwLjQ3MDAzMTcgQzEwMC4wNTc4LDE2LjUzOTM2NzYgOTcuNTQzMTUxOCwxMy45NTE0NzcgOTMuODgxMDQyNSwxMy45NTE0NzcgQzkwLjI0MzM0NzIsMTMuOTUxNDc3IDg3LjYwNjYyODQsMTYuNTg4MTk1OCA4Ny4zMzgwNzM3LDIwLjQ3MDAzMTcgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iUGF0aCIgcG9pbnRzPSIxMDkuNzI1NzY5IDAuNDUwNTAxNCAxMTQuOTk5MjA3IDAuNDUwNTAxNCAxMTQuOTk5MjA3IDM1LjY4MDQ4MSAxMDkuNzI1NzY5IDM1LjY4MDQ4MSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTExOC44NzIyNTMsMjIuODM4MTk1OCBDMTE4Ljg3MjI1MywxNC43NTcxNDExIDEyMy42MzI5OTYsOS42NzkwMTYxIDEzMS4wNTQ4NzEsOS42NzkwMTYxIEMxMzguNTAxMTYsOS42NzkwMTYxIDE0My4yMzc0ODgsMTQuNzU3MTQxMSAxNDMuMjM3NDg4LDIyLjgzODE5NTggQzE0My4yMzc0ODgsMzAuOTQzNjY0NiAxMzguNTI1NTc0LDM1Ljk5Nzg2MzggMTMxLjA1NDg3MSwzNS45OTc4NjM4IEMxMjMuNTg0MTY4LDM1Ljk5Nzg2MzggMTE4Ljg3MjI1MywzMC45NDM2NjQ2IDExOC44NzIyNTMsMjIuODM4MTk1OCBaIE0xMzcuODY2Mzk0LDIyLjgzODE5NTggQzEzNy44NjYzOTQsMTcuMjk2MjAzNiAxMzUuMzI3MzMyLDE0LjAyNDcxOTIgMTMxLjA1NDg3MSwxNC4wMjQ3MTkyIEMxMjYuNzgyNDEsMTQuMDI0NzE5MiAxMjQuMjQzMzQ3LDE3LjMyMDYxNzYgMTI0LjI0MzM0NywyMi44MzgxOTU4IEMxMjQuMjQzMzQ3LDI4LjQwNDYwMiAxMjYuNzgyNDEsMzEuNjUxNjcyNCAxMzEuMDU0ODcxLDMxLjY1MTY3MjQgQzEzNS4zMjczMzIsMzEuNjUxNjcyNCAxMzcuODY2Mzk0LDI4LjQwNDYwMjEgMTM3Ljg2NjM5NCwyMi44MzgxOTU4IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTE3MS4wMDg5NzIsMjIuODM4MTk1OCBDMTcxLjAwODk3MiwzMC44MjE1OTQyIDE2Ni43MzY1MTEsMzUuOTQ5MDM1NiAxNjAuMjkxMTk5LDM1Ljk0OTAzNTYgQzE1Ni42MjkwODksMzUuOTQ5MDM1NiAxNTMuNzIzODE2LDM0LjMxMzI5MzQgMTUyLjIxMDE0NCwzMS40NTYzNTk4IEwxNTIuMDg4MDc0LDMxLjQ1NjM1OTggTDE1Mi4wODgwNzQsNDQuMTc2NTc0NiBMMTQ2LjgxNDYzNiw0NC4xNzY1NzQ2IEwxNDYuODE0NjM2LDkuOTk2Mzk4OSBMMTUxLjkxNzE3NSw5Ljk5NjM5ODkgTDE1MS45MTcxNzUsMTQuMjY4ODU5OCBMMTUyLjAxNDgzMiwxNC4yNjg4NTk4IEMxNTMuNDc5Njc1LDExLjUxMDA3MDcgMTU2LjYwNDY3NSw5LjcyNzg0NDIgMTYwLjE5MzU0Miw5LjcyNzg0NDIgQzE2Ni43MTIwOTcsOS43Mjc4NDQyIDE3MS4wMDg5NzIsMTQuODc5MjExNCAxNzEuMDA4OTcyLDIyLjgzODE5NTggWiBNMTY1LjU4OTA1LDIyLjgzODE5NTggQzE2NS41ODkwNSwxNy42MzgwMDA1IDE2Mi45MDM1MDMsMTQuMjIwMDMxNyAxNTguODAxOTQxLDE0LjIyMDAzMTcgQzE1NC43NzM2MjEsMTQuMjIwMDMxNyAxNTIuMDYzNjYsMTcuNzExMjQyNiAxNTIuMDYzNjYsMjIuODM4MTk1OCBDMTUyLjA2MzY2LDI4LjAxMzk3NyAxNTQuNzczNjIxLDMxLjQ4MDc3MzkgMTU4LjgwMTk0MSwzMS40ODA3NzM5IEMxNjIuOTAzNTAzLDMxLjQ4MDc3MzkgMTY1LjU4OTA1LDI4LjA4NzIxOTIgMTY1LjU4OTA1LDIyLjgzODE5NTggWiIgaWQ9IlNoYXBlIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTk2Ljg4Mjk5NiwyOC4xMzYwNDc0IEMxOTYuMTc0OTg4LDMyLjc5OTEzMzMgMTkxLjYzMzk3MiwzNS45OTc4NjM4IDE4NS44MjM0MjUsMzUuOTk3ODYzOCBDMTc4LjM1MjcyMiwzNS45OTc4NjM4IDE3My43MTQwNSwzMC45OTI0OTI3IDE3My43MTQwNSwyMi45NjAyNjYxIEMxNzMuNzE0MDUsMTQuOTAzNjI1NSAxNzguMzc3MTM2LDkuNjc5MDE2MSAxODUuNjAzNjk5LDkuNjc5MDE2MSBDMTkyLjcwODE5MSw5LjY3OTAxNjEgMTk3LjE3NTk2NCwxNC41NjE4Mjg2IDE5Ny4xNzU5NjQsMjIuMzQ5OTE0NSBMMTk3LjE3NTk2NCwyNC4xNTY1NTUxIEwxNzkuMDM2MzE2LDI0LjE1NjU1NTEgTDE3OS4wMzYzMTYsMjQuNDczOTM3OSBDMTc5LjAzNjMxNiwyOC44Njg0NjkxIDE4MS43OTUxMDUsMzEuNzQ5MzI4NSAxODUuOTQ1NDk2LDMxLjc0OTMyODUgQzE4OC44NzUxODMsMzEuNzQ5MzI4NSAxOTEuMTcwMTA1LDMwLjM1NzcyNjkgMTkxLjg3ODExMywyOC4xMzYwNDczIEwxOTYuODgyOTk2LDI4LjEzNjA0NzMgTDE5Ni44ODI5OTYsMjguMTM2MDQ3NCBaIE0xNzkuMDYwNzMsMjAuNDcwMDMxNyBMMTkxLjkwMjUyNywyMC40NzAwMzE3IEMxOTEuNzgwNDU3LDE2LjUzOTM2NzYgMTg5LjI2NTgwOCwxMy45NTE0NzcgMTg1LjYwMzY5OSwxMy45NTE0NzcgQzE4MS45NjYwMDMsMTMuOTUxNDc3IDE3OS4zMjkyODUsMTYuNTg4MTk1OCAxNzkuMDYwNzMsMjAuNDcwMDMxNyBaIiBpZD0iU2hhcGUiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMDEuMDAzMTEzLDkuOTk2Mzk4OSBMMjA2LjAzMjQxLDkuOTk2Mzk4OSBMMjA2LjAzMjQxLDE0LjM2NjUxNjEgTDIwNi4xNTQ0OCwxNC4zNjY1MTYxIEMyMDYuOTYwMTQ0LDExLjQ2MTI0MjcgMjA5LjMwMzg5NCw5LjcyNzg0NDIgMjEyLjMzMTIzOCw5LjcyNzg0NDIgQzIxMy4wODgwNzQsOS43Mjc4NDQyIDIxMy43MjI4MzksOS44MjU1MDA0IDIxNC4xMzc4NzgsOS45MjMxNTY3IEwyMTQuMTM3ODc4LDE0Ljg1NDc5NzMgQzIxMy43MjI4MzksMTQuNjgzODk4OSAyMTIuNzk1MTA1LDE0LjUzNzQxNDUgMjExLjc2OTcxNCwxNC41Mzc0MTQ1IEMyMDguMzc2MTYsMTQuNTM3NDE0NSAyMDYuMjc2NTUsMTYuODMyMzM2NCAyMDYuMjc2NTUsMjAuNDQ1NjE3NiBMMjA2LjI3NjU1LDM1LjY4MDQ4MSBMMjAxLjAwMzExMywzNS42ODA0ODEgTDIwMS4wMDMxMTMsOS45OTYzOTg5IEwyMDEuMDAzMTEzLDkuOTk2Mzk4OSBaIiBpZD0iUGF0aCI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIGlkPSJYTUxJRF81XyI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjYuNDYwMTY1LDcuNTEzMzgxIEMyOC4wNzcxOTQyLDUuNDkwODI5NSAyOS4xNzQ1MDE0LDIuNzc1MTIwNSAyOC44ODUwOTc1LDAgQzI2LjUxNzk4ODIsMC4xMTc3MDM5IDIzLjYyOTM4NjksMS41NjE2NjE3IDIxLjk1NzAyMzYsMy41ODU4MDE0IEMyMC40NTU0MjMzLDUuMzE5MTY0MyAxOS4xMjYzODg1LDguMTQ4NTcxMyAxOS40NzI4NjAzLDEwLjgwNzM1OSBDMjIuMTMwMDYwMiwxMS4wMzc4NTggMjQuNzg0ODA1Myw5LjQ3OTE5MjcgMjYuNDYwMTY1LDcuNTEzMzgxIiBpZD0iWE1MSURfMTRfIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjguODU0OTAyMywxMS4zMjY0OTkgQzI0Ljk5NjAwNDEsMTEuMDk2NjM1OCAyMS43MTUwMDIxLDEzLjUxNjYwNDQgMTkuODcyMTc1MiwxMy41MTY2MDQ0IEMxOC4wMjgzMzk0LDEzLjUxNjYwNDQgMTUuMjA2Mzc5OSwxMS40NDIzMzAzIDEyLjE1NDE5NjcsMTEuNDk4MjMgQzguMTgxNTkxLDExLjU1NjU3NzcgNC40OTU0Njg2LDEzLjgwMjcyNzcgMi40Nzk1NDA4LDE3LjM3NTE0MzEgQy0xLjY2Njg4NDQsMjQuNTIxNzM4MSAxLjM4NTI5NzYsMzUuMTIyNjUwMiA1LjQxNzQ3NTQsNDAuOTQzMTYxMSBDNy4zNzU1OTQ4LDQzLjgyMjc0NjQgOS43MzU0NTE5LDQ2Ljk5MzM4OTIgMTIuODQ0OTM4NSw0Ni44Nzk1MDE0IEMxNS43ODI4NzM0LDQ2Ljc2NDIwOTggMTYuOTM0NDE5OSw0NC45NzcxMzg2IDIwLjUwNTYxMzUsNDQuOTc3MTM4NiBDMjQuMDc0MTc1MSw0NC45NzcxMzg2IDI1LjExMTQ3NTIsNDYuODc5NTAxNCAyOC4yMjE0NjYyLDQ2LjgyMTg3MjggQzMxLjQ0NjYwMzksNDYuNzY0MjA5OCAzMy40NjI4OTA4LDQzLjk0MDg0NTYgMzUuNDIwOTcxMSw0MS4wNTg0NTI3IEMzNy42NjczMDE0LDM3Ljc3NTg2NzYgMzguNTg2ODY0NywzNC42MDYyNjk5IDM4LjY0NDcwNjksMzQuNDMyMjcwMSBDMzguNTg2ODY0NiwzNC4zNzQ2NDE1IDMyLjQyNTczNTYsMzIuMDExMDc3OSAzMi4zNjg2MTA2LDI0LjkyMzg3NCBDMzIuMzEwNDQ0MSwxOC45ODk2NTY1IDM3LjIwNTc4MDIsMTYuMTY3MDEzMyAzNy40MzYxODAzLDE1Ljk5MTk3MDIgQzM0LjY3MTc0MTUsMTEuOTAzMzUxOCAzMC4zNTIzNjE3LDExLjQ0MjMzMDQgMjguODU0OTAyMywxMS4zMjY0OTkiIGlkPSJYTUxJRF82XyI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=") !important;
210 | }
211 | }
--------------------------------------------------------------------------------
/developer.apple.com/Night Mode docs.js:
--------------------------------------------------------------------------------
1 |
2 | function boot() {
3 |
4 | if (document.body.classList.contains('__tampered'))
5 | return
6 |
7 | document.body.classList.add("__tampered")
8 |
9 | if (document.location.pathname.indexOf('/documentation') == 0)
10 | document.body.classList.add("tamp_devdocs")
11 | }
12 |
13 | boot()
14 |
--------------------------------------------------------------------------------
/docs.sygictravelapi.com/Nice style.css:
--------------------------------------------------------------------------------
1 |
2 | header { display: none !important; visibility: hidden !important; }
3 | section { max-width: none !important; padding: 0 !important; }
4 | section.general-description { padding: 0.8rem 1.2rem !important; }
5 | h4 { margin-top: 0 !important; }
6 | body {
7 | width: 70%;
8 | max-width: 1200px;
9 | min-width: 400px;
10 | margin: 0 auto;
11 | background: whitesmoke;
12 | }
13 | .st-api-header { display: none !important; }
14 | .st-sidebar .st-sidebar-header .dropdown { display: block; }
15 | .st-sidebar .st-sidebar-header .dropdown button {
16 | display: block;
17 | color: #6c757d;
18 | border-color: #6c757d;
19 | width: 100%;
20 | }
21 | .st-sidebar .st-sidebar-header .dropdown button:hover {
22 | background-color: #00000005 !important;
23 | }
24 | .st-sidebar .st-sidebar-header .dropdown .dropdown-menu {
25 | width: 100%;
26 | }
27 | .st-sidebar {
28 | min-width: 14rem;
29 | color: black;
30 | top: 2.6rem;
31 | max-height: calc(100vh - 2.6rem);
32 | }
33 | .st-sidebar nav .nav-link {
34 | color: #555;
35 | padding: 0.2em 6px !important;
36 | border-radius: 8px;
37 | text-align: right;
38 | }
39 | .st-sidebar nav .nav-link:hover {
40 | color: #666666 !important;
41 | background-color: #00000005;
42 | border-left: none !important;
43 | margin-left: 0;
44 | }
45 | .st-sidebar nav .nav-link.active {
46 | font-weight: 600;
47 | color: #666699 !important;
48 | background-color: #1b47ba0f;
49 | border-left: none !important;
50 | margin-left: 0;
51 | }
52 | main { background: none !important; }
53 | .endpoint-header { background: #fff !important; }
54 | .endpoint-header .title { color: #999; }
55 | .general-description {
56 | background: #fff;
57 | padding: 0.8rem 1.2rem;
58 | margin: .5em 0 .8em;
59 | border-radius: 12px;
60 | border: 1px solid #0000002e;
61 | }
62 | .general-description details {
63 | border: 1px solid #00000015;
64 | border-radius: 6px;
65 | padding: 0.3em 0.5em;
66 | }
67 | .general-description details:hover, .general-description details[open] {
68 | background: #0000000c;
69 | }
70 | div.endpoint { border-radius: 8px; overflow: hidden; }
71 | #e-urlprefix.collapse { display: none !important; }
72 | #e-urlprefix.collapse.show { display: block !important; }
73 | .tab-content { background-color: #fff !important; }
74 |
--------------------------------------------------------------------------------
/docs.sygictravelapi.com/Omit Nice style in Apple Docs.js:
--------------------------------------------------------------------------------
1 |
2 | function process() {
3 |
4 | if (window.location.toString().indexOf('apple') == -1)
5 | return
6 |
7 | document.querySelector('style[id*="_tamperish_"]').remove()
8 |
9 | setTimeout(function(){ document.querySelector('style[id*="_tamperish_"]').remove() }, 1)
10 | }
11 |
12 | process()
13 |
--------------------------------------------------------------------------------
/github.com/styles.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Basic layout
3 | */
4 |
5 | .container {
6 | width: 100% !important;
7 | padding-right: 30px !important;
8 | padding-left: 30px !important;
9 | }
10 |
11 | /* Responsive containers on some pages */
12 | .container-lg,
13 | .container-xl {
14 | max-width: 100% !important;
15 | padding-right: 30px !important;
16 | padding-left: 30px !important;
17 | }
18 |
19 | /* Match the header to container padding */
20 | .Header {
21 | padding-right: 30px !important;
22 | padding-left: 30px !important;
23 | }
24 |
25 |
26 | /*
27 | * Profile pages
28 | */
29 |
30 | .pinned-repo-item {
31 | width: calc(50% - 10px) !important;
32 | }
33 | .org-pinned-repos-list .pinned-repo-item {
34 | width: calc(33.3% - 10px) !important;
35 | }
36 |
37 | .u-photo,
38 | .user-status-container {
39 | max-width: 250px;
40 | }
41 | .u-photo .avatar {
42 | width: 100% !important;
43 | height: auto !important;
44 | }
45 |
46 |
47 | /*
48 | * Repo-specific stuff
49 | */
50 |
51 | .repository-content {
52 | width: 100% !important;
53 | }
54 |
55 | /* Undo container changes for the Projects tab on repos which have unnecessary nested container-lg's */
56 | .repository-content > .container-lg {
57 | padding-right: 0 !important;
58 | padding-left: 0 !important;
59 | }
60 |
61 | /* Undo for profile timeline */
62 | .contribution-activity-listing .discussion-timeline {
63 | width: 100% !important;
64 | }
65 |
66 | /* Fix #18 - props: @auscompgeek */
67 | .file-header::after {
68 | clear: left !important;
69 | }
70 |
71 | /* Network graph */
72 | #network {
73 | max-width: 730px;
74 | }
75 |
76 |
77 | /*
78 | * Issues & Dashboard
79 | */
80 |
81 | #dashboard,
82 | .new-issue-form {
83 | position: relative !important;
84 | }
85 |
86 | .new-issue-form .discussion-sidebar {
87 | position: absolute !important;
88 | top: 0 !important;
89 | right: 0 !important;
90 | }
91 |
92 | button.discussion-sidebar-toggle {
93 | width: 100% !important;
94 | }
95 |
96 | .timeline-new-comment {
97 | max-width: none !important;
98 | }
99 |
100 | /* Commits: extended message under "..." */
101 | .commit-desc pre {
102 | max-width: none;
103 | }
104 |
105 | /* Alert messages */
106 | #js-flash-container .flash-messages {
107 | width: 100% !important;
108 | padding-left: 30px !important;
109 | padding-right: 30px !important;
110 | }
111 |
--------------------------------------------------------------------------------
/gitlab.com/Adjustments.css:
--------------------------------------------------------------------------------
1 |
2 |
3 | /* Merge requests */
4 |
5 | body[data-page="projects:merge_requests:show"]
6 | div.diff-file div.gl-text-center.collapsed-file-warning {
7 | display: none;
8 | }
9 |
10 | body[data-page="projects:merge_requests:show"]
11 | .diff-file .file-title svg.diff-toggle-caret,
12 | body[data-page="projects:merge_requests:show"]
13 | .diff-file .file-title-flex-parent svg.diff-toggle-caret {
14 | border: 1px solid rgba(0, 0, 0, 0.18);
15 | width: 24px;
16 | height: 24px;
17 | border-radius: 12px;
18 | }
19 |
20 | body[data-page="projects:merge_requests:show"]
21 | .diff-file .file-title svg.diff-toggle-caret:hover,
22 | body[data-page="projects:merge_requests:show"]
23 | .diff-file .file-title-flex-parent svg.diff-toggle-caret:hover {
24 | background: #eee;
25 | }
26 |
27 | body[data-page="projects:merge_requests:show"]
28 | .diff-files-holder div.file-actions div.btn-group button.btn.js-btn-vue-toggle-comments {
29 | margin-right: 10px;
30 | }
31 |
32 | /* Repository > Compare */
33 |
34 | body[data-page="projects:compare:show"]
35 | div.diff-file.file-holder > div.diff-content > div.nothing-here-block.diff-collapsed {
36 | display: none;
37 | }
38 |
39 | body[data-page="projects:compare:show"]
40 | div.file-title-flex-parent.is-compare.js-file-title > div.file-header-content > i.diff-toggle-caret {
41 | display: inline-block;
42 | border: 1px solid rgba(0, 0, 0, 0.18);
43 | width: 24px;
44 | height: 24px;
45 | border-radius: 12px;
46 | vertical-align: middle;
47 | padding-top: 5px;
48 | }
49 |
50 | body[data-page="projects:compare:show"]
51 | div.file-title-flex-parent.is-compare.js-file-title > div.file-header-content > i.diff-toggle-caret:hover {
52 | background: #eee;
53 | }
54 |
55 | div.right-sidebar-collapsed .limit-container-width.container-limited,
56 | div.right-sidebar-collapsed .detail-page-description,
57 | div.right-sidebar-collapsed .limit-container-width .issuable-details .detail-page-description,
58 | div.right-sidebar-collapsed .limit-container-width .issuable-details .mr-source-target,
59 | div.right-sidebar-collapsed .limit-container-width .issuable-details .mr-state-widget,
60 | div.right-sidebar-collapsed .limit-container-width .issuable-details .merge-manually,
61 | div.right-sidebar-collapsed .limit-container-width .merge-request-tabs-container,
62 | div.right-sidebar-collapsed .limit-container-width .epic-tabs-container,
63 | div.right-sidebar-collapsed .limit-container-width .detail-page-header,
64 | div.right-sidebar-collapsed .limit-container-width .page-content-header,
65 | div.right-sidebar-collapsed .limit-container-width .commit-box,
66 | div.right-sidebar-collapsed .limit-container-width .info-well,
67 | div.right-sidebar-collapsed .limit-container-width .commit-ci-menu,
68 | div.right-sidebar-collapsed .limit-container-width .files-changed-inner,
69 | div.right-sidebar-collapsed .limit-container-width .limited-header-width,
70 | div.right-sidebar-collapsed .limit-container-width .limited-width-notes {
71 | max-width: 10000px;
72 | }
73 |
--------------------------------------------------------------------------------
/google.com/No agreements.js:
--------------------------------------------------------------------------------
1 |
2 | function removeConsentModal() {
3 |
4 | var consentElement = document.querySelector('iframe[src*="consent"]')
5 |
6 | var path = window.location.pathname
7 | var cont = null
8 |
9 | if (path.startsWith('/maps')) {
10 | document.querySelector('div#consent-bump').remove()
11 | return
12 | } else if (path.startsWith('/search'))
13 | cont = document.querySelector('div#cnt')
14 | else cont = document.querySelector('div#main')
15 |
16 | if (!cont) return
17 |
18 | var par = consentElement
19 | while (par.parentElement != cont) par = par.parentElement
20 |
21 | par.remove()
22 | }
23 |
24 | removeConsentModal()
25 |
--------------------------------------------------------------------------------
/warforum.cz/Clickable URLs.js:
--------------------------------------------------------------------------------
1 |
2 | function process() {
3 |
4 | if (document.body.classList.contains('__tampered'))
5 | return
6 |
7 | document.body.classList.add("__tampered")
8 |
9 | const regex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?!&//=]*)/g
10 |
11 | var elms = document.querySelectorAll('td.code')
12 | elms.forEach(function(e){
13 | e.innerHTML = e.innerHTML.replace(regex, function(x){ return ''+x+'' })
14 | })
15 |
16 | }
17 |
18 | process()
19 |
--------------------------------------------------------------------------------
/youtube.com/Skip Ad Clicker.js:
--------------------------------------------------------------------------------
1 |
2 | // Source: https://github.com/squgeim/yt-ad-autoskipper/blob/master/skipad.js
3 |
4 | (function () {
5 | var classList = [
6 | 'videoAdUiSkipButton', // Old close ad button
7 | 'ytp-ad-skip-button ytp-button', // New close ad button
8 | 'ytp-ad-overlay-close-button', // Close overlay button
9 | ];
10 |
11 | var timeoutId;
12 | var observedSkipBtn;
13 | var skipBtnObserver;
14 |
15 | /**
16 | * Loops over all the class names of buttons that we need to click to skip an
17 | * ad or overlay, and returns an array of those elements.
18 | *
19 | * @param {Array} classNames - an array of class names of buttons that we need to click
20 | * @returns {Array} - An array of DOM elements
21 | */
22 | function existingButtons(classNames) {
23 | return classNames
24 | .map(name => {
25 | return Array.from(document.getElementsByClassName(name)) || [];
26 | })
27 | .reduce(function(acc, elems) {
28 | return acc.concat(elems);
29 | }, [])
30 | }
31 |
32 | /**
33 | * We check if the button is visible by using the `offsetParent` attribute
34 | * on an element. It is `null` if the element, or any of its parents, is set
35 | * to have style `display:none`.
36 | *
37 | * @param {Element} button - The button element
38 | * @returns {boolean} - Whether the element is visible on the screen
39 | */
40 | function isBtnVisible(button) {
41 | return button.offsetParent === null ? false : true;
42 | }
43 |
44 | /**
45 | * Since we do not click the button as long as it is not visible, we can
46 | * attach an observer to listen for the button's attribute changes to figure
47 | * out when the element becomes visible.
48 | *
49 | * @param {Element} button - The button element to click
50 | */
51 | function triggerClickWhenVisible(button) {
52 | if (button === observedSkipBtn) {
53 | // We are already observing this button.
54 | return;
55 | }
56 |
57 | // Find the actual parent with the display style 'none' so that we can
58 | // listen to that element's changes.
59 | var parentWithDisplayStyle = (function() {
60 | var currentParent = button;
61 | while (currentParent !== null) {
62 | if (currentParent.style.display === 'none') {
63 | return currentParent;
64 | }
65 |
66 | currentParent = currentParent.parentElement;
67 | }
68 |
69 | return null;
70 | })();
71 |
72 | if (!parentWithDisplayStyle) {
73 | // Give up.
74 | return;
75 | }
76 |
77 | // If we had been observing another button, disconnect from that. If that
78 | // element still exists in the DOM, click on it for good measure.
79 | if (skipBtnObserver && observedSkipBtn) {
80 | skipBtnObserver.disconnect();
81 | triggerClick(observedSkipBtn);
82 | }
83 |
84 | // If this is the first skip button we have encountered, we will have to
85 | // set up the observer first.
86 | if (!skipBtnObserver) {
87 | skipBtnObserver = new MutationObserver(function() {
88 | if (!isBtnVisible(observedSkipBtn)) {
89 | return;
90 | }
91 |
92 | triggerClick(observedSkipBtn);
93 | observedSkipBtn = undefined;
94 | skipBtnObserver.disconnect();
95 | });
96 | }
97 |
98 | // Since we will eventually be working on the button we need to have this
99 | // reference stored.
100 | observedSkipBtn = button;
101 |
102 | // Note that we are actually observing the button's parent that has the
103 | // display attribute, as the skip button's visibilty is controlled by its
104 | // parent.
105 | skipBtnObserver.observe(parentWithDisplayStyle, { attributes: true });
106 | }
107 |
108 | /**
109 | * Loops over all the buttons that need to be clicked and triggers the click
110 | * even on those buttons.
111 | */
112 | function checkAndClickButtons() {
113 | existingButtons(classList).forEach(button => {
114 | // We want to make sure that we are only pressing the skip button when it
115 | // is visible on the screen, so that it is like an actual user is pressing
116 | // it. This also gives a user time to not-skip the ad in the future.
117 | if (!isBtnVisible(button)) {
118 | triggerClickWhenVisible(button);
119 |
120 | return;
121 | }
122 |
123 | triggerClick(button);
124 | })
125 | }
126 |
127 | /**
128 | * Triggers a click event on the given DOM element.
129 | *
130 | * This function is based on an answer here:
131 | * http://stackoverflow.com/questions/2705583/how-to-simulate-a-click-with-javascript
132 | *
133 | * @param {Element} el - The element on which to trigger the event
134 | */
135 | function triggerClick(el) {
136 | var etype = 'click';
137 |
138 | if (typeof el.fireEvent === 'function') {
139 | el.fireEvent('on' + etype);
140 | } else if (typeof el.dispatchEvent === 'function') {
141 | var evObj = document.createEvent('Events');
142 | evObj.initEvent(etype, true, false);
143 | el.dispatchEvent(evObj);
144 | }
145 | }
146 |
147 | /**
148 | * Initializes an observer on the YouTube Video Player to get events when any
149 | * of its child elements change. We can check for the existance of the skip ad
150 | * buttons on those changes.
151 | *
152 | * @returns {Boolean} - true if observer could be set up, false otherwise
153 | */
154 | function initObserver() {
155 | if (!('MutationObserver' in window)) {
156 | return false;
157 | }
158 |
159 | var ytdPlayer = (function(nodeList) {
160 | return nodeList && nodeList[0];
161 | })(document.getElementsByTagName('ytd-player'));
162 |
163 | if (!ytdPlayer) {
164 | return false;
165 | }
166 |
167 | var observer = new MutationObserver(function() {
168 | checkAndClickButtons();
169 | });
170 |
171 | observer.observe(ytdPlayer, { childList: true, subtree: true });
172 |
173 | clearTimeout(timeoutId); // Just for good measure
174 |
175 | return true;
176 | }
177 |
178 | /**
179 | * We have two implementations to check for the skip ad buttons: one is based on
180 | * MutationObserver, that is only triggered when the video-player is updated in
181 | * the page; second is a simple poll that constantly checks for the existence of
182 | * the skip ad buttons.
183 | *
184 | * We first try to set up the mutation observer. It can sometimes fail even when the
185 | * browser supports it, if the video player has not yet been attached to the DOM.
186 | * In such cases, we continue the polling implementation until the observer can be
187 | * set up.
188 | */
189 | function initTimeout() {
190 | clearTimeout(timeoutId);
191 |
192 | if (initObserver()) {
193 | // We can stop the polling as the observer is set up.
194 | return;
195 | }
196 |
197 | /**
198 | * Starts the poll to see if any of the ad buttons are present in the page now.
199 | * The interval of 2 seconds is arbitrary. I believe it is a good compromise.
200 | */
201 | timeoutId = setTimeout(function() {
202 | checkAndClickButtons();
203 |
204 | initTimeout();
205 | }, 2000);
206 | }
207 |
208 | /**
209 | * Check if we are running in an iframe. We do that by checking if our current
210 | * window is the same as the top parent window. The try..catch is there because
211 | * some browsers will not let a script in an iframe access the parent window.
212 | */
213 | var inIframe = (function() {
214 | try {
215 | return window.self !== window.top;
216 | } catch (e) {
217 | // The browser did not let us access the parent window. Which also means we
218 | // are in an iframe.
219 | return true;
220 | }
221 | })();
222 |
223 | /**
224 | * Only start the script if we are at the top level. YouTube has a few iframes
225 | * in the page which would also be running this content script.
226 | */
227 | if (!inIframe) {
228 | // main:
229 | initTimeout();
230 | }
231 | })();
232 |
--------------------------------------------------------------------------------