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/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/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.
