Greasemonkey: WebExt: рд╕рднреА рддреАрди рдмрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрд╕рдордп рдкрд░

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдлрд╝рд░ре░ 2017  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: greasemonkey/greasemonkey

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЖрдУ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░рди рдЯрд╛рдЗрдо рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рд╕рднреА рддреАрди рдмрд╛рд░ рдЪрд▓рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд -- рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ document_start ред

рдореЗрд░реЗ рдЕрдм рддрдХ рдХреЗ рд╢реЛрдз рдХреЗ рд▓рд┐рдП https://github.com/arantius/greasemonkey/tree/8a255bde1aa6312715740fd0157d582a2d6cb183 рджреЗрдЦреЗрдВ, рдЬрд╣рд╛рдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ:

  • рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред (рдЗрд╕рдореЗрдВ рд╕реНрдЯреЛрд░реЗрдЬ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреА/рдЬреЛ рднреА рдПрдкреАрдЖрдИ, рдЬрд╣рд╛рдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред)
  • рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ ( рдХреНрдпрд╛? ) рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ ..
  • .. рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tabs.executeScript() рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред

рдпрд╣ "рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ" рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдХреЛрдИ рднреА рдШрдЯрдирд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддреАрдиреЛрдВ рд░рди рдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡рд╣рд╛рдБ webNavigation рдХрд╛ onBeforeNavigate рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЬрд▓реНрдж рд╣реИ , рдпрд╣ (рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ) рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЖрдЧ рд▓рдЧрддреА рд╣реИ, рдЬрдм рд╡рд░реНрддрдорд╛рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд▓рд╛ рдмрд┐рдВрджреБ onCommitted , рдФрд░ рдЙрд╕ рд╕рдордп рд╢реБрд░реВ рд╣реЛрдиреЗ рдореЗрдВ рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рдЗрдирд▓рд╛рдЗрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рдЪреБрдХреА рд╣реИрдВред

рд╕рднреА 6 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрдиреБрд╕рдВрдзрд╛рди рдХрд░рдирд╛:

  • рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ webRequest рдХреЗ рдмрдЬрд╛рдп webNavigation ред рдХреНрдпрд╛ рдпрд╣ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рдореЗрдВ рдПрдХ рд╕рдВрднрд╛рд▓ рджреЗрддрд╛ рд╣реИ?
  • рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП document_start рдкрд░ рдПрдХ webext рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИред (рдХреНрдпреЛрдВрдХрд┐ async рдХреБрдЫ рднреА рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдзрдХреНрдХрд╛ рджреЗрдЧрд╛ред)

рдкреБрди: https://bugzilla.mozilla.org/show_bug.cgi?id=1332273#c8

рдореИрдВ рдПрдХ рдмреНрд▓реЙрдм (рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ) рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдмрд╛рдж рдореЗрдВ (рдХреЗрд╡рд▓) рдЙрд╕рдХрд╛ рдпреВрдЖрд░рдПрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЙрд╕ рдпреВрдЖрд░рдПрд▓ (рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ) рдХреЛ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдкреГрд╖реНрда рдЗрдВрдбреЗрдХреНрд╕рдб рдбреАрдмреА рдореЗрдВ рдмреНрд▓реЙрдмреНрд╕ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕рдордп рдкрд░ URL.createObjectURL() рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреНрд▓реЙрдм рдпреВрдЖрд░рдЖрдИ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдкреАрдЖрдИ рдореЗрдВ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░

Firefox рдкрд░ рдирд┐рдЬреА рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдореЛрдб рдЕрдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ?

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ?

рдпрд╣ document_start рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рджрд┐рдЦрддрд╛ рд╣реИ: (рд╕рдВрднрд╡рддрдГ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдЯреИрдм рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)

// execute `document_start` scripts here...

document.addEventListener("DOMContentLoaded", event => {
    // execute `document_end` scripts here...
});

window.addEventListener("load", event => {
    // execute `document_idle` scripts here...
});

рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ: (рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)

let run = [false, false, false];

document_start();

if (document.readyState === "complete") {
    document_idle();
} else if (document.readyState === "interactive") {
    document_end();
}

document.onreadystatechange = () => {
    switch (document.readyState) {
        case "loading":     break;
        case "interactive": document_end();
        case "complete":    document_idle();
    }
};

function document_start() {
    if (run[0]) return;
    run[0] = true;

    // execute `document_start` scripts here...
}

function document_end() {
    if (!run[0]) document_start();
    if (run[1])  return;
    run[1] = true;

    // execute `document_end` scripts here...
}

function document_idle() {
    if (!run[1]) document_end();
    if (run[2])  return;
    run[2] = true;

    // execute `document_idle` scripts here...
}

рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдЕрд▓рдЧ рд╕рдордп рдкрд░ рдЪрд▓рддреА рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП manifest.json рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: (рд╢рд╛рдпрдж рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА (рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ))

"content_scripts": [
    {
        "matches": ["<all_urls>"],
        "run_at": "document_start",
        "js": ["document_start_handler.js"]
    },
    {
        "matches": ["<all_urls>"],
        "run_at": "document_end",
        "js": ["document_end_handler.js"]
    },
    {
        "matches": ["<all_urls>"],
        "run_at": "document_idle",
        "js": ["document_idle_handler.js"]
    }
]

jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ, рдЬреЛ рдХрдо рд╕реЗ рдХрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: (рдлрд┐рд░ рд╕реЗ, document_start рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди jQuery рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)

function document_start() {
    // execute `document_start` scripts here...
}

function document_end() {
    // execute `document_end` scripts here...
}

function document_idle() {
    // execute `document_idle` scripts here...
}

// Use jQuery to execute all the functions:
document_start();

// `$(document).ready(document_end)` is deprecated since 3.0
$(document_end);

// jQuery used to have a method for this: `$(window).load(document_idle)`
if (document.readyState === "complete") {
    document_idle();
} else {
    $(window).on("load", document_idle);
}

рдЬреИрд╕рд╛ рд▓рд┐рдЦрд╛ рд╣реИ рдпрд╣ рдореБрджреНрджрд╛ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

2525, #2526

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

GuardianMajor picture GuardianMajor  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

an-electric-sheep picture an-electric-sheep  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

silverwind picture silverwind  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lainverse picture lainverse  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

moham96 picture moham96  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ