Ok.  Some additional debugging.   The .click() routine is definitely not 
working but I tried creating an 'xclick' function in my script that calls 
the actual mouse functions.   It appears that I *can* xclick the DIV using 
the xclick routine below:

function xclick(elm)
{
 var evt=document.createEvent('MouseEvents');
evt.initMouseEvent('click',true,true,window,0,1,1,1,1, false, false, false, 
false, 0, null);
}

but when I try to .click the same element using jQuery it's not working. 

Oddly if I put the routine in a setTimeout it won't do the xclick or the 
click - so it's like the element is no longer there after the timeout of 3 
seconds.   What I find odd is that the code works perfectly in greasemonkey 
1.5 - but in 2.0 it's like there's cleanup going on or something that is 
whacking the element that was grabbed by jQuery.     

Perhaps there's some new Greasemonkey garbage cleanup taking place that I 
was assuming didn't take place.. 

Either way .click() is broken and jQuery crashes with the .length being 
inaccessible and I just don't know how to move it into the script scope.   
The code you gave assumed I was using unsafeWindow but I'm not at all in 
this section...  The only unsafeWindow references I have call functions in 
the unsafeWindow and those seem to still be working.




On Thursday, July 17, 2014 8:10:23 AM UTC-4, TheVindicar wrote:
>
> 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] <javascript:>
> >:
>
>> 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] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> 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