Chrome Extension - Chrome.windows.onFocusChanged Behavior - google-chrome

I'm trying to make an extension for Google chrome which requires me to be able to identify the currently selected tab. I did this with the chrome.tabs.onSelectionChanged method, however when I switch windows this isn't fired. I plan to use chrome.windows.onFocusChanged to detect when the window changes then use the chrome.tabs.getSelected method. However the problem is that chrome.windows.onFocusChanged seems to be fired more than once. If I'm not mistaken, it returns window -1, then the first window created (usually 1), then the current window. If the first window is selected then it's fires -1, then 1.
Am I using the right method here? Is there a better way of doing this? If I stick with it I might need to keep track of how window changes which is a bit messy.

Kinda worked on my own solution for this. For anyone interested in doing something similar, what I did instead was to use the onFocusChanged as an indicator that there is a window change happening which then starts a requestListener. Using content scripts, I sent a request to the extension whenever there was a window.focus event indicating that the focus is already on that window. The requestlistener then just removes itself. Unfortunately this approach requires all tabs to send requests every time they get focus. Some more tweaking to fix that I guess but for the mean time I think that suffices since sending requests every time there is a change of focus doesn't seem to eat up that much resources.

Related

Optimize - variant changes on specific elements not showing in preview mode

I'm trying to test changes to our website, which is a dynamic application. When making edits to certain elements, the visual editor gives a warning:
"The number of elements selected changed after the page was initially loaded. Make sure that your changes appear as expected using preview mode." I've read all the official Google documentation on this specific warning. See the layout here
I've enabled activation events, set it to optimize.activate and made sure it is being pushed to dataLayer.
When I preview in debug mode, it says the experience was applied, the activation event was triggered on 'optimize.activate' and the url matches. Yet only one of the changes have been applied. See here
When I open the console and call dataLayer, optimize.activate is right there.
I'm honestly baffled. I read here that filters on the Analytics view linked to your Optimize container can stop events 'showing up'. We use filters to IP block our staff from showing up in our Analytics data.
Any help on this would be amazing.
p.s. I'm not a developer so go easy on me :)
Ok this maybe for a couple of reasons... I've had a few instances where I can view changes in preview mode:
First of all, if you're viewing changes in incognito mode, you need to make sure the following option is switched off in your browser - Block third-party cookies. If this is switched on, then in preview mode, your browser will block the Optimize 360 cookie and your experiment will not run. (This means you will not see your changes).
Secondly, if you have Audience Targeting set, these features do not work or show in preview mode.
Thirdly, your test may not be firing on the correct event trigger. EG pageload. So make sure the correct event is attached to your AB Test. As you will be able to see the changes in edit mode, but again not in preview mode.
Your issue is likely to be point 1 or 3.

Can I trick a website into believing it always has focus?

A bit of a general question here. I want to navigate to another tab or window but I also want a particular website open in a tab to believe that it retains focus when I do that. Is there any script that I could run, maybe using TamperMonkey?
I tried this but it didn't work for the website I needed it to. The website in question pops up a warning every time focus is lost.
Try: document.hasFocus = true;

Is there a maximum number of clicktag variables allowed in a banner ad?

So, this is pretty silly. I'm working on a banner ad that utilizes the clicktag. It's a surprisingly fancy one that uses pointroll, and when you hover over the 300x250 banner ad, it pulls up a larger one overtop of it that is bigger and much more interactive. In total, the larger banner has 29 clicktags, all using the variables "clickTag1" to "clickTag29".
The banners are all done, everything fires correctly (according to my trace statements). However, I'm in the middle of QA, testing all of the clicktags using this validator: https://flashval-temp.appspot.com/validator/ , when suddenly, it stops working after clickTag20. I thought it may have been the validator at first, so I tried other validators. No luck. I went back into my code (everything is a duplicate of one template, so the only code changes made were the changes to the string), and made sure to test it again. They're firing off just fine according to my trace statements.
Finally, and this doesn't seem to make sense to me, but I switched the variables clickTag20 and clickTag21. The button that fired off clickTag20 worked, so I assigned it clickTag21. The button that was assigned clickTag21 was the first to stop working, so I assigned it clickTag20. When I ran that through the validator, the button that was assigned to clickTag20, regardless of which button it was, worked! The one that was assigned clickTag21 never did, also regardless of which button it was fired off from.
The variable is a string of a paramObj. How does the content of that string matter? I would have assumed it was compile order, but even in that case, clickTag21 should have fired and not clickTag20. What is going on here? Has anyone else experienced this? If so, did you have a workaround? Please and thank you!!
Here is the thing... when you set a clicktag you're waiting for a flashvar. A parameter sent from the HTML to your SWF file. (more: http://helpx.adobe.com/flash/kb/pass-variables-swfs-flashvars.html)
Usually you'd test, if this parameter doesn't exists, the banner should do nothing, otherwise, open the link.
Turns out, and this is a guess, that these validators don't know how many clicktags you have in your flash file - or how many parameters you're waiting for - , so they pass up to 20 variables to your flash file, which is more than reasonable.
The bottom line is: if your events are working, you should be fine. Pointroll has a QA team, if something comes up, they will let you know, but as far as I can see from here, you should be fine.
Good luck

Chrome dev tools on all tabs

I'm trying to see a POST request that my browser is making on a certain form.
My problem is that the form is opened in a popup window (js initiated) and when the form is submitted it automatically closes the popup. So when I'm trying to use the developer tools' networking tab I can see the post request but don't have enough time to look into it since the window is closing too fast.
Even if I choose 'preserve log on navigation' it doesn't appear anywhere since the entire window is closing on submit.
Is there a way of opening the developer tools in the context of the entire Chrome application instead of a certain tab?
I don't believe there is. The best two solutions I can think of (that don't actually answer your question but I think achieve your aim) are:
Use another tool like Fiddler - http://fiddler2.com/ It's really good but only available for windows :(
It's a messy workaround but you could just comment out the line that closes the window while you carry out your debugging and then reinstate it once the issue is fixed.

Block Access mousewheel behavior in external ActiveX controls

In an Access (2002 / 2003) data-bound form, a turn of the mousewheel moves to the next/previous record, even if the cursor is inside a multiline text field or a listbox. This is a major annoyance to users and cannot be turned off easily.
I recently discovered a DLL called MouseHook (http://www.lebans.com/mousewheelonoff.htm) which can effectively block this mousewheel behavior and replace it with more expected behavior.
However, when an external ActiveX control is added to an Access form, this module does nothing. For example, I have a form with a FlexGrid control on it, and it can contain a lot of rows. When a user tries to scroll in there using the mousewheel, Access again simply goes to another record instead, even with MouseHook DLL loaded.
Is there a solution like MouseHook DLL but which also works for external ActiveX controls? Or is the source code of the MouseHook DLL available so it can be modified to deal with controls like FlexGrid?
PS: I wanted to ask the author of MouseHook DLL, but he is currently "on a hiatus" until June 2009.
If you really have to alter the UI and change how the user expects the mouse wheel to work, I would actually recommend just disabling it rather than altering how it scrolls. While it's scrolling may seem odd to you, it is how the program works. What would you do if you had to read PDF's all day, and then one day one person decided that the way the mouse wheel scrolling worked wasn't good enough and changed to so it defaulted to huge jumps or horizontal or whatever. Yes, it may have been a better solution, however it is annoying to the user because it doesn't do what it is supposed to do.
Why are you using a flexgrid in Access? To me, this is a read flag that you likely are approaching the project with an Access-hostile point of view, since you seem to be choosing non-native controls to do things that are almost always much more easily accomplished with Access's native controls.
Hook the flexgrid, intercept the WM_MOUSEWHEEL message, ignore it and call your intended behaviour.
Not a direct answer to your question, but the way we deal with the mouse wheel movement is to prevent accidental changes of records after the user has started editing. When the user opens the form, the wheel moves the records willy-nilly as normal. As soon the user edits something on the field, and then moves the mouse wheel, the BeforeUpdate event fires, which causes our code to put up a prompt saying they must save the record first. We have a save button which the user must explicitly press to supress the warning in the BeforeUpdate event.