Greasemonkey: Mendukung waktu menjalankan skrip mulai dokumen

Dibuat pada 25 Jul 2017  ·  17Komentar  ·  Sumber: greasemonkey/greasemonkey

Dukung document-start untuk @run-at .

Lihat #2483 untuk detail lebih lanjut. Ini mungkin "tidak mungkin".

Semua 17 komentar

Anda dapat menggunakan properti run_at dari kunci manifes content_scripts .

Saya berbagi rasa kasihan tentang Chrome dengan Anda 4 tahun yang lalu. Sekarang lagi untuk Firefox. 😭.

Saya ingin menyusun ulang saran saya di https://bugs.chromium.org/p/chromium/issues/detail?id=257956

tabs.insertCSS/executeScript harus memasukkan CSS/JS hingga URL tab disetel non-kosong (bukan null, bukan undefined, bukan string kosong ""), dan dibatalkan jika tab dihapus/diubah

API WebExtension harus ditingkatkan.

@iology mengapa Anda

Berikut ini harus menjelaskan bagaimana melakukannya menggunakan metode saya: (harus bekerja dengan andal)

/**
 * <strong i="8">@typedef</strong> UserScript
 * <strong i="9">@property</strong> {Object} header The parsed header of a script
 * <strong i="10">@property</strong> {String} script The raw script data
 * <strong i="11">@property</strong> {String} type The script media type (in case a script is WebAssembly
 *                         or something other than JavaScript)
 */

/** The load state of this script. Used by the `matches()` function */
const READY_STATE = document.readyState;

(async () => {
    (await (browser.storage.local.get({scripts: []}) // Excuse this horrible code style
        .then(ret => ret.scripts)))                  // of combining `await` and `.then()`
        .forEach(/* <strong i="12">@param</strong> {UserScript} script */ script => {
            if (matches(script.header)) {
                let scriptTag = document.createElement("script");
                scriptTag.setAttribute("type", script.type)
                scriptTag.textContent = script.script;
                document.appendChild(scriptTag);
            }
        });
})();

/**
 * Checks if this script matches this page and @run-at property.
 * 
 * <strong i="13">@param</strong> {Object} scriptHeader The parsed header of a script
 * <strong i="14">@return</strong> {boolean} `true` if this page matches, `false` otherwise
 */
function matches(scriptHeader) {
    // Uses window.location and READY_STATE.
    // TODO: Implement
}

@ExE-Boss Pada saat Anda mengambil skrip dari penyimpanan ekstensi, bagian halaman sudah dimuat.

Saya menyadari hal itu, tetapi saya tidak benar-benar melihat cara lain untuk melakukannya karena fakta bahwa WebExtensions secara inheren tidak sinkron.

@ExE-Boss, ada bugzilla, https://bugzilla.mozilla.org/show_bug.cgi?id=1332273 , yang sepertinya berkembang dengan baik dan akan membantu menyelesaikan masalah @document-start. Apakah itu akan mendarat untuk FF57, saya tidak yakin.

Saya menyadari hal itu, tetapi saya tidak benar-benar melihat cara lain untuk melakukannya karena fakta bahwa WebExtensions secara inheren tidak sinkron.

@ExE-Boss Itu benar-benar masalah yang kami coba selesaikan.

Saya mencoba menyelesaikannya juga, tetapi solusi saya benar-benar hanya berfungsi cukup baik untuk #2525, karena pada saat itu seluruh halaman telah dimuat penuh.

Violentmonkey memiliki masalah ini juga, tidak yakin apa yang digunakan sihir hitam Tampermonkey, tetapi ia mampu menyuntikkan skrip dengan andal pada document-start .

Tampermonkey 2.9 dan sebelumnya adalah GPL-3.0 dan dipublikasikan di GitHub . Saya sudah mencoba mencarinya, dan pada awalnya saya pikir itu menggunakan sync XHR , tetapi setelah melihatnya sedikit, saya tidak tahu bagaimana mencapainya, tetapi entah bagaimana itu karena dukungan untuk itu ditambahkan di versi 2.6 .2767 .

Lihat di sini mengapa Tampermonekey menjadi sumber tertutup:

Saya tidak tertarik untuk membajak barang, tidak akan terlalu sulit untuk membalikkan logika Tampermonkey tetapi tidak sah untuk melakukan itu.

@Sxderp Itu hanya untuk Firefox 57, bug itu mungkin masih dapat diatasi di 58+.

FYI, Tampermonkey juga tidak dapat diandalkan saat memulai dokumen. Ada opsi injeksi "instan" (yang sangat hacky) yang mempercepat, tetapi pada halaman sederhana seperti xkcd.com, saya masih mendapatkan flash sebelum CSS saya (yang selalu disuntikkan saat dokumen mulai) dimuat. Saya juga terkadang mendapatkan flash di situs lain.

Membalikkan kode Tampermonkey bukanlah cara untuk mengetahui hal ini. Plus, metode sebenarnya yang mereka gunakan dapat ditemukan di forum mereka, yang disarankan oleh pengguna lain. Menyalin metode bukanlah salinan-vio, hanya menyalin kode itu sendiri.

Tapi kami tahu ini adalah solusi yang tidak sempurna, dan kami menginginkan solusi yang sempurna.

Jika suatu metode ditemukan untuk membuat ini berfungsi, dapatkah ada cara agar skrip membaca setidaknya sebagian dari opsi konfigurasinya secara sinkron? Sebagai contoh jenis masalah yang akan diselesaikan, lihat https://github.com/ccd0/4chan-x/issues/1627. Di sini saya perlu menonaktifkan beberapa kode pada halaman, tetapi saya juga ingin memiliki opsi untuk tidak menonaktifkan kode. Dan banyak pengguna menghapus localStorage di akhir setiap sesi browser.

Jika suatu metode ditemukan untuk membuat ini berfungsi, dapatkah ada cara agar skrip membaca setidaknya sebagian dari opsi konfigurasinya secara sinkron?

Tidak dalam jangka pendek. Tidak ada cara untuk berkomunikasi dengan penyimpanan (get|set)Value secara sinkron. Mungkin semacam injeksi pada bagian GM di mana variabel dengan nilai konfigurasi disuntikkan ke dalam lingkup global skrip. Itu yang terbaik yang bisa saya pikirkan, dan itu tidak terlalu bagus.

Mungkin semacam injeksi pada bagian GM di mana variabel dengan nilai konfigurasi disuntikkan ke dalam lingkup global skrip. Itu yang terbaik yang bisa saya pikirkan, dan itu tidak terlalu bagus.

Agaknya itu akan menjadi bagian dari objek GM . Sesuatu seperti GM.initValues.yourVariable .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat