Ok, I think I got to the bottom of this.
The problem is in jQuery.event.trigger(), in following lines:

        // Native handler
        handle = ontype && cur[ ontype ];
        if ( handle && jQuery.acceptData( cur ) && handle.apply &&
handle.apply( cur, data ) === false ) {
                event.preventDefault();
        }

handle() is a page-scope function, and jQuery tries to call it while
passing script-scope data object as parameter.

        handle.apply( cur, data )

Of course, it doesn't end well. I was unable to quickfix it by
inserting a call to cloneInto(), as for some reason it returns an
error when I attempt to export data.

You could file a bug to jQuery developers, but I'm unsure if they will
try to fix it - after all, jQuery wasn't specifically intended to be
used in userscripts.

It's not just click() - any time jQuery does something like this, you
will run into problems.

So the only way to work around it I can think of is to inject jQuery
into the target page and work there, using postMessage() or
user-defined events to communicate with priviledged code...



2014-07-18 10:27 GMT+04:00 Vindicar <[email protected]>:

>  if (thisvalue="Finish Job")
>
> I do believe you have a typo here, but it's unrelated to the fact click()
> causes an error. So far I dug into event.trigger() routine.
>
>
> 2014-07-18 2:42 GMT+04:00 Daniel Wynalda <[email protected]>:
>
> Here's a copy of a sample script.
>> http://hithuntheal.com/x.user.js  <http://hithuntheal.com/x.user.js>
>> (also inserted/pasted below)
>>
>>
>> It acts on the following URL:
>> http://hithuntheal.com/x.php
>> It simply clicks the button.  (I've reduced my 50000 line script down to
>> just the sample code showing the issue).
>> But this script won't click the button.  It finds the button -- it can
>> see the button's properties.  But it can't click the button as jQuery ends
>> with the error.
>>
>> Now... If you remove the @grant lines and replace them with @grant none
>> then this script will work just fine.
>> This is what's confusing me.  I'm not doing anything exotic in this
>> script sample.  I'm clicking a button.  I can see the button, I can get
>> properties from the button.  I simply can't click the button.
>> My script has to have GM_getValue and GM_setValue because it runs cross
>> domain and the entire value of the script is maintaining data between
>> websites to use on other websites...
>>
>> // ==UserScript==
>> // @name           TEST CLICK BUTTON
>> // @namespace      http://hithuntheal.com/x.user.js
>> // @description    Hitlist hunt heal and level combined
>> // @grant GM_setValue
>> // @grant GM_getValue
>> // @include *hithuntheal.com/*
>> // @icon http://www.hithuntheal.com/hhhicon.ico
>> // @require
>> http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js
>> // ==/UserScript==
>>
>>
>>
>> jQuery(".formInputButton").each(function(index)
>> {
>>  var thisvalue=$(this).attr('value');
>> if (thisvalue="Finish Job")
>> {
>>  alert('found button !');
>> $(this).click();
>> }
>>  });
>>
>>
>> On Thursday, July 17, 2014 12:51:59 PM UTC-4, TheVindicar wrote:
>>
>>> I used this snippet to illustrate my undestanding of how scurity scopes
>>> work.
>>> jQuery is taken from unsafeWindow, and thus runs with page level of
>>> privilege.
>>> The code itself is run in script scope, so empty array and anonymous
>>> function are also created in script scope.
>>> That's why page-defined jQuery fails to access them.
>>>
>>> You're using script-scope jQuery, so it should work just fine in my
>>> scenario.
>>> As for yours... say again:
>>> 1. Where and how is click handler installed?
>>> 2. Where and how is .click() called?
>>>
>>>
>>> 2014-07-17 16:23 GMT+04:00 Daniel Wynalda <[email protected]>:
>>>
>>> I think what I'm having trouble with is understanding the use of
>>>> cloneInto.
>>>>
>>>> You mentioned this code:
>>>>  $.each(
>>>>       cloneInto([], unsafeWindow),
>>>>       exportFunction(function(){}, unsafeWindow)
>>>>   );
>>>>
>>>> But I don't understand it.  Is this suppose to replace the .each()
>>>> inside jQuery?
>>>>
>>>> The .each seems to be running fine and I get the content that I expect
>>>> with jquery (the text is visible, as is the .onClick routine that is in the
>>>> code).   What I can't do is actually click the element (perhaps because it
>>>> has an onclick and that is in the page scope??)
>>>>
>>>>
>>>> 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/
>>>>>>>> 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/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