حقن وظائف JS في الصفحة من نص Greasemonkey على Chrome
سؤال
لديّ نص Greasemonkey يعمل بشكل جيد في Firefox و Opera. أنا أواجه مع العمل في كروم ، ومع ذلك. تكمن المشكلة في حقن وظيفة في الصفحة التي يمكن استدعاؤها بواسطة رمز من الصفحة. هذا ما أفعله حتى الآن:
أولاً ، أحصل على إشارة مساعد إلى Unsafewindow ل Firefox. هذا يتيح لي أن يكون لدي نفس الكود لـ FF و Opera (والكروم ، اعتقدت).
var uw = (this.unsafeWindow) ? this.unsafeWindow : window;
بعد ذلك ، حقن وظيفة في الصفحة. إنه في الحقيقة مجرد غلاف رفيع جدًا لا يفعل شيئًا سوى التذرع بالوظيفة المقابلة في سياق البرنامج النصي الخاص بي:
uw.setConfigOption = function(newValue) {
setTimeout(setConfigOption, 0, newValue);
}
ثم ، هناك الوظيفة المقابلة في البرنامج النصي:
setConfigOption = function(newValue) {
// do something with it, e.g. store in localStorage
}
أخيرًا ، حقن بعض HTML في الصفحة مع رابط لاستدعاء الوظيفة.
var p = document.createElement('p');
p.innerHTML = '<a href="javascript:setConfigOption(1)">set config option to 1</a>';
document.getElementById('injection-point').appendChild(p);
لتلخيص: في Firefox ، عندما ينقر المستخدم على الرابط الذي تم حقنه ، فإنه سيقوم بتنفيذ استدعاء الوظيفة على Uncafewindow ، والذي يؤدي بعد ذلك إلى مهلة تستدعي الوظيفة المقابلة في سياق البرنامج النصي GM الخاص بي ، والذي يقوم بعد ذلك بالمعالجة الفعلية. (صححني إذا كنت مخطئًا هنا.)
في Chrome ، أحصل على خطأ "مرجعية غير معروفة: لم يتم تعريف setConfigoption". وبالفعل ، فإن إدخال "window.setConfigOption" في وحدة التحكم ينتج عنه "غير محدد". في Firebug و Console Opera Developer ، الوظيفة موجودة.
ربما هناك طريقة أخرى للقيام بذلك ، ولكن يتم استدعاء عدد قليل من وظائفي بواسطة كائن فلاش على الصفحة ، والتي أعتقد أنها تجعل من الضروري أن يكون لدي وظائف في سياق الصفحة.
ألقيت نظرة سريعة على بدائل لـ Unsafewindow على Greasemonkey Wiki ، لكنها جميعها تبدو قبيحة للغاية. هل أنا تماما على المسار الخطأ هنا أم يجب أن أنظر عن كثب في هذه؟
الدقة: تتبعت ماكس س. النصيحة وهو يعمل في كل من Firefox و Chrome الآن. نظرًا لأن الوظائف التي كنت بحاجة إلى أن أكون متاحًا للصفحة اضطرت إلى الاتصال مرة أخرى إلى الوظائف العادية ، فقد نقلت البرنامج النصي بالكامل إلى الصفحة ، أي أنه ملفوف تمامًا في الوظيفة التي أطلق عليها "Main ()".
لجعل قبيح هذا الاختراق أكثر محتملة قليلاً ، كان بإمكاني على الأقل إسقاط استخدام غير مؤهلة و rapplegsobject الآن.
ما زلت لم أتمكن من الحصول على عداء نطاق المحتوى من عمل Greasemonkey Wiki. يجب أن تفعل الشيء نفسه ويبدو أنه ينفذ على ما يرام ، لكن وظائفي لا يمكن الوصول إليها أبدًا <a>
عناصر من الصفحة ، على سبيل المثال. لم أحسب بعد سبب ذلك.
المحلول
الطريقة الوحيدة للتواصل مع الكود الذي يعمل على الصفحة في Chrome هو من خلال DOM ، لذلك عليك استخدام اختراق مثل إدراج أ <script>
علامة مع الكود الخاص بك. لاحظ أن هذا قد يثبت عربات التي تجرها الدواب إذا احتاج البرنامج النصي إلى تشغيله قبل كل شيء آخر على الصفحة.
تعديل: إليك الطريقة امتداد التنبيه الجميل هل هذا:
function main () {
// ...
window.alert = function() {/* ... */};
// ...
}
var script = document.createElement('script');
script.appendChild(document.createTextNode('('+ main +')();'));
(document.body || document.head || document.documentElement).appendChild(script);
نصائح أخرى
لدي هذا :
contentscript.js:
function injectJs(link) {
var scr = document.createElement('script');
scr.type="text/javascript";
scr.src=link;
document.getElementsByTagName('head')[0].appendChild(scr)
//document.body.appendChild(scr);
}
injectJs(chrome.extension.getURL('injected.js'));
enjected.js:
function main() {
alert('Hello World!');
}
main();
ألقيت نظرة سريعة على بدائل لـ Unsafewindow على Greasemonkey Wiki ، لكنها جميعها تبدو قبيحة للغاية. هل أنا تماما على المسار الخطأ هنا أم يجب أن أنظر عن كثب في هذه؟
يجب أن تنظر ، لأنه خيار متاح فقط. أفضل استخدام موقع الاختراق.
myscript.user.js:
function myFunc(){
alert('Hello World!');
}
location.href="javascript:(function(){" + myFunc + "})()"
example.com/mypage.html
<script>
myFunc() // Hello World!
</script>
بالتأكيد ، إنه قبيح. لكنه يعمل بشكل جيد.
طريقة عداء نطاق المحتوى ، التي ذكرها Max S. أفضل من Hack Hack ، لأنه أسهل في التصحيح.
الإجابات الأخرى إما تجبرك على استخدامها تعبيرات الوظيفة, ، استيراد ملف إضافي خارجي أو استخدم اختراق طويل مرقح.
ستضيف هذه الإجابة JavaScript إلى الصفحة مباشرة من رمز المصدر الخاص بك. سوف تستخدم ECMASCRIPT 6 (ES6) قالب حرفي للحصول على سلسلة JavaScript متعددة الخطوط على الصفحة.
var script = document.createElement('script');
script.type = "text/javascript";
script.innerHTML = `
function test() {
alert(1);
}
`;
document.getElementsByTagName('head')[0].appendChild(script);
يرجى ملاحظة backticks ``
التي تحدد بداية ونهاية سلسلة متعددة الخطوط.