chore: remove app.allowRendererProcessReuse (#26874)
This commit is contained in:
parent
4ca518468d
commit
79077f6df9
16 changed files with 43 additions and 392 deletions
|
@ -1426,19 +1426,6 @@ This is the user agent that will be used when no user agent is set at the
|
||||||
app has the same user agent. Set to a custom value as early as possible
|
app has the same user agent. Set to a custom value as early as possible
|
||||||
in your app's initialization to ensure that your overridden value is used.
|
in your app's initialization to ensure that your overridden value is used.
|
||||||
|
|
||||||
### `app.allowRendererProcessReuse`
|
|
||||||
|
|
||||||
A `Boolean` which when `true` disables the overrides that Electron has in place
|
|
||||||
to ensure renderer processes are restarted on every navigation. The current
|
|
||||||
default value for this property is `true`.
|
|
||||||
|
|
||||||
The intention is for these overrides to become disabled by default and then at
|
|
||||||
some point in the future this property will be removed. This property impacts
|
|
||||||
which native modules you can use in the renderer process. For more information
|
|
||||||
on the direction Electron is going with renderer process restarts and usage of
|
|
||||||
native modules in the renderer process please check out this
|
|
||||||
[Tracking Issue](https://github.com/electron/electron/issues/18397).
|
|
||||||
|
|
||||||
### `app.runningUnderRosettaTranslation` _macOS_ _Readonly_
|
### `app.runningUnderRosettaTranslation` _macOS_ _Readonly_
|
||||||
|
|
||||||
A `Boolean` which when `true` indicates that the app is currently running
|
A `Boolean` which when `true` indicates that the app is currently running
|
||||||
|
|
|
@ -284,13 +284,6 @@ It creates a new `BrowserWindow` with native properties as set by the `options`.
|
||||||
same `partition`. If there is no `persist:` prefix, the page will use an
|
same `partition`. If there is no `persist:` prefix, the page will use an
|
||||||
in-memory session. By assigning the same `partition`, multiple pages can share
|
in-memory session. By assigning the same `partition`, multiple pages can share
|
||||||
the same session. Default is the default session.
|
the same session. Default is the default session.
|
||||||
* `affinity` String (optional) - When specified, web pages with the same
|
|
||||||
`affinity` will run in the same renderer process. Note that due to reusing
|
|
||||||
the renderer process, certain `webPreferences` options will also be shared
|
|
||||||
between the web pages even when you specified different values for them,
|
|
||||||
including but not limited to `preload`, `sandbox` and `nodeIntegration`.
|
|
||||||
So it is suggested to use exact same `webPreferences` for web pages with
|
|
||||||
the same `affinity`. _Deprecated_
|
|
||||||
* `zoomFactor` Number (optional) - The default zoom factor of the page, `3.0` represents
|
* `zoomFactor` Number (optional) - The default zoom factor of the page, `3.0` represents
|
||||||
`300%`. Default is `1.0`.
|
`300%`. Default is `1.0`.
|
||||||
* `javascript` Boolean (optional) - Enables JavaScript support. Default is `true`.
|
* `javascript` Boolean (optional) - Enables JavaScript support. Default is `true`.
|
||||||
|
|
|
@ -14,6 +14,21 @@ This document uses the following convention to categorize breaking changes:
|
||||||
|
|
||||||
## Planned Breaking API Changes (14.0)
|
## Planned Breaking API Changes (14.0)
|
||||||
|
|
||||||
|
### Removed: `app.allowRendererProcessReuse`
|
||||||
|
|
||||||
|
The `app.allowRendererProcessReuse` property will be removed as part of our plan to
|
||||||
|
more closely align with Chromium's process model for security, performance and maintainability.
|
||||||
|
|
||||||
|
For more detailed information see [#18397](https://github.com/electron/electron/issues/18397).
|
||||||
|
|
||||||
|
### Removed: Browser Window Affinity
|
||||||
|
|
||||||
|
The `affinity` option when constructing a new `BrowserWindow` will be removed
|
||||||
|
as part of our plan to more closely align with Chromium's process model for security,
|
||||||
|
performance and maintainability.
|
||||||
|
|
||||||
|
For more detailed information see [#18397](https://github.com/electron/electron/issues/18397).
|
||||||
|
|
||||||
### API Changed: `window.open()`
|
### API Changed: `window.open()`
|
||||||
|
|
||||||
The optional parameter `frameName` will no longer set the title of the window. This now follows the specification described by the [native documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/open#parameters) under the corresponding parameter `windowName`.
|
The optional parameter `frameName` will no longer set the title of the window. This now follows the specification described by the [native documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/open#parameters) under the corresponding parameter `windowName`.
|
||||||
|
@ -371,14 +386,6 @@ Setting `{ compress: false }` in `crashReporter.start` is deprecated. Nearly
|
||||||
all crash ingestion servers support gzip compression. This option will be
|
all crash ingestion servers support gzip compression. This option will be
|
||||||
removed in a future version of Electron.
|
removed in a future version of Electron.
|
||||||
|
|
||||||
### Removed: Browser Window Affinity
|
|
||||||
|
|
||||||
The `affinity` option when constructing a new `BrowserWindow` will be removed
|
|
||||||
as part of our plan to more closely align with Chromium's process model for security,
|
|
||||||
performance and maintainability.
|
|
||||||
|
|
||||||
For more detailed information see [#18397](https://github.com/electron/electron/issues/18397).
|
|
||||||
|
|
||||||
### Default Changed: `enableRemoteModule` defaults to `false`
|
### Default Changed: `enableRemoteModule` defaults to `false`
|
||||||
|
|
||||||
In Electron 9, using the remote module without explicitly enabling it via the
|
In Electron 9, using the remote module without explicitly enabling it via the
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
|
||||||
import { deprecate, Menu } from 'electron/main';
|
import { Menu } from 'electron/main';
|
||||||
|
|
||||||
const bindings = process._linkedBinding('electron_browser_app');
|
const bindings = process._linkedBinding('electron_browser_app');
|
||||||
const commandLine = process._linkedBinding('electron_common_command_line');
|
const commandLine = process._linkedBinding('electron_common_command_line');
|
||||||
|
@ -129,7 +129,3 @@ for (const name of events) {
|
||||||
webContents.emit(name, event, ...args);
|
webContents.emit(name, event, ...args);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecate allowRendererProcessReuse but only if they set it to false, no need to log if
|
|
||||||
// they are setting it to true
|
|
||||||
deprecate.removeProperty({ __proto__: app } as any, 'allowRendererProcessReuse', [false]);
|
|
||||||
|
|
|
@ -1457,13 +1457,6 @@ std::string App::GetUserAgentFallback() {
|
||||||
return ElectronBrowserClient::Get()->GetUserAgent();
|
return ElectronBrowserClient::Get()->GetUserAgent();
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::SetBrowserClientCanUseCustomSiteInstance(bool should_disable) {
|
|
||||||
ElectronBrowserClient::Get()->SetCanUseCustomSiteInstance(should_disable);
|
|
||||||
}
|
|
||||||
bool App::CanBrowserClientUseCustomSiteInstance() {
|
|
||||||
return ElectronBrowserClient::Get()->CanUseCustomSiteInstance();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(OS_MAC)
|
#if defined(OS_MAC)
|
||||||
bool App::MoveToApplicationsFolder(gin_helper::ErrorThrower thrower,
|
bool App::MoveToApplicationsFolder(gin_helper::ErrorThrower thrower,
|
||||||
gin::Arguments* args) {
|
gin::Arguments* args) {
|
||||||
|
@ -1665,10 +1658,7 @@ gin::ObjectTemplateBuilder App::GetObjectTemplateBuilder(v8::Isolate* isolate) {
|
||||||
#endif
|
#endif
|
||||||
.SetProperty("userAgentFallback", &App::GetUserAgentFallback,
|
.SetProperty("userAgentFallback", &App::GetUserAgentFallback,
|
||||||
&App::SetUserAgentFallback)
|
&App::SetUserAgentFallback)
|
||||||
.SetMethod("enableSandbox", &App::EnableSandbox)
|
.SetMethod("enableSandbox", &App::EnableSandbox);
|
||||||
.SetProperty("allowRendererProcessReuse",
|
|
||||||
&App::CanBrowserClientUseCustomSiteInstance,
|
|
||||||
&App::SetBrowserClientCanUseCustomSiteInstance);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* App::GetTypeName() {
|
const char* App::GetTypeName() {
|
||||||
|
|
|
@ -213,8 +213,6 @@ class App : public ElectronBrowserClient::Delegate,
|
||||||
void EnableSandbox(gin_helper::ErrorThrower thrower);
|
void EnableSandbox(gin_helper::ErrorThrower thrower);
|
||||||
void SetUserAgentFallback(const std::string& user_agent);
|
void SetUserAgentFallback(const std::string& user_agent);
|
||||||
std::string GetUserAgentFallback();
|
std::string GetUserAgentFallback();
|
||||||
void SetBrowserClientCanUseCustomSiteInstance(bool should_disable);
|
|
||||||
bool CanBrowserClientUseCustomSiteInstance();
|
|
||||||
|
|
||||||
#if defined(OS_MAC)
|
#if defined(OS_MAC)
|
||||||
void SetActivationPolicy(gin_helper::ErrorThrower thrower,
|
void SetActivationPolicy(gin_helper::ErrorThrower thrower,
|
||||||
|
|
|
@ -2008,23 +2008,14 @@ void WebContents::Stop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebContents::GoBack() {
|
void WebContents::GoBack() {
|
||||||
if (!ElectronBrowserClient::Get()->CanUseCustomSiteInstance()) {
|
|
||||||
electron::ElectronBrowserClient::SuppressRendererProcessRestartForOnce();
|
|
||||||
}
|
|
||||||
web_contents()->GetController().GoBack();
|
web_contents()->GetController().GoBack();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebContents::GoForward() {
|
void WebContents::GoForward() {
|
||||||
if (!ElectronBrowserClient::Get()->CanUseCustomSiteInstance()) {
|
|
||||||
electron::ElectronBrowserClient::SuppressRendererProcessRestartForOnce();
|
|
||||||
}
|
|
||||||
web_contents()->GetController().GoForward();
|
web_contents()->GetController().GoForward();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebContents::GoToOffset(int offset) {
|
void WebContents::GoToOffset(int offset) {
|
||||||
if (!ElectronBrowserClient::Get()->CanUseCustomSiteInstance()) {
|
|
||||||
electron::ElectronBrowserClient::SuppressRendererProcessRestartForOnce();
|
|
||||||
}
|
|
||||||
web_contents()->GetController().GoToOffset(offset);
|
web_contents()->GetController().GoToOffset(offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -353,10 +353,6 @@ int GetCrashSignalFD(const base::CommandLine& command_line) {
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// static
|
// static
|
||||||
void ElectronBrowserClient::SuppressRendererProcessRestartForOnce() {
|
|
||||||
g_suppress_renderer_process_restart = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ElectronBrowserClient* ElectronBrowserClient::Get() {
|
ElectronBrowserClient* ElectronBrowserClient::Get() {
|
||||||
return g_browser_client;
|
return g_browser_client;
|
||||||
}
|
}
|
||||||
|
@ -488,46 +484,13 @@ bool ElectronBrowserClient::RendererDisablesPopups(int process_id) const {
|
||||||
return it != process_preferences_.end() && it->second.disable_popups;
|
return it != process_preferences_.end() && it->second.disable_popups;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ElectronBrowserClient::GetAffinityPreference(
|
|
||||||
content::RenderFrameHost* rfh) const {
|
|
||||||
auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
|
|
||||||
auto* web_preferences = WebContentsPreferences::From(web_contents);
|
|
||||||
std::string affinity;
|
|
||||||
if (web_preferences &&
|
|
||||||
web_preferences->GetPreference("affinity", &affinity) &&
|
|
||||||
!affinity.empty()) {
|
|
||||||
affinity = base::ToLowerASCII(affinity);
|
|
||||||
}
|
|
||||||
|
|
||||||
return affinity;
|
|
||||||
}
|
|
||||||
|
|
||||||
content::SiteInstance* ElectronBrowserClient::GetSiteInstanceFromAffinity(
|
content::SiteInstance* ElectronBrowserClient::GetSiteInstanceFromAffinity(
|
||||||
content::BrowserContext* browser_context,
|
content::BrowserContext* browser_context,
|
||||||
const GURL& url,
|
const GURL& url,
|
||||||
content::RenderFrameHost* rfh) const {
|
content::RenderFrameHost* rfh) const {
|
||||||
std::string affinity = GetAffinityPreference(rfh);
|
|
||||||
if (!affinity.empty()) {
|
|
||||||
auto iter = site_per_affinities_.find(affinity);
|
|
||||||
GURL dest_site = GetSiteForURL(browser_context, url).site_url();
|
|
||||||
if (iter != site_per_affinities_.end() &&
|
|
||||||
IsSameWebSite(browser_context, iter->second, dest_site)) {
|
|
||||||
return iter->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ElectronBrowserClient::ConsiderSiteInstanceForAffinity(
|
|
||||||
content::RenderFrameHost* rfh,
|
|
||||||
content::SiteInstance* site_instance) {
|
|
||||||
std::string affinity = GetAffinityPreference(rfh);
|
|
||||||
if (!affinity.empty()) {
|
|
||||||
site_per_affinities_[affinity] = site_instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ElectronBrowserClient::IsRendererSubFrame(int process_id) const {
|
bool ElectronBrowserClient::IsRendererSubFrame(int process_id) const {
|
||||||
return base::Contains(renderer_is_subframe_, process_id);
|
return base::Contains(renderer_is_subframe_, process_id);
|
||||||
}
|
}
|
||||||
|
@ -612,8 +575,7 @@ void ElectronBrowserClient::OverrideWebkitPrefs(
|
||||||
SessionPreferences::GetValidPreloads(web_contents->GetBrowserContext());
|
SessionPreferences::GetValidPreloads(web_contents->GetBrowserContext());
|
||||||
if (!preloads.empty())
|
if (!preloads.empty())
|
||||||
prefs->preloads = preloads;
|
prefs->preloads = preloads;
|
||||||
if (CanUseCustomSiteInstance())
|
prefs->disable_electron_site_instance_overrides = true;
|
||||||
prefs->disable_electron_site_instance_overrides = true;
|
|
||||||
|
|
||||||
SetFontDefaults(prefs);
|
SetFontDefaults(prefs);
|
||||||
|
|
||||||
|
@ -624,14 +586,6 @@ void ElectronBrowserClient::OverrideWebkitPrefs(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ElectronBrowserClient::SetCanUseCustomSiteInstance(bool should_disable) {
|
|
||||||
disable_process_restart_tricks_ = should_disable;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ElectronBrowserClient::CanUseCustomSiteInstance() {
|
|
||||||
return disable_process_restart_tricks_;
|
|
||||||
}
|
|
||||||
|
|
||||||
content::ContentBrowserClient::SiteInstanceForNavigationType
|
content::ContentBrowserClient::SiteInstanceForNavigationType
|
||||||
ElectronBrowserClient::ShouldOverrideSiteInstanceForNavigation(
|
ElectronBrowserClient::ShouldOverrideSiteInstanceForNavigation(
|
||||||
content::RenderFrameHost* current_rfh,
|
content::RenderFrameHost* current_rfh,
|
||||||
|
@ -686,9 +640,6 @@ ElectronBrowserClient::ShouldOverrideSiteInstanceForNavigation(
|
||||||
void ElectronBrowserClient::RegisterPendingSiteInstance(
|
void ElectronBrowserClient::RegisterPendingSiteInstance(
|
||||||
content::RenderFrameHost* rfh,
|
content::RenderFrameHost* rfh,
|
||||||
content::SiteInstance* pending_site_instance) {
|
content::SiteInstance* pending_site_instance) {
|
||||||
// Do we have an affinity site to manage?
|
|
||||||
ConsiderSiteInstanceForAffinity(rfh, pending_site_instance);
|
|
||||||
|
|
||||||
// Remember the original web contents for the pending renderer process.
|
// Remember the original web contents for the pending renderer process.
|
||||||
auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
|
auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
|
||||||
auto* pending_process = pending_site_instance->GetProcess();
|
auto* pending_process = pending_site_instance->GetProcess();
|
||||||
|
@ -1015,16 +966,6 @@ bool ElectronBrowserClient::ArePersistentMediaDeviceIDsAllowed(
|
||||||
|
|
||||||
void ElectronBrowserClient::SiteInstanceDeleting(
|
void ElectronBrowserClient::SiteInstanceDeleting(
|
||||||
content::SiteInstance* site_instance) {
|
content::SiteInstance* site_instance) {
|
||||||
// We are storing weak_ptr, is it fundamental to maintain the map up-to-date
|
|
||||||
// when an instance is destroyed.
|
|
||||||
for (auto iter = site_per_affinities_.begin();
|
|
||||||
iter != site_per_affinities_.end(); ++iter) {
|
|
||||||
if (iter->second == site_instance) {
|
|
||||||
site_per_affinities_.erase(iter);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
// Don't do anything if we're shutting down.
|
// Don't do anything if we're shutting down.
|
||||||
if (content::BrowserMainRunner::ExitedMainMessageLoop())
|
if (content::BrowserMainRunner::ExitedMainMessageLoop())
|
||||||
|
@ -1794,6 +1735,10 @@ ElectronBrowserClient::GetPluginMimeTypesWithExternalHandlers(
|
||||||
return mime_types;
|
return mime_types;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ElectronBrowserClient::CanUseCustomSiteInstance() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
content::SerialDelegate* ElectronBrowserClient::GetSerialDelegate() {
|
content::SerialDelegate* ElectronBrowserClient::GetSerialDelegate() {
|
||||||
if (!serial_delegate_)
|
if (!serial_delegate_)
|
||||||
serial_delegate_ = std::make_unique<ElectronSerialDelegate>();
|
serial_delegate_ = std::make_unique<ElectronSerialDelegate>();
|
||||||
|
|
|
@ -51,9 +51,6 @@ class ElectronBrowserClient : public content::ContentBrowserClient,
|
||||||
// Returns the WebContents for pending render processes.
|
// Returns the WebContents for pending render processes.
|
||||||
content::WebContents* GetWebContentsFromProcessID(int process_id);
|
content::WebContents* GetWebContentsFromProcessID(int process_id);
|
||||||
|
|
||||||
// Don't force renderer process to restart for once.
|
|
||||||
static void SuppressRendererProcessRestartForOnce();
|
|
||||||
|
|
||||||
NotificationPresenter* GetNotificationPresenter();
|
NotificationPresenter* GetNotificationPresenter();
|
||||||
|
|
||||||
void WebNotificationAllowed(int render_process_id,
|
void WebNotificationAllowed(int render_process_id,
|
||||||
|
@ -87,9 +84,8 @@ class ElectronBrowserClient : public content::ContentBrowserClient,
|
||||||
std::string GetUserAgent() override;
|
std::string GetUserAgent() override;
|
||||||
void SetUserAgent(const std::string& user_agent);
|
void SetUserAgent(const std::string& user_agent);
|
||||||
|
|
||||||
void SetCanUseCustomSiteInstance(bool should_disable);
|
|
||||||
bool CanUseCustomSiteInstance() override;
|
|
||||||
content::SerialDelegate* GetSerialDelegate() override;
|
content::SerialDelegate* GetSerialDelegate() override;
|
||||||
|
bool CanUseCustomSiteInstance() override;
|
||||||
|
|
||||||
content::BluetoothDelegate* GetBluetoothDelegate() override;
|
content::BluetoothDelegate* GetBluetoothDelegate() override;
|
||||||
|
|
||||||
|
@ -310,13 +306,10 @@ class ElectronBrowserClient : public content::ContentBrowserClient,
|
||||||
bool IsRendererSandboxed(int process_id) const;
|
bool IsRendererSandboxed(int process_id) const;
|
||||||
bool RendererUsesNativeWindowOpen(int process_id) const;
|
bool RendererUsesNativeWindowOpen(int process_id) const;
|
||||||
bool RendererDisablesPopups(int process_id) const;
|
bool RendererDisablesPopups(int process_id) const;
|
||||||
std::string GetAffinityPreference(content::RenderFrameHost* rfh) const;
|
|
||||||
content::SiteInstance* GetSiteInstanceFromAffinity(
|
content::SiteInstance* GetSiteInstanceFromAffinity(
|
||||||
content::BrowserContext* browser_context,
|
content::BrowserContext* browser_context,
|
||||||
const GURL& url,
|
const GURL& url,
|
||||||
content::RenderFrameHost* rfh) const;
|
content::RenderFrameHost* rfh) const;
|
||||||
void ConsiderSiteInstanceForAffinity(content::RenderFrameHost* rfh,
|
|
||||||
content::SiteInstance* site_instance);
|
|
||||||
|
|
||||||
bool IsRendererSubFrame(int process_id) const;
|
bool IsRendererSubFrame(int process_id) const;
|
||||||
|
|
||||||
|
@ -325,9 +318,6 @@ class ElectronBrowserClient : public content::ContentBrowserClient,
|
||||||
|
|
||||||
std::set<int> renderer_is_subframe_;
|
std::set<int> renderer_is_subframe_;
|
||||||
|
|
||||||
// list of site per affinity. weak_ptr to prevent instance locking
|
|
||||||
std::map<std::string, content::SiteInstance*> site_per_affinities_;
|
|
||||||
|
|
||||||
std::unique_ptr<PlatformNotificationService> notification_service_;
|
std::unique_ptr<PlatformNotificationService> notification_service_;
|
||||||
std::unique_ptr<NotificationPresenter> notification_presenter_;
|
std::unique_ptr<NotificationPresenter> notification_presenter_;
|
||||||
|
|
||||||
|
@ -337,8 +327,6 @@ class ElectronBrowserClient : public content::ContentBrowserClient,
|
||||||
|
|
||||||
std::string user_agent_override_ = "";
|
std::string user_agent_override_ = "";
|
||||||
|
|
||||||
bool disable_process_restart_tricks_ = true;
|
|
||||||
|
|
||||||
// Simple shared ID generator, used by ProxyingURLLoaderFactory and
|
// Simple shared ID generator, used by ProxyingURLLoaderFactory and
|
||||||
// ProxyingWebSocket classes.
|
// ProxyingWebSocket classes.
|
||||||
uint64_t next_id_ = 0;
|
uint64_t next_id_ = 0;
|
||||||
|
|
|
@ -1661,26 +1661,6 @@ describe('default behavior', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('app.allowRendererProcessReuse', () => {
|
|
||||||
it('should default to true', () => {
|
|
||||||
expect(app.allowRendererProcessReuse).to.equal(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should cause renderer processes to get new PIDs when false', async () => {
|
|
||||||
const output = await runTestApp('site-instance-overrides', 'false');
|
|
||||||
expect(output[0]).to.be.a('number').that.is.greaterThan(0);
|
|
||||||
expect(output[1]).to.be.a('number').that.is.greaterThan(0);
|
|
||||||
expect(output[0]).to.not.equal(output[1]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should cause renderer processes to keep the same PID when true', async () => {
|
|
||||||
const output = await runTestApp('site-instance-overrides', 'true');
|
|
||||||
expect(output[0]).to.be.a('number').that.is.greaterThan(0);
|
|
||||||
expect(output[1]).to.be.a('number').that.is.greaterThan(0);
|
|
||||||
expect(output[0]).to.equal(output[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('login event', () => {
|
describe('login event', () => {
|
||||||
afterEach(closeAllWindows);
|
afterEach(closeAllWindows);
|
||||||
let server: http.Server;
|
let server: http.Server;
|
||||||
|
|
|
@ -1,178 +0,0 @@
|
||||||
import { expect } from 'chai';
|
|
||||||
import * as path from 'path';
|
|
||||||
|
|
||||||
import { ipcMain, BrowserWindow, WebPreferences, app } from 'electron/main';
|
|
||||||
import { closeWindow } from './window-helpers';
|
|
||||||
import { emittedOnce } from './events-helpers';
|
|
||||||
|
|
||||||
describe('BrowserWindow with affinity module', () => {
|
|
||||||
const fixtures = path.resolve(__dirname, '..', 'spec', 'fixtures');
|
|
||||||
const myAffinityName = 'myAffinity';
|
|
||||||
const myAffinityNameUpper = 'MYAFFINITY';
|
|
||||||
const anotherAffinityName = 'anotherAffinity';
|
|
||||||
|
|
||||||
before(() => {
|
|
||||||
app.allowRendererProcessReuse = false;
|
|
||||||
});
|
|
||||||
|
|
||||||
after(() => {
|
|
||||||
app.allowRendererProcessReuse = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
async function createWindowWithWebPrefs (webPrefs: WebPreferences) {
|
|
||||||
const w = new BrowserWindow({
|
|
||||||
show: false,
|
|
||||||
width: 400,
|
|
||||||
height: 400,
|
|
||||||
webPreferences: webPrefs || {}
|
|
||||||
});
|
|
||||||
await w.loadFile(path.join(fixtures, 'api', 'blank.html'));
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
function testAffinityProcessIds (name: string, webPreferences: WebPreferences = {}) {
|
|
||||||
describe(name, () => {
|
|
||||||
let mAffinityWindow: BrowserWindow;
|
|
||||||
before(async () => {
|
|
||||||
mAffinityWindow = await createWindowWithWebPrefs({ affinity: myAffinityName, ...webPreferences });
|
|
||||||
});
|
|
||||||
|
|
||||||
after(async () => {
|
|
||||||
await closeWindow(mAffinityWindow, { assertNotWindows: false });
|
|
||||||
mAffinityWindow = null as unknown as BrowserWindow;
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should have a different process id than a default window', async () => {
|
|
||||||
const w = await createWindowWithWebPrefs({ ...webPreferences });
|
|
||||||
const affinityID = mAffinityWindow.webContents.getOSProcessId();
|
|
||||||
const wcID = w.webContents.getOSProcessId();
|
|
||||||
|
|
||||||
expect(affinityID).to.not.equal(wcID, 'Should have different OS process IDs');
|
|
||||||
await closeWindow(w, { assertNotWindows: false });
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should have a different process id than a window with a different affinity '${anotherAffinityName}'`, async () => {
|
|
||||||
const w = await createWindowWithWebPrefs({ affinity: anotherAffinityName, ...webPreferences });
|
|
||||||
const affinityID = mAffinityWindow.webContents.getOSProcessId();
|
|
||||||
const wcID = w.webContents.getOSProcessId();
|
|
||||||
|
|
||||||
expect(affinityID).to.not.equal(wcID, 'Should have different OS process IDs');
|
|
||||||
await closeWindow(w, { assertNotWindows: false });
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should have the same OS process id than a window with the same affinity '${myAffinityName}'`, async () => {
|
|
||||||
const w = await createWindowWithWebPrefs({ affinity: myAffinityName, ...webPreferences });
|
|
||||||
const affinityID = mAffinityWindow.webContents.getOSProcessId();
|
|
||||||
const wcID = w.webContents.getOSProcessId();
|
|
||||||
|
|
||||||
expect(affinityID).to.equal(wcID, 'Should have the same OS process ID');
|
|
||||||
await closeWindow(w, { assertNotWindows: false });
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should have the same OS process id than a window with an equivalent affinity '${myAffinityNameUpper}' (case insensitive)`, async () => {
|
|
||||||
const w = await createWindowWithWebPrefs({ affinity: myAffinityNameUpper, ...webPreferences });
|
|
||||||
const affinityID = mAffinityWindow.webContents.getOSProcessId();
|
|
||||||
const wcID = w.webContents.getOSProcessId();
|
|
||||||
|
|
||||||
expect(affinityID).to.equal(wcID, 'Should have the same OS process ID');
|
|
||||||
await closeWindow(w, { assertNotWindows: false });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
testAffinityProcessIds(`BrowserWindow with an affinity '${myAffinityName}'`);
|
|
||||||
testAffinityProcessIds(`BrowserWindow with an affinity '${myAffinityName}' and sandbox enabled`, { sandbox: true });
|
|
||||||
testAffinityProcessIds(`BrowserWindow with an affinity '${myAffinityName}' and nativeWindowOpen enabled`, { nativeWindowOpen: true });
|
|
||||||
|
|
||||||
describe('BrowserWindow with an affinity : nodeIntegration=false', () => {
|
|
||||||
const preload = path.join(fixtures, 'module', 'send-later.js');
|
|
||||||
const affinityWithNodeTrue = 'affinityWithNodeTrue';
|
|
||||||
const affinityWithNodeFalse = 'affinityWithNodeFalse';
|
|
||||||
|
|
||||||
async function testNodeIntegration (present: boolean) {
|
|
||||||
const [, typeofProcess, typeofBuffer] = await emittedOnce(ipcMain, 'answer');
|
|
||||||
if (present) {
|
|
||||||
expect(typeofProcess).to.not.equal('undefined');
|
|
||||||
expect(typeofBuffer).to.not.equal('undefined');
|
|
||||||
} else {
|
|
||||||
expect(typeofProcess).to.equal('undefined');
|
|
||||||
expect(typeofBuffer).to.equal('undefined');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
it('disables node integration when specified to false', async () => {
|
|
||||||
const [, w] = await Promise.all([
|
|
||||||
testNodeIntegration(false),
|
|
||||||
createWindowWithWebPrefs({
|
|
||||||
affinity: affinityWithNodeTrue,
|
|
||||||
preload,
|
|
||||||
nodeIntegration: false,
|
|
||||||
contextIsolation: false
|
|
||||||
})
|
|
||||||
]);
|
|
||||||
await closeWindow(w, { assertNotWindows: false });
|
|
||||||
});
|
|
||||||
it('allows nodeIntegration to enable in second window with the same affinity', async () => {
|
|
||||||
const [, w1] = await Promise.all([
|
|
||||||
testNodeIntegration(false),
|
|
||||||
createWindowWithWebPrefs({
|
|
||||||
affinity: affinityWithNodeTrue,
|
|
||||||
preload,
|
|
||||||
nodeIntegration: false,
|
|
||||||
contextIsolation: false
|
|
||||||
})
|
|
||||||
]);
|
|
||||||
const [, w2] = await Promise.all([
|
|
||||||
testNodeIntegration(true),
|
|
||||||
createWindowWithWebPrefs({
|
|
||||||
affinity: affinityWithNodeTrue,
|
|
||||||
preload,
|
|
||||||
nodeIntegration: true,
|
|
||||||
contextIsolation: false
|
|
||||||
})
|
|
||||||
]);
|
|
||||||
await Promise.all([
|
|
||||||
closeWindow(w1, { assertNotWindows: false }),
|
|
||||||
closeWindow(w2, { assertNotWindows: false })
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('enables node integration when specified to true', async () => {
|
|
||||||
const [, w] = await Promise.all([
|
|
||||||
testNodeIntegration(true),
|
|
||||||
createWindowWithWebPrefs({
|
|
||||||
affinity: affinityWithNodeFalse,
|
|
||||||
preload,
|
|
||||||
nodeIntegration: true,
|
|
||||||
contextIsolation: false
|
|
||||||
})
|
|
||||||
]);
|
|
||||||
await closeWindow(w, { assertNotWindows: false });
|
|
||||||
});
|
|
||||||
|
|
||||||
it('allows nodeIntegration to disable in second window with the same affinity', async () => {
|
|
||||||
const [, w1] = await Promise.all([
|
|
||||||
testNodeIntegration(true),
|
|
||||||
createWindowWithWebPrefs({
|
|
||||||
affinity: affinityWithNodeFalse,
|
|
||||||
preload,
|
|
||||||
nodeIntegration: true,
|
|
||||||
contextIsolation: false
|
|
||||||
})
|
|
||||||
]);
|
|
||||||
const [, w2] = await Promise.all([
|
|
||||||
testNodeIntegration(false),
|
|
||||||
createWindowWithWebPrefs({
|
|
||||||
affinity: affinityWithNodeFalse,
|
|
||||||
preload,
|
|
||||||
nodeIntegration: false,
|
|
||||||
contextIsolation: false
|
|
||||||
})
|
|
||||||
]);
|
|
||||||
await Promise.all([
|
|
||||||
closeWindow(w1, { assertNotWindows: false }),
|
|
||||||
closeWindow(w2, { assertNotWindows: false })
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -4411,29 +4411,27 @@ describe('BrowserWindow module', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('reloading with allowRendererProcessReuse enabled', () => {
|
it('reloading does not cause Node.js module API hangs after reload', (done) => {
|
||||||
it('does not cause Node.js module API hangs after reload', (done) => {
|
const w = new BrowserWindow({
|
||||||
const w = new BrowserWindow({
|
show: false,
|
||||||
show: false,
|
webPreferences: {
|
||||||
webPreferences: {
|
nodeIntegration: true,
|
||||||
nodeIntegration: true,
|
contextIsolation: false
|
||||||
contextIsolation: false
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let count = 0;
|
|
||||||
ipcMain.on('async-node-api-done', () => {
|
|
||||||
if (count === 3) {
|
|
||||||
ipcMain.removeAllListeners('async-node-api-done');
|
|
||||||
done();
|
|
||||||
} else {
|
|
||||||
count++;
|
|
||||||
w.reload();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
w.loadFile(path.join(fixtures, 'pages', 'send-after-node.html'));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let count = 0;
|
||||||
|
ipcMain.on('async-node-api-done', () => {
|
||||||
|
if (count === 3) {
|
||||||
|
ipcMain.removeAllListeners('async-node-api-done');
|
||||||
|
done();
|
||||||
|
} else {
|
||||||
|
count++;
|
||||||
|
w.reload();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
w.loadFile(path.join(fixtures, 'pages', 'send-after-node.html'));
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('window.webContents.focus()', () => {
|
describe('window.webContents.focus()', () => {
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
<html></html>
|
|
|
@ -1,36 +0,0 @@
|
||||||
const { app, BrowserWindow, ipcMain } = require('electron');
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
process.noDeprecation = true;
|
|
||||||
|
|
||||||
process.on('uncaughtException', (e) => {
|
|
||||||
console.error(e);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
app.allowRendererProcessReuse = JSON.parse(process.argv[2]);
|
|
||||||
|
|
||||||
const pids = [];
|
|
||||||
let win;
|
|
||||||
|
|
||||||
ipcMain.on('pid', (event, pid) => {
|
|
||||||
pids.push(pid);
|
|
||||||
if (pids.length === 2) {
|
|
||||||
console.log(JSON.stringify(pids));
|
|
||||||
if (win) win.close();
|
|
||||||
app.quit();
|
|
||||||
} else {
|
|
||||||
if (win) win.reload();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
|
||||||
win = new BrowserWindow({
|
|
||||||
show: false,
|
|
||||||
webPreferences: {
|
|
||||||
preload: path.resolve(__dirname, 'preload.js'),
|
|
||||||
contextIsolation: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
win.loadFile('index.html');
|
|
||||||
});
|
|
|
@ -1,4 +0,0 @@
|
||||||
{
|
|
||||||
"name": "electron-test-site-instance-overrides",
|
|
||||||
"main": "main.js"
|
|
||||||
}
|
|
|
@ -1,3 +0,0 @@
|
||||||
const { ipcRenderer } = require('electron');
|
|
||||||
|
|
||||||
ipcRenderer.send('pid', process.pid);
|
|
Loading…
Add table
Add a link
Reference in a new issue