Greasemonkey: Izinkan menginstal file lokal

Dibuat pada 12 Okt 2017  ·  44Komentar  ·  Sumber: greasemonkey/greasemonkey

Di masa lalu Anda bisa File>Open a .user.js dan itu akan menginstal. Di 4.0 sejauh ini, tidak apa-apa, hanya membuka file.

Semua 44 komentar

Mungkin ini (mencocokkan dokumen pola)? Menggunakan * dalam pemilih kecocokan untuk skema hanya menggumpal ke http atau https. Sarankan untuk menambahkan kecocokan tambahan untuk file:// .

Itu atau pemilih <all_urls> .

Menambahkan pola kecocokan untuk mendeteksi skrip file:/// hanya menyebabkan kita memulai XHR yang gagal membaca konten di URL itu, yang mengejutkan.

Saya telah melihat ini sedikit. Dan saya sampai pada dua kesimpulan. Masalahnya mungkin ada hubungannya dengan pelarangan akses sistem file ke WebExtensions, bahkan jika hanya dibaca melalui XHR (tidak ada sumber tentang ini secara langsung; edit: di sini di bagian paling bawah). Atau bisa juga terkait dengan kebijakan asal yang sama .

Mulai Gecko 1.9, file hanya diperbolehkan membaca file tertentu lainnya. Secara khusus, sebuah file dapat membaca file lain hanya jika direktori induk dari file asal adalah direktori ancestor dari file target.

Mungkin ada baiknya memunculkan laporan bug untuk memungkinkan akses sistem file ke jalur yang ditentukan dalam manifes dengan protokol file:// .

Ya, itu mungkin aturan "tidak ada file". Tidak tahu di mana mendapatkan panduan resmi tentang itu, tetapi saya tahu itu benar sekarang setelah saya memikirkannya. Anda hanya mendapatkan pengecualian yang sangat khusus seperti API unduhan untuk membuat file baru.

Kita bisa mencoba mencari solusi seperti langsung menangani drag/drop, atau (LOL) membaca konten tab yang sudah terbuka. Tetapi kemudian kami gagal mengambil ikon/sumber daya/kebutuhan relatif, jadi itu tetap tidak akan berjalan, tanpa lebih banyak solusi.

Bisakah Anda tidak menggunakan storage.local untuk menyimpan konten menggunakan url sebagai kunci sebelum menavigasi halaman penginstalan ? Anda sudah memiliki konten dalam variabel. Tentu saja cache harus dibersihkan setelah diinstal / jelas tidak diinstal. Akan lebih nyaman jika WebExtensions memiliki semacam penyimpanan sementara sehingga mereka tidak harus berurusan dengan penggusuran secara manual.

Saya telah bermain-main dengan apa yang saya katakan dan itu tidak sesederhana yang saya kira. Pertama, setiap skrip pengguna memiliki akses ke browser.storage.local sehingga pada dasarnya merupakan penyimpanan yang tidak aman untuk add-on seperti Greasemonkey. Kedua, hal yang sama berlaku untuk mengirim konten melalui pesan ke skrip latar belakang. Saya tidak begitu yakin bagaimana mengamankannya untuk memastikan pesan dikirim hanya dari script-detect.js . Dan karena sifat skrip yang tidak sinkron, saya tidak sepenuhnya yakin apakah script-detect.js berjalan sebelum skrip pengguna (saya akan melakukan beberapa tes tentang itu).

Dan tentu saja, kecuali saya salah, skrip latar belakang tidak menerima referensi apa pun ke DOM/konten di salah satu pendengar navigasi?

Ternyata Anda bisa mendapatkan konten halaman menggunakan onBeforeRequest dengan kecocokan di ['*://*/*.user.js'] dan kemudian membuat StreamFilter . Saya telah menerapkan beberapa kode yang menguji ini di cabang saya yang baru diterbitkan, saat ini tidak ada permintaan tarik karena tidak _memperbaiki_ apa pun. Namun, itu menghindari masalah keamanan yang saya kemukakan di posting saya sebelumnya.

Sayangnya itu tidak menyelesaikan masalah file yang dibahas. Beberapa tiket bugzilla di dalamnya:
https://bugzilla.mozilla.org/show_bug.cgi?id=1341341
https://bugzilla.mozilla.org/show_bug.cgi?id=1266960

Saya diarahkan ke sini dari #2671

Jika utas ini tentang mengimpor dari file lokal .... maka ...
Mengapa Anda menggunakan XHR untuk membaca file lokal? Ini menyebabkan segala macam komplikasi dengan asal dan izin.
Cara mudahnya adalah dengan menggunakan new FileReader() dari hasil input type="file"

Jika utas ini tentang mengenali URL file:///.....user.js sebagai skrip dan menginstalnya, itu adalah masalah yang berbeda dan solusi yang berbeda.

Cara mudahnya adalah dengan menggunakan new FileReader() dari hasil input type="file"

Ah, ini bisa berhasil. Ini tidak seanggun menavigasi ke jalur file:// dan meminta ekstensi melakukan segalanya untuk Anda, tetapi itu bisa berhasil. Mayoritas alur kerja bisa tetap sama.

import script -> script selected -> contents cached in backend -> install dialog prompt -> retrieve content from backend -> continue install as usual

Dan itu jauh lebih aman daripada metode yang saya coba gunakan saat mencoba mempertahankan alur kerja navigasi.

Menemukan contoh ekstensi web yang berfungsi menggunakan "input type="file"". Sepertinya tidak perlu di-cache, bisa langsung diimpor:
https://github.com/mdn/webextensions-examples/pull/171/files/6c066cfff4e8c662984f704cb17c8b39211ed062#diff -098de1750b345156f3cfd46f8199aa34

Sepertinya tidak perlu di-cache, bisa langsung diimpor

Bukan karena cache _dibutuhkan_, melainkan tindakan keamanan. Sama seperti saat Anda menavigasi ke .user.js, dialog akan muncul untuk memberi tahu Anda beberapa informasi tentang skrip. Saya pikir hal yang sama harus terjadi ketika Anda melakukan impor. Oleh karena itu Anda perlu menyimpan, di suatu tempat tidak di database normal, isi skrip sehingga jika pengguna mengklik tombol instal, Anda masih memilikinya dan tidak perlu meminta pengguna lagi.

Apakah ini di-cache menggunakan API penyimpanan atau hanya di objek global di suatu tempat tidak terlalu penting untuk alur kerja.

Saya juga ingin mengatakan bahwa fitur impor harus menjadi prioritas utama[1] karena akan membantu orang yang mengalami masalah migrasi. Mereka hanya dapat mengimpor file dari 3.x.

[1] Saya akan memeriksanya jika @arantius memiliki beberapa ide tentang bagaimana prosesnya seharusnya bekerja.

Saya memiliki import./Export di sejumlah add-on saya jika diperlukan contoh.

Impor dimulai oleh pengguna sehingga tidak perlu tindakan pencegahan/munculan/pemberitahuan/peringatan tambahan.

Tambahkan tombol impor (input file) ke salah satu dialog
Setelah pengguna mengkliknya, File picker terbuka.. pengguna memilih file yang diperlukan dan klik buka (semua HTML5 bawaan)
File dibaca dan diuraikan
Jika sesuai dengan USER Script, kemudian ditambahkan ke IDB
Kemudian perbarui pendengar yang sedang berjalan

Itu semuanya....

Saya melakukan hal yang sama di preferensi Impor/Ekspor, data Tema (hingga 500kb) dan banyak lainnya di pengaya saya dengan fungsi Impor/Ekspor.

Saya juga ingin mengatakan bahwa fitur impor harus menjadi prioritas utama[1]

Memang .... yang memungkinkan penulis skrip untuk menulis skrip baru dan mengimpor untuk menjalankan atau menguji dan dalam kasus peningkatan GM3 -> 4, tambahkan skrip yang terlewat.

Kode dan fungsinya sangat sederhana... beberapa baris kode yang dapat dilakukan dalam satu jam.
Anda dapat menggunakan kode saya sebagai basis jika Anda mau.

... Impor dimulai oleh pengguna sehingga tidak perlu tindakan pencegahan/munculan/pemberitahuan/peringatan tambahan. ... Jika sesuai dengan USER Script, kemudian ditambahkan ke IDB

Aku tidak yakin tentang ini. Saya tidak terlalu suka melewatkan dialog instalasi standar. Mungkin @arantius dapat memberikan beberapa wawasan tentang apa yang ingin dia lihat di addon.

Aku tidak yakin tentang ini. Saya tidak terlalu suka melewatkan dialog instalasi standar.

Dialog standar digunakan ketika pengguna dihadapkan dengan skrip pengguna dari sumber jarak jauh. Dialog konfirmasi kemudian diperlukan.

Dalam hal Impor yang dimulai oleh pengguna:

  • Pengguna memutuskan untuk mengimpor skrip
  • Pengguna mengklik tombol impor
  • Pengguna menavigasi ke skrip yang dipilih oleh pengguna
  • Apakah ada kebutuhan untuk bertanya lagi kepada pengguna dengan dialog "Apakah Anda benar-benar ingin menginstal skrip ini?" :)
    Itu tampaknya menjengkelkan. Peringatan jika terjadi kesalahan diperlukan.
  • Pengguna menavigasi ke skrip yang dipilih oleh pengguna

Tapi ini bukan jalannya... Instalasi dilakukan dengan callback (pemicu pada *.user.js)...

Tapi ini bukan jalannya... Instalasi dilakukan dengan callback (pemicu pada *.user.js)...

Saat ini, ya. Tetapi dimungkinkan untuk menambahkan tombol impor untuk file lokal. Dan jangan lakukan instalasi pada navigasi untuk file:// .

Ah, oke, untuk file lokal, itu cukup tepat. Bukan untuk file jarak jauh! ;-)

Tapi ini bukan jalannya... Instalasi dilakukan dengan callback (pemicu pada *.user.js)...

Seperti yang disebutkan, kita berbicara tentang Impor manual menggunakan input file

Ya, saya mengerti. Tidak apa-apa bagi saya untuk file lokal (lihat di atas) ...

Saya pikir mungkin untuk hanya drag&drop .user.js ke jendela Greasemonkey untuk memuat kode skrip ke dalamnya?
Karena ini pasti berfungsi untuk Firefox itu sendiri (yaitu saya dapat mengunggah file ke situs web, seperti imgur, atau megaupload dengan menjatuhkannya)

Apakah ada cara (bahkan yang kikuk, non-drag-and-drop) yang memungkinkan saya mengimpor skrip GM lokal?

Di direktori "cache" mana skrip harus ditempatkan? Saya menemukan beberapa file "cache" di profil Firefox

Saya pikir mungkin untuk hanya drag&drop .user.js ke jendela Greasemonkey untuk memuat kode skrip ke dalamnya?

Itu mungkin, seperti kotak drop lainnya (periksa IMGolge saya untuk contoh). Namun, input file langsung akan menjadi metode termudah tanpa memerlukan pendengar dan proses tambahan.

Mozilla memperbarui dokumen (ringkasan contoh di atas):
https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Working_with_files

  1. Buka file dalam ekstensi menggunakan pemilih file
  2. Buka file dalam ekstensi menggunakan seret dan lepas

Dengan penerapan ini, kami akan memiliki perilaku yang sama seperti di GM3.

Jadi, adakah saran yang mungkin untuk menginstal skrip secara manual yang tidak ditawarkan dalam formulir online yang sesuai?

@Samizdata Saat ini cara termudah adalah mendapatkan GM beta (https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/versions/beta), buka menu monyet -> skrip baru.

Jika Anda memiliki skrip yang @memerlukan file lokal, Anda hanya dapat melakukannya dengan cara yang sulit. Misalnya ambil Proxomitron ( http://www.proxomitron.info/files/ ), jalankan, konfigurasikan FF untuk menggunakan proxy 127.0.0.1:8080, letakkan file Anda di folder HTML Proxomitron dan akses setelah itu dalam FF dengan " http: //bweb..local.ptron/FILE ANDA.pengguna.js ".

@kekkc , saya pikir versi baru dengan masalah sumber daya jarak jauh yang diperbaiki telah didorong ke AMO.

Bersulang. Selesai, @kekkc !

@kekkc , saya pikir versi baru dengan masalah sumber daya jarak jauh yang diperbaiki telah didorong ke AMO.
Belum .. sejauh yang saya bisa lihat

@Sxderp Apakah kita mengacu pada #2707?

@Eselce , ya. Itu _harus_ menyelesaikan masalah yang ada saat membuat skrip baru dengan tombol 'skrip baru' dan kemudian menerapkan tag @require ke skrip.

Agar .user.js atau skrip yang diperlukan disajikan secara lokal, ada berbagai kemungkinan. Tetapi cara termudah adalah menggunakan one-liner Python ini di baris perintah Anda:

  • untuk Python 2.x:
    python -m SimpleHTTPServer

  • untuk Python 3.x:
    python -m http.server

...yang segera mulai menyajikan semua file di direktori tempat Anda menjalankannya, pada http://127.0.0.1:8000/

(_perhatikan bahwa 8000 adalah port default; Anda dapat mengubahnya; lihat di bawah_)

Begitulah cara saya meletakkan .user.js lokal saya dan memerlukan file di server http lokal. Saya melakukan ini untuk Greasemonkey tetapi juga untuk Tampermonkey.

Python diinstal secara default di Linux dan MacOs. Jika Anda akan menggunakan Windows dan tidak menginstalnya dan masih berencana untuk terus menyebut diri Anda seorang pengembang, maka... _serius?! ada apa denganmu?_ kamu memiliki masalah yang jauh lebih serius daripada yang bisa kamu sadari! Saya akan menyarankan berkebun :bibit: atau merajut sebagai hobi daripada komputer untuk Anda :wink: (_hey, just kidding!_)

Tidak perlu menginstal program aneh apa pun -- Anda _ dapat _, tetapi itu _ sama sekali tidak perlu_. Python bukan "aplikasi", ini adalah bahasa pemrograman dasar. Tetapi Anda bahkan tidak perlu "berbicara" Python untuk solusi ini, jadi jangan berhenti atau terburu-buru ke alat rajut Anda dulu!

Prosedur sepele:

  1. cd ke dalam direktori yang berisi file .user.js dan/atau memerlukan Anda. Katakan, misalnya, requiredFile1.js dan requiredFile2.js

  2. Dari direktori itu: Untuk Python 2.x, jalankan

python -m SimpleHTTPServer

ATAU: untuk Phython 3.x, jalankan

python -m http.server

  1. Pastikan baris @require seperti ini:
// <strong i="42">@require</strong>  http://127.0.0.1:8000/requiredFile1.js
// <strong i="43">@require</strong>  http://127.0.0.1:8000/requiredFile2.js

...di mana requiredFile1.js dan requiredFile2.js adalah file lokal apa pun yang diperlukan yang ingin Anda layani.

  1. Saat skrip greasemonkey Anda diaktifkan, skrip akan mengambil kebutuhan dengan benar, yang dilayani oleh Python.

Selesai.

Untuk menutup server lokal Anda, cukup buka konsol tempat Anda menjalankan perintah python dan tekan <Ctrl><C> .

Juga, -_-dan saya harap ini sangat jelas bagi Anda_--, jangan lupa untuk menjalankan baris perintah server HTTP Python Anda sebelum mengharapkan bahwa Greasemonkey atau Tampermonkey akan dapat menemukan file...

Tip : Jika Anda ingin menggunakan port selain default 8000 , cukup ketik nomor yang diinginkan (nomor port yang valid) di perintah Anda, seperti ini:

  • untuk Python 2.x:
    python -m SimpleHTTPServer 12345

  • untuk Python 3.x:
    python -m http.server 12345

...dan secara alami perbarui url @require dengan nomor itu alih-alih 8000.

Ok, Asumsikan saya mengklik ikon toolbar GM dan pilih "Skrip pengguna baru...."

Tab baru yang sesuai diberi nama otomatis "Skrip Tanpa Nama 821696"

Kemudian saya menempelkan dari kode GM file lokal ke panel tab dan klik ikon "simpan" di sisi kiri atas.

Di mana saya menemukan skrip ini nanti? Baca: Bagaimana nanti bisa mengedit skrip ini?

Bagaimana saya bisa mengubah nama skrip menjadi misalnya "foobar"?

Nama @bsto akan diambil dari script @name.
Semua skrip baru akan muncul di atas "Skrip pengguna baru...".
Untuk menghapus atau mengedit salah satu Anda klik judul script, akan ada sub menu.

Oke terima kasih.

Hanya pertanyaan lain:

Pada tanggal 25 November pengguna kekkc memberi tahu kami dalam postingannya (lihat di atas) bahwa Mozilla menawarkan cara untuk menarik & melepas file (dari WinExplorer).

Jadi drag & drop file pengguna harus dimungkinkan sekarang.

Apakah saya benar?

Kapan implementasinya di GM (tersedia untuk drag & drop file *.user.js)?

FWIW Saya pikir kita dapat/harus mendeteksi navigasi ke file://.../anything.user.js , dan melampirkan tindakan halaman yang dapat membuka UI dengan jenis browser file apa pun yang dapat kita buat berfungsi.

Kami dapat mendeteksi peristiwa navigasi tetapi tidak mendapatkan konten (mungkin dalam skrip konten)

Meskipun saya merasa konyol untuk menavigasi ke file:// hanya untuk membuka browser file (saya tidak berpikir kita dapat melakukan apa pun selain input file picker).

Meskipun saya merasa konyol untuk menavigasi ke file:// hanya untuk membuka browser file (saya tidak berpikir kita dapat melakukan apa pun selain input file picker).

Ya persis, kita sembelih. Tapi kita bisa mendeteksi niat dan membantu sebisa mungkin dalam lingkungan kita yang terbatas.

2 sen saya...

FWIW Saya pikir kita dapat/harus mendeteksi navigasi ke file://.../anything.user.js ,
Kami dapat mendeteksi peristiwa navigasi tetapi tidak mendapatkan konten (mungkin dalam skrip konten)

Seperti yang disebutkan oleh Sxderp, itu mungkin tetapi agak berantakan ...

  • Tambahkan pendengar (seperti tabs.onUpdated.addListener karena Anda tetap membutuhkan kontennya)
  • Biarkan halaman memuat menampilkan skrip
  • Suntikkan skrip konten untuk mengambil konten halaman dan meneruskan ke skrip bg
  • Tutup halaman/tab

Alternatif ....

  • Tambahkan pendengar navigasi
  • Hentikan pemuatan halaman dan tampilkan pemberitahuan untuk menggunakan Opsi Impor ... ATAU .... munculan yang menunjukkan opsi impor yang harus diklik pengguna untuk meluncurkan filepicker

Secara pribadi, jika itu saya, saya akan memilih untuk tidak menambahkan pendengar tambahan dan hanya menambahkan opsi IMPOR ke popup browserAction

Selain itu, saya belum pernah menggunakan format .user.js sejak GM4 dan saya rasa itu bisa ditinggalkan. ;)

Secara pribadi, jika itu saya, saya akan memilih untuk tidak menambahkan pendengar tambahan dan hanya ..

Inilah yang saya maksud. Saya mungkin menyuntikkan UI ke halaman konten. Kami biasa memunculkan bilah info jika Anda menavigasi ke skrip saat GM dinonaktifkan; hal semacam itu.

Selain itu, saya belum pernah menggunakan format .user.js sejak GM4 dan saya rasa itu bisa ditinggalkan. ;)

Apa artinya ini?

Apa artinya ini?

GM3 mengharuskan skrip diberi nama abc.user.js agar dapat dikenali sebagai skrip GM.

Di GM4, skrip disimpan ke IndexedDB dan nama skrip tidak terlalu penting karena mendapatkan nama dari @name . Oleh karena itu saya telah membuat dan menyimpan skrip saya (di komputer) sebagai abc.js (tanpa .user ) dan salin/tempel ke GM.

IMPOR manual, saya kira tidak perlu dikaitkan dengan format penamaan .user .

Ada kemajuan dalam hal ini?

Ekstensi FireMonkey dapat melakukan ini:

https://addons.mozilla.org/en-US/firefox/addon/firemonkey/

Apakah halaman ini membantu?
0 / 5 - 0 peringkat