Not entirely sure what causes that, but it looks like a scope bug to me. That's why I moved everything I could into page scope.
2014-07-17 15:42 GMT+04:00 Daniel Wynalda <[email protected]>: > This is why I find it strange I'm having this problem. I have a version > of jQuery right in my script as a subroutine. I basically have a main > function that is called and inside it jQuery and all of my other functions > exist. I *believe* it's calling the jQuery i have provided and trying to > access the page and the each seems to find all of the elements but the > $(this).click() is failing with the unable to access property length. > > There is zero use of unsafeWindow.jQuery in my script. I do have an > occasional call to a subroutine that already exists in the page (but I'm > calling the function outright, and that seems to be working). This > specific issue seems to be that the .click() function cannot access the > item that is in the page from within the greasemonkey script. Perhaps > I'm misinterpreting it - but if I debug log messages before and after it is > definitely that line that is causing greasemonkey to error and stop. > > > On Thursday, July 17, 2014 5:46:48 AM UTC-4, TheVindicar wrote: > >> Let me guess, you're trying to use jQuery provided by target page? >> Following code will fail: >> >> var $ = unsafeWindow.jQuery; >> $.each([], function(){}); >> >> Since $.each() is a function from page scope, and array and function are >> both in more priviledged script scope, jQuery will fail to access their >> properties (like Array.length and Function.call). >> There are two ways to work around it. Either you can export everything >> you need explicitly (though strings and numbers don't have to be exported): >> >> $.each( >> cloneInto([], unsafeWindow), >> exportFunction(function(){}, unsafeWindow) >> ); >> >> Or you can run the page-modifying code entirely inside the page scope via >> script tag injection: >> >> function RunInPage(func) { >> var s = document.createElement("script"); >> s.textContent = "(" + func + ")();"; >> document.body.appendChild(s); >> setTimeout(function(){document.body.removeChild(s)}, 0); >> } >> RunInPage(function(){ >> //you can use page-scope code (like jQuery if the page uses it) >> here freely - entirety of this script is run in page scope. >> var $ = window.jQuery; $.each([], function(){}); >> }); >> >> >> The latter method is much easier if you don't need to make priviledged >> calls from the page scope (i.e. you don't have an event handler that calls >> GM_setValue(), don't use GM_xmlHttpRequest(), and so on). One drawback is >> that you can't use closures with it. Following code will give you >> 'undefined': >> >> var my_settings = {settings : GM_getValue( 'settings', 'default' )}; >> RunInPage(function(){ >> alert(my_settings); >> }); >> >> It seems that a good way to pass values into page scope would be this: >> >> var my_settings = {settings : GM_getValue( 'settings', 'default' )} >> unsafeWindow.my_settings = cloneInto(my_settings, unsafeWindow); >> RunInPage(function(){ >> alert(window.my_settings); >> }); >> >> >> Mind that settings object better not include any functions. >> >> >> 2014-07-16 20:03 GMT+04:00 Daniel Wynalda <[email protected]>: >> >> If possible could you post an example of how you used cloneInto() in your >>> greasemonkey script to inject something? My scripts also broke with >>> greasemonkey 2.0 deployment and they are all failing inside jQuery so I >>> don't know what to do to try to fix them. Simple things like: >>> >>> $(this).click(); >>> >>> no longer work -- and Firefox is giving this error: >>> Permission denied to access property 'length'. >>> >>> I know it's finding the item (I have logged the content). It works fine >>> in Greasemonkey 1.5. I am guessing this has something to do with the >>> scope changes - but I have no idea how to work around them. I'm not trying >>> to inject anything into the web page. I'm just trying to click a DIV >>> element.... >>> >>> >>> >>> On Tuesday, July 15, 2014 7:53:50 AM UTC-4, TheVindicar wrote: >>> >>>> Well, I solved it in a different manner. I run everything I can in >>>> script scope, load settings into an object, then export that object into >>>> unsafeWindow via cloneInto() and run the rest in page scope via script tag >>>> injection. >>>> It works for simple scripts that don't need to call priviledged calls >>>> from pages scope. If you do need it, you might want to use >>>> addEventListener()/postMessage() combo. >>>> >>>> >>>> 2014-07-15 3:33 GMT+04:00 Dr Sr <[email protected]>: >>>> >>>>> Same here, half a dozen scripts broken. The easiest way is to use "@grant >>>>> none <http://wiki.greasespot.net/@grant>", so your script runs in the >>>>> page context and can carry on as before. Replace "unsafeWindow" with >>>>> "window". You lose access to all the GM_ calls, but if you're only using >>>>> GM_getValue()/setValue() anyway, see the compatibility shim in the above >>>>> link for a drop-in replacement that uses localStorage. >>>>> >>>>> On Sunday, July 13, 2014 12:57:16 AM UTC+12, TheVindicar wrote: >>>>>> >>>>>> Where can I read about writing scripts in accordance with new API? >>>>>> Since now I can't even iterate over page-defined jQuery collection using >>>>>> script-defined callback, every single one of my scripts is broken. >>>>>> >>>>>> Pretty much all of them use the same scheme: >>>>>> 1. load settings into object via GM_getValue() >>>>>> 2. find and modify some DOM nodes according to the settings >>>>>> 3. (optionally) replace some functions in the target page with my own >>>>>> versions >>>>>> >>>>>> Now I fail to understand how do I do that using cloneInto() and >>>>>> exportFunction(). The fact Firefox shows wrong line number in error >>>>>> message >>>>>> doesn't help either. >>>>>> >>>>> -- >>>>> You received this message because you are subscribed to a topic in the >>>>> Google Groups "greasemonkey-users" group. >>>>> To unsubscribe from this topic, visit https://groups.google.com/d/to >>>>> pic/greasemonkey-users/SXfpyvcQofQ/unsubscribe. >>>>> To unsubscribe from this group and all its topics, send an email to >>>>> [email protected]. >>>>> To post to this group, send email to [email protected]. >>>>> >>>>> Visit this group at http://groups.google.com/group/greasemonkey-users. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "greasemonkey-users" group. >>> To unsubscribe from this topic, visit https://groups.google.com/d/ >>> topic/greasemonkey-users/SXfpyvcQofQ/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at http://groups.google.com/group/greasemonkey-users. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > You received this message because you are subscribed to a topic in the > Google Groups "greasemonkey-users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/greasemonkey-users/SXfpyvcQofQ/unsubscribe > . > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/greasemonkey-users. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "greasemonkey-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/greasemonkey-users. For more options, visit https://groups.google.com/d/optout.
