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.

Reply via email to