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

1

6

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?

Allie answered 23/10, 2016 at 10:53 Comment(0)
I
10

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.

Instil answered 24/10, 2016 at 4:43 Comment(4)
I see, is there any way then to keep a variable stored between page-transitions, without relying on a server?Allie
@Allie If you want to persist state between pages keep it in the main process (as you've been doing), but use the ipcRenderer and ipcMain modules to sync the state instead of the remote module.Instil
Thanks, I'll try that!Allie
Thanks for providing such a clear answer, @VadimMacagon! For a simple example of how to use ipcMain and ipcRenderer to set a global variable value in the Main process, look at this answer: https://mcmap.net/q/1772807/-electron-global-variable-garbage-collected-if-renderer-process-closesKendallkendell

© 2022 - 2024 — McMap. All rights reserved.