reaper-arcade-hub 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.html +20 -0
- package/js/app.js +84 -31
- package/js/security-shield.js +9 -0
- package/main/index.html +20 -0
- package/main/js/app.js +84 -31
- package/main/js/security-shield.js +9 -0
- package/package.json +1 -1
- package/verify/js/security-shield.js +9 -0
package/index.html
CHANGED
|
@@ -659,6 +659,26 @@
|
|
|
659
659
|
<!-- SUBTAB 2: PREFERENCES & AUDIO -->
|
|
660
660
|
<div id="st-content-prefs" style="display: none;">
|
|
661
661
|
<div style="display: flex; flex-direction: column; gap: 1.2rem;">
|
|
662
|
+
|
|
663
|
+
<!-- Auto about:blank toggle -->
|
|
664
|
+
<div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
|
|
665
|
+
<div>
|
|
666
|
+
<strong style="color: #fff; font-size: 0.95rem;">🌐 Auto-Cloak in about:blank on Visit</strong>
|
|
667
|
+
<p style="color: #88aacc; font-size: 0.8rem;">Automatically opens Reaper Hub in an undetectable about:blank tab every time you visit.</p>
|
|
668
|
+
</div>
|
|
669
|
+
<input type="checkbox" id="auto-aboutblank-toggle" style="width: 22px; height: 22px; cursor: pointer; accent-color: #00d2ff;" onchange="app.toggleAutoAboutBlank(this.checked)">
|
|
670
|
+
</div>
|
|
671
|
+
|
|
672
|
+
<!-- Launch in about:blank button -->
|
|
673
|
+
<div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
|
|
674
|
+
<div>
|
|
675
|
+
<strong style="color: #00d2ff; font-size: 0.95rem;">🚀 Launch Site in about:blank Tab</strong>
|
|
676
|
+
<p style="color: #88aacc; font-size: 0.8rem;">Spawn this entire portal inside a clean Google Classroom disguised about:blank window.</p>
|
|
677
|
+
</div>
|
|
678
|
+
<button class="btn-primary" onclick="app.openSiteAboutBlank()" style="font-size: 0.82rem; padding: 0.5rem 1.2rem;">LAUNCH CLOAK</button>
|
|
679
|
+
</div>
|
|
680
|
+
|
|
681
|
+
<!-- SFX toggle -->
|
|
662
682
|
<div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
|
|
663
683
|
<div>
|
|
664
684
|
<strong style="color: #fff; font-size: 0.95rem;">🔊 Sci-Fi Synthesizer Sound FX</strong>
|
package/js/app.js
CHANGED
|
@@ -179,6 +179,18 @@ class ReaperHubApp {
|
|
|
179
179
|
|
|
180
180
|
this.syncPlaytimeToDB();
|
|
181
181
|
|
|
182
|
+
// 10. Auto about:blank Cloak on Visit Check
|
|
183
|
+
const isAutoAboutBlank = localStorage.getItem('reaper_auto_about_blank') === 'true';
|
|
184
|
+
const autoBlankToggle = document.getElementById('auto-aboutblank-toggle');
|
|
185
|
+
if (autoBlankToggle) autoBlankToggle.checked = isAutoAboutBlank;
|
|
186
|
+
|
|
187
|
+
if (isAutoAboutBlank && window.self === window.top && !window.location.protocol.includes('about:')) {
|
|
188
|
+
if (sessionStorage.getItem('reaper_cloaked_session') !== 'true') {
|
|
189
|
+
sessionStorage.setItem('reaper_cloaked_session', 'true');
|
|
190
|
+
this.openSiteAboutBlank();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
182
194
|
console.log(`[REAPER HUB] System Online. Role: ${this.currentUser.rank.toUpperCase()}`);
|
|
183
195
|
}
|
|
184
196
|
|
|
@@ -1525,55 +1537,96 @@ class ReaperHubApp {
|
|
|
1525
1537
|
async openGameAboutBlank() {
|
|
1526
1538
|
if (!this.currentGame) return;
|
|
1527
1539
|
const filename = this.currentGame.url.split('/').pop();
|
|
1540
|
+
const gameName = this.currentGame.name;
|
|
1541
|
+
const siteUrl = window.location.href;
|
|
1528
1542
|
const win = window.open('about:blank', '_blank');
|
|
1529
1543
|
if (win) {
|
|
1530
1544
|
const doc = win.document;
|
|
1531
|
-
doc.title = "Google Classroom";
|
|
1532
|
-
const link = doc.createElement('link');
|
|
1533
|
-
link.rel = 'icon';
|
|
1534
|
-
link.href = 'https://ssl.gstatic.com/classroom/favicon.png';
|
|
1535
|
-
doc.head.appendChild(link);
|
|
1536
|
-
|
|
1537
|
-
const frame = doc.createElement('iframe');
|
|
1538
|
-
frame.style.border = 'none';
|
|
1539
|
-
frame.style.width = '100vw';
|
|
1540
|
-
frame.style.height = '100vh';
|
|
1541
|
-
frame.style.margin = '0';
|
|
1542
|
-
frame.style.position = 'fixed';
|
|
1543
|
-
frame.style.top = '0';
|
|
1544
|
-
frame.style.left = '0';
|
|
1545
|
-
frame.allow = 'autoplay; fullscreen; gamepad';
|
|
1545
|
+
doc.title = "Home - Google Classroom";
|
|
1546
1546
|
|
|
1547
|
+
let gameHtml = '';
|
|
1547
1548
|
try {
|
|
1548
1549
|
const res = await fetch(`https://raw.githubusercontent.com/gn-math/html/main/${filename}`);
|
|
1549
1550
|
if (res.ok) {
|
|
1550
|
-
|
|
1551
|
-
if (
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
frame.srcdoc = html;
|
|
1555
|
-
} else {
|
|
1556
|
-
frame.src = `https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}`;
|
|
1551
|
+
gameHtml = await res.text();
|
|
1552
|
+
if (gameHtml && gameHtml.length > 50) {
|
|
1553
|
+
gameHtml = gameHtml.replace(/https?:\/\/cdn\.jsdelivr\.net\/gh\//g, 'https://fastly.jsdelivr.net/gh/');
|
|
1554
|
+
gameHtml = gameHtml.replace(/https?:\/\/cdn\.jsdelivr\.net\/npm\//g, 'https://fastly.jsdelivr.net/npm/');
|
|
1557
1555
|
}
|
|
1558
|
-
} else {
|
|
1559
|
-
frame.src = `https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}`;
|
|
1560
1556
|
}
|
|
1561
|
-
} catch (e) {
|
|
1562
|
-
|
|
1557
|
+
} catch (e) {}
|
|
1558
|
+
|
|
1559
|
+
doc.open();
|
|
1560
|
+
doc.write(`
|
|
1561
|
+
<!DOCTYPE html>
|
|
1562
|
+
<html>
|
|
1563
|
+
<head>
|
|
1564
|
+
<title>Home - Google Classroom</title>
|
|
1565
|
+
<link rel="icon" href="https://ssl.gstatic.com/classroom/favicon.png">
|
|
1566
|
+
<style>
|
|
1567
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
1568
|
+
body { background: #000; overflow: hidden; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
|
|
1569
|
+
#game-frame { width: 100vw; height: 100vh; border: none; position: fixed; top: 0; left: 0; z-index: 1; }
|
|
1570
|
+
.reaper-bar {
|
|
1571
|
+
position: fixed; top: 12px; left: 14px; z-index: 9999;
|
|
1572
|
+
display: flex; gap: 8px; align-items: center;
|
|
1573
|
+
background: rgba(3, 8, 18, 0.88); backdrop-filter: blur(8px);
|
|
1574
|
+
border: 1.5px solid rgba(0, 136, 255, 0.4); border-radius: 8px; padding: 6px 12px;
|
|
1575
|
+
box-shadow: 0 4px 20px rgba(0,0,0,0.7);
|
|
1576
|
+
opacity: 0.85; transition: opacity 0.2s ease, border-color 0.2s ease;
|
|
1577
|
+
}
|
|
1578
|
+
.reaper-bar:hover { opacity: 1; border-color: #00d2ff; }
|
|
1579
|
+
.btn-action {
|
|
1580
|
+
background: #041022; color: #00d2ff; border: 1px solid rgba(0, 136, 255, 0.4);
|
|
1581
|
+
padding: 5px 12px; border-radius: 6px; font-size: 11px; font-weight: 800;
|
|
1582
|
+
cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; gap: 4px;
|
|
1583
|
+
transition: all 0.2s ease; font-family: inherit;
|
|
1584
|
+
}
|
|
1585
|
+
.btn-action:hover { background: #0088ff; color: #fff; box-shadow: 0 0 10px rgba(0,136,255,0.6); }
|
|
1586
|
+
.reaper-watermark {
|
|
1587
|
+
position: fixed; bottom: 10px; right: 14px; z-index: 9999;
|
|
1588
|
+
font-family: serif; font-weight: 900; font-size: 13px; letter-spacing: 0.12em;
|
|
1589
|
+
color: rgba(255, 255, 255, 0.35); text-shadow: 0 0 10px rgba(0, 136, 255, 0.6);
|
|
1590
|
+
pointer-events: none; user-select: none;
|
|
1591
|
+
}
|
|
1592
|
+
</style>
|
|
1593
|
+
<script>
|
|
1594
|
+
// Client-Side Ad & Pop-up Blocker
|
|
1595
|
+
window.open = function() { console.log('[REAPER SHIELD] Ad pop-up blocked'); return null; };
|
|
1596
|
+
<\/script>
|
|
1597
|
+
</head>
|
|
1598
|
+
<body>
|
|
1599
|
+
<div class="reaper-bar">
|
|
1600
|
+
<a href="${siteUrl}" class="btn-action" title="Return to Reaper Hub Portal">⚡ BACK TO SITE</a>
|
|
1601
|
+
<button onclick="document.getElementById('game-frame').requestFullscreen()" class="btn-action">⛶ FULLSCREEN</button>
|
|
1602
|
+
<button onclick="document.getElementById('game-frame').contentWindow.location.reload()" class="btn-action">🔄 RELOAD</button>
|
|
1603
|
+
</div>
|
|
1604
|
+
<div class="reaper-watermark">REAPER HUB</div>
|
|
1605
|
+
<iframe id="game-frame" allow="autoplay; fullscreen; gamepad" ${gameHtml ? '' : `src="https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}"`}></iframe>
|
|
1606
|
+
</body>
|
|
1607
|
+
</html>
|
|
1608
|
+
`);
|
|
1609
|
+
doc.close();
|
|
1610
|
+
|
|
1611
|
+
if (gameHtml) {
|
|
1612
|
+
const f = doc.getElementById('game-frame');
|
|
1613
|
+
if (f) f.srcdoc = gameHtml;
|
|
1563
1614
|
}
|
|
1564
1615
|
|
|
1565
|
-
|
|
1566
|
-
doc.body.style.overflow = 'hidden';
|
|
1567
|
-
doc.body.appendChild(frame);
|
|
1568
|
-
this.showToast("Game launched in about:blank tab.");
|
|
1616
|
+
this.showToast("Game opened in about:blank tab with watermark & return controls.");
|
|
1569
1617
|
}
|
|
1570
1618
|
}
|
|
1571
1619
|
|
|
1620
|
+
toggleAutoAboutBlank(enabled) {
|
|
1621
|
+
localStorage.setItem('reaper_auto_about_blank', enabled ? 'true' : 'false');
|
|
1622
|
+
this.showToast(enabled ? "Auto about:blank cloak enabled on every visit." : "Auto about:blank disabled.");
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1572
1625
|
openSiteAboutBlank() {
|
|
1573
1626
|
const win = window.open('about:blank', '_blank');
|
|
1574
1627
|
if (win) {
|
|
1575
1628
|
const doc = win.document;
|
|
1576
|
-
doc.title = "
|
|
1629
|
+
doc.title = "Home - Google Classroom";
|
|
1577
1630
|
const link = doc.createElement('link');
|
|
1578
1631
|
link.rel = 'icon';
|
|
1579
1632
|
link.href = 'https://ssl.gstatic.com/classroom/favicon.png';
|
package/js/security-shield.js
CHANGED
|
@@ -217,6 +217,15 @@
|
|
|
217
217
|
count++;
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
|
+
|
|
221
|
+
// Kill client-side third-party ad script injections & tracking pop-up tags
|
|
222
|
+
const adNodes = document.querySelectorAll('script[src*="googlesyndication"], script[src*="doubleclick"], script[src*="adnxs"], script[src*="monetag"], script[src*="popcash"], script[src*="propellerads"], div[class*="ad-banner" i], div[id*="ad-container" i]');
|
|
223
|
+
for (let i = 0; i < adNodes.length; i++) {
|
|
224
|
+
if (adNodes[i] && adNodes[i].parentNode) {
|
|
225
|
+
adNodes[i].parentNode.removeChild(adNodes[i]);
|
|
226
|
+
count++;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
220
229
|
} catch (e) {}
|
|
221
230
|
|
|
222
231
|
this.blockedCount += count;
|
package/main/index.html
CHANGED
|
@@ -659,6 +659,26 @@
|
|
|
659
659
|
<!-- SUBTAB 2: PREFERENCES & AUDIO -->
|
|
660
660
|
<div id="st-content-prefs" style="display: none;">
|
|
661
661
|
<div style="display: flex; flex-direction: column; gap: 1.2rem;">
|
|
662
|
+
|
|
663
|
+
<!-- Auto about:blank toggle -->
|
|
664
|
+
<div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
|
|
665
|
+
<div>
|
|
666
|
+
<strong style="color: #fff; font-size: 0.95rem;">🌐 Auto-Cloak in about:blank on Visit</strong>
|
|
667
|
+
<p style="color: #88aacc; font-size: 0.8rem;">Automatically opens Reaper Hub in an undetectable about:blank tab every time you visit.</p>
|
|
668
|
+
</div>
|
|
669
|
+
<input type="checkbox" id="auto-aboutblank-toggle" style="width: 22px; height: 22px; cursor: pointer; accent-color: #00d2ff;" onchange="app.toggleAutoAboutBlank(this.checked)">
|
|
670
|
+
</div>
|
|
671
|
+
|
|
672
|
+
<!-- Launch in about:blank button -->
|
|
673
|
+
<div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
|
|
674
|
+
<div>
|
|
675
|
+
<strong style="color: #00d2ff; font-size: 0.95rem;">🚀 Launch Site in about:blank Tab</strong>
|
|
676
|
+
<p style="color: #88aacc; font-size: 0.8rem;">Spawn this entire portal inside a clean Google Classroom disguised about:blank window.</p>
|
|
677
|
+
</div>
|
|
678
|
+
<button class="btn-primary" onclick="app.openSiteAboutBlank()" style="font-size: 0.82rem; padding: 0.5rem 1.2rem;">LAUNCH CLOAK</button>
|
|
679
|
+
</div>
|
|
680
|
+
|
|
681
|
+
<!-- SFX toggle -->
|
|
662
682
|
<div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
|
|
663
683
|
<div>
|
|
664
684
|
<strong style="color: #fff; font-size: 0.95rem;">🔊 Sci-Fi Synthesizer Sound FX</strong>
|
package/main/js/app.js
CHANGED
|
@@ -179,6 +179,18 @@ class ReaperHubApp {
|
|
|
179
179
|
|
|
180
180
|
this.syncPlaytimeToDB();
|
|
181
181
|
|
|
182
|
+
// 10. Auto about:blank Cloak on Visit Check
|
|
183
|
+
const isAutoAboutBlank = localStorage.getItem('reaper_auto_about_blank') === 'true';
|
|
184
|
+
const autoBlankToggle = document.getElementById('auto-aboutblank-toggle');
|
|
185
|
+
if (autoBlankToggle) autoBlankToggle.checked = isAutoAboutBlank;
|
|
186
|
+
|
|
187
|
+
if (isAutoAboutBlank && window.self === window.top && !window.location.protocol.includes('about:')) {
|
|
188
|
+
if (sessionStorage.getItem('reaper_cloaked_session') !== 'true') {
|
|
189
|
+
sessionStorage.setItem('reaper_cloaked_session', 'true');
|
|
190
|
+
this.openSiteAboutBlank();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
182
194
|
console.log(`[REAPER HUB] System Online. Role: ${this.currentUser.rank.toUpperCase()}`);
|
|
183
195
|
}
|
|
184
196
|
|
|
@@ -1525,55 +1537,96 @@ class ReaperHubApp {
|
|
|
1525
1537
|
async openGameAboutBlank() {
|
|
1526
1538
|
if (!this.currentGame) return;
|
|
1527
1539
|
const filename = this.currentGame.url.split('/').pop();
|
|
1540
|
+
const gameName = this.currentGame.name;
|
|
1541
|
+
const siteUrl = window.location.href;
|
|
1528
1542
|
const win = window.open('about:blank', '_blank');
|
|
1529
1543
|
if (win) {
|
|
1530
1544
|
const doc = win.document;
|
|
1531
|
-
doc.title = "Google Classroom";
|
|
1532
|
-
const link = doc.createElement('link');
|
|
1533
|
-
link.rel = 'icon';
|
|
1534
|
-
link.href = 'https://ssl.gstatic.com/classroom/favicon.png';
|
|
1535
|
-
doc.head.appendChild(link);
|
|
1536
|
-
|
|
1537
|
-
const frame = doc.createElement('iframe');
|
|
1538
|
-
frame.style.border = 'none';
|
|
1539
|
-
frame.style.width = '100vw';
|
|
1540
|
-
frame.style.height = '100vh';
|
|
1541
|
-
frame.style.margin = '0';
|
|
1542
|
-
frame.style.position = 'fixed';
|
|
1543
|
-
frame.style.top = '0';
|
|
1544
|
-
frame.style.left = '0';
|
|
1545
|
-
frame.allow = 'autoplay; fullscreen; gamepad';
|
|
1545
|
+
doc.title = "Home - Google Classroom";
|
|
1546
1546
|
|
|
1547
|
+
let gameHtml = '';
|
|
1547
1548
|
try {
|
|
1548
1549
|
const res = await fetch(`https://raw.githubusercontent.com/gn-math/html/main/${filename}`);
|
|
1549
1550
|
if (res.ok) {
|
|
1550
|
-
|
|
1551
|
-
if (
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
frame.srcdoc = html;
|
|
1555
|
-
} else {
|
|
1556
|
-
frame.src = `https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}`;
|
|
1551
|
+
gameHtml = await res.text();
|
|
1552
|
+
if (gameHtml && gameHtml.length > 50) {
|
|
1553
|
+
gameHtml = gameHtml.replace(/https?:\/\/cdn\.jsdelivr\.net\/gh\//g, 'https://fastly.jsdelivr.net/gh/');
|
|
1554
|
+
gameHtml = gameHtml.replace(/https?:\/\/cdn\.jsdelivr\.net\/npm\//g, 'https://fastly.jsdelivr.net/npm/');
|
|
1557
1555
|
}
|
|
1558
|
-
} else {
|
|
1559
|
-
frame.src = `https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}`;
|
|
1560
1556
|
}
|
|
1561
|
-
} catch (e) {
|
|
1562
|
-
|
|
1557
|
+
} catch (e) {}
|
|
1558
|
+
|
|
1559
|
+
doc.open();
|
|
1560
|
+
doc.write(`
|
|
1561
|
+
<!DOCTYPE html>
|
|
1562
|
+
<html>
|
|
1563
|
+
<head>
|
|
1564
|
+
<title>Home - Google Classroom</title>
|
|
1565
|
+
<link rel="icon" href="https://ssl.gstatic.com/classroom/favicon.png">
|
|
1566
|
+
<style>
|
|
1567
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
1568
|
+
body { background: #000; overflow: hidden; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
|
|
1569
|
+
#game-frame { width: 100vw; height: 100vh; border: none; position: fixed; top: 0; left: 0; z-index: 1; }
|
|
1570
|
+
.reaper-bar {
|
|
1571
|
+
position: fixed; top: 12px; left: 14px; z-index: 9999;
|
|
1572
|
+
display: flex; gap: 8px; align-items: center;
|
|
1573
|
+
background: rgba(3, 8, 18, 0.88); backdrop-filter: blur(8px);
|
|
1574
|
+
border: 1.5px solid rgba(0, 136, 255, 0.4); border-radius: 8px; padding: 6px 12px;
|
|
1575
|
+
box-shadow: 0 4px 20px rgba(0,0,0,0.7);
|
|
1576
|
+
opacity: 0.85; transition: opacity 0.2s ease, border-color 0.2s ease;
|
|
1577
|
+
}
|
|
1578
|
+
.reaper-bar:hover { opacity: 1; border-color: #00d2ff; }
|
|
1579
|
+
.btn-action {
|
|
1580
|
+
background: #041022; color: #00d2ff; border: 1px solid rgba(0, 136, 255, 0.4);
|
|
1581
|
+
padding: 5px 12px; border-radius: 6px; font-size: 11px; font-weight: 800;
|
|
1582
|
+
cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; gap: 4px;
|
|
1583
|
+
transition: all 0.2s ease; font-family: inherit;
|
|
1584
|
+
}
|
|
1585
|
+
.btn-action:hover { background: #0088ff; color: #fff; box-shadow: 0 0 10px rgba(0,136,255,0.6); }
|
|
1586
|
+
.reaper-watermark {
|
|
1587
|
+
position: fixed; bottom: 10px; right: 14px; z-index: 9999;
|
|
1588
|
+
font-family: serif; font-weight: 900; font-size: 13px; letter-spacing: 0.12em;
|
|
1589
|
+
color: rgba(255, 255, 255, 0.35); text-shadow: 0 0 10px rgba(0, 136, 255, 0.6);
|
|
1590
|
+
pointer-events: none; user-select: none;
|
|
1591
|
+
}
|
|
1592
|
+
</style>
|
|
1593
|
+
<script>
|
|
1594
|
+
// Client-Side Ad & Pop-up Blocker
|
|
1595
|
+
window.open = function() { console.log('[REAPER SHIELD] Ad pop-up blocked'); return null; };
|
|
1596
|
+
<\/script>
|
|
1597
|
+
</head>
|
|
1598
|
+
<body>
|
|
1599
|
+
<div class="reaper-bar">
|
|
1600
|
+
<a href="${siteUrl}" class="btn-action" title="Return to Reaper Hub Portal">⚡ BACK TO SITE</a>
|
|
1601
|
+
<button onclick="document.getElementById('game-frame').requestFullscreen()" class="btn-action">⛶ FULLSCREEN</button>
|
|
1602
|
+
<button onclick="document.getElementById('game-frame').contentWindow.location.reload()" class="btn-action">🔄 RELOAD</button>
|
|
1603
|
+
</div>
|
|
1604
|
+
<div class="reaper-watermark">REAPER HUB</div>
|
|
1605
|
+
<iframe id="game-frame" allow="autoplay; fullscreen; gamepad" ${gameHtml ? '' : `src="https://fastly.jsdelivr.net/gh/gn-math/html@main/${filename}"`}></iframe>
|
|
1606
|
+
</body>
|
|
1607
|
+
</html>
|
|
1608
|
+
`);
|
|
1609
|
+
doc.close();
|
|
1610
|
+
|
|
1611
|
+
if (gameHtml) {
|
|
1612
|
+
const f = doc.getElementById('game-frame');
|
|
1613
|
+
if (f) f.srcdoc = gameHtml;
|
|
1563
1614
|
}
|
|
1564
1615
|
|
|
1565
|
-
|
|
1566
|
-
doc.body.style.overflow = 'hidden';
|
|
1567
|
-
doc.body.appendChild(frame);
|
|
1568
|
-
this.showToast("Game launched in about:blank tab.");
|
|
1616
|
+
this.showToast("Game opened in about:blank tab with watermark & return controls.");
|
|
1569
1617
|
}
|
|
1570
1618
|
}
|
|
1571
1619
|
|
|
1620
|
+
toggleAutoAboutBlank(enabled) {
|
|
1621
|
+
localStorage.setItem('reaper_auto_about_blank', enabled ? 'true' : 'false');
|
|
1622
|
+
this.showToast(enabled ? "Auto about:blank cloak enabled on every visit." : "Auto about:blank disabled.");
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1572
1625
|
openSiteAboutBlank() {
|
|
1573
1626
|
const win = window.open('about:blank', '_blank');
|
|
1574
1627
|
if (win) {
|
|
1575
1628
|
const doc = win.document;
|
|
1576
|
-
doc.title = "
|
|
1629
|
+
doc.title = "Home - Google Classroom";
|
|
1577
1630
|
const link = doc.createElement('link');
|
|
1578
1631
|
link.rel = 'icon';
|
|
1579
1632
|
link.href = 'https://ssl.gstatic.com/classroom/favicon.png';
|
|
@@ -217,6 +217,15 @@
|
|
|
217
217
|
count++;
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
|
+
|
|
221
|
+
// Kill client-side third-party ad script injections & tracking pop-up tags
|
|
222
|
+
const adNodes = document.querySelectorAll('script[src*="googlesyndication"], script[src*="doubleclick"], script[src*="adnxs"], script[src*="monetag"], script[src*="popcash"], script[src*="propellerads"], div[class*="ad-banner" i], div[id*="ad-container" i]');
|
|
223
|
+
for (let i = 0; i < adNodes.length; i++) {
|
|
224
|
+
if (adNodes[i] && adNodes[i].parentNode) {
|
|
225
|
+
adNodes[i].parentNode.removeChild(adNodes[i]);
|
|
226
|
+
count++;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
220
229
|
} catch (e) {}
|
|
221
230
|
|
|
222
231
|
this.blockedCount += count;
|
package/package.json
CHANGED
|
@@ -217,6 +217,15 @@
|
|
|
217
217
|
count++;
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
|
+
|
|
221
|
+
// Kill client-side third-party ad script injections & tracking pop-up tags
|
|
222
|
+
const adNodes = document.querySelectorAll('script[src*="googlesyndication"], script[src*="doubleclick"], script[src*="adnxs"], script[src*="monetag"], script[src*="popcash"], script[src*="propellerads"], div[class*="ad-banner" i], div[id*="ad-container" i]');
|
|
223
|
+
for (let i = 0; i < adNodes.length; i++) {
|
|
224
|
+
if (adNodes[i] && adNodes[i].parentNode) {
|
|
225
|
+
adNodes[i].parentNode.removeChild(adNodes[i]);
|
|
226
|
+
count++;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
220
229
|
} catch (e) {}
|
|
221
230
|
|
|
222
231
|
this.blockedCount += count;
|