Himmelslaub Himmelslaub - 1 month ago 6
Javascript Question

electron's remote.getGlobal() returns "undefined" after window.location.replace()

I've been fiddling around with electron's remote module.
In my main-process I've created this variable:

global.storage = {};


My renderer-process is initialised with a file called startup.html.

win.loadURL('file://' + __dirname + '/startup.html')


In there, I include a javascript file containing the following function:

function enterMain(value){
remote.getGlobal('storage').exmpl = value;
window.location.replace('./general.html');
}


The value I'm passing is "hello", and when calling upon...

console.log(remote.getGlobal('storage').exmpl);


...after assigning the value it returns "hello", as it should. However, once the window location has been replaced to general.html, in which I include a javascript file containing this function:

$(document).ready(function(){
console.log(remote.getGlobal('storage').exmpl);
});


...it returns undefined.
Why? Can anyone help me make sense of this?

Answer

There are a few things in play here:

  • The remote module caches remote objects in the renderer process on first access.
  • Properties that are added to a remote object in the renderer process are not propagated back to the original object in the main process.
  • Navigation restarts the renderer process.

With that in mind here's what's probably going on in your code:

  1. remote.getGlobal('storage') creates a new remote object and caches it.
  2. remote.getGlobal('storage').exmpl = value adds a new exmpl property to the remote object in the cache but doesn't propagate it to the original object in the main process.
  3. window.location.replace('./general.html') restarts the renderer process which blows away the remote object cache.
  4. console.log(remote.getGlobal('storage').exmpl) creates a new remote object since the cache is empty, but since the original object in the main process doesn't have an exmpl property it's also undefined on the new remote object.

The remote module seems deceptively simple at first, but it has many quirks, most of which are undocumented and as such may change in the future. I would suggest limiting the use of the remote module in production code.