With the following (GreaseMonkey) user script I am trying to find (and later access) a JavaScript object (namely ‘Blazor’):
// ==UserScript==
// @name Test
// @version 1
// @grant none
// @run-at document-end
// ==/UserScript==
window.addEventListener ("load", doStuff);
function doStuff() {
setTimeout(function() {
console.log("window.hasProperty('Blazor'): " + window.hasOwnProperty("Blazor"));
console.log("'Blazor' in window: " + ('Blazor' in window));
console.log(window);
}, 2000);
}
When I run the script (i.e., reload the page), I get the following output in Firefox’ console:
So window.Blazor can not be found. However, when I inspect (click on) the window object I can see the Blazor property:
Calling 'Blazor' in window in the console also returns true.
Why is this property of window not (yet?) available and how can I find and access it?
Update:
Based on madalinivascu’s answer I tried the following:
function doStuff() {
console.log("<doStuff>");
var promise = new Promise(function(resolve, reject) {
var interval = setInterval(function() {
console.log("checking for Blazor");
if ('Blazor' in window) {
console.log("Blazor found");
clearInterval(interval);
resolve(window.Blazor);
}
}, 1000);
});
promise.then(successCallback, failureCallback);
console.log("</doStuff>");
}
function failureCallback(error) {
console.log("failure: " + error);
}
function successCallback(result) {
console.log("success: " + result);
}
which results in the following output:
So the function checking for Blazor is called indefinitely without success in finding it.
Advertisement
Answer
The solution is to use script injection, since the GreaseMonkey script runs in another context and thus gets another window object.
More precisely, attaching the function doStuff with addJS_Node defined in that answer (addJS_Node (null, null, doStuff);) instead of using window.addEventListener ("load", doStuff); works.


