File size: 3,046 Bytes
3d7d9b5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/// Builds the complete initialization script injected into every child webview
/// before any page JavaScript runs.
pub fn build_init_script(blocked_domains_json: &str) -> String {
    let adblock_layer1 = include_str!("../../resources/scripts/adblock_layer1.js");
    let cookie_consent = include_str!("../../resources/scripts/cookie_consent.js");
    let webrtc_protect = include_str!("../../resources/scripts/webrtc_protect.js");
    let canvas_noise = include_str!("../../resources/scripts/canvas_noise.js");
    let hover_overlay = hover_overlay_script();
    let vault_detector = vault_detector_script();
    let autofill_suppress = autofill_suppress_script();
    let video_ad_scriptlets = include_str!("../../resources/scripts/video_ad_scriptlets.js");

    format!(
        r#"(function() {{

'use strict';

window.__MUSE_BLOCKED_DOMAINS__ = {blocked_domains_json};

document.addEventListener('contextmenu', function(e) {{

    e.preventDefault();

    try {{

        const target = e.target;

        const info = {{

            x: e.screenX, y: e.screenY, clientX: e.clientX, clientY: e.clientY,

            tagName: target.tagName, src: target.src || null,

            href: target.closest('a') ? target.closest('a').href : null,

            text: window.getSelection().toString().slice(0, 200) || null,

            pageUrl: location.href,

        }};

        window.__TAURI_INTERNALS__.invoke('browser_context_menu', info).catch(function() {{}});

    }} catch(ex) {{}}

}}, true);

}})();

{video_ad_scriptlets}

{adblock_layer1}

{cookie_consent}

{webrtc_protect}

{canvas_noise}

{autofill_suppress}

{hover_overlay}

{vault_detector}"#
    )
}

/// Image hover overlay script.
pub fn hover_overlay_script() -> &'static str {
    include_str!("../../resources/scripts/hover_overlay.js")
}

/// Password vault form detection + autofill script.
pub fn vault_detector_script() -> &'static str {
    include_str!("../../resources/scripts/vault_detector.js")
}

/// Suppress native browser autofill so Muse vault is the only credential source.
pub fn autofill_suppress_script() -> &'static str {
    include_str!("../../resources/scripts/autofill_suppress.js")
}

/// Known ad/tracker domains for fast JS-side lookup
pub fn blocked_domains_json() -> String {
    let domains: &[&str] = &[
        "googlesyndication.com", "doubleclick.net", "google-analytics.com",
        "googletagmanager.com", "facebook.net", "connect.facebook.net",
        "amazon-adsystem.com", "criteo.com", "outbrain.com", "taboola.com",
        "scorecardresearch.com", "quantserve.com", "adnxs.com", "rubiconproject.com",
        "pubmatic.com", "openx.net", "moatads.com", "hotjar.com", "mixpanel.com",
        "segment.io", "segment.com", "amplitude.com", "fullstory.com",
        "onetrust.com", "cookielaw.org", "trustarc.com", "consensu.org",
        "2mdn.net", "adsymptotic.com", "advertising.com", "bluekai.com",
    ];
    serde_json::to_string(domains).unwrap_or_else(|_| "[]".to_string())
}