1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Implement way to resolve a proxy, that is not reliant on existing windows

Co-authored-by: Janne Savolainen <janne.savolainen@live.fi>

Signed-off-by: Iku-turso <mikko.aspiala@gmail.com>
This commit is contained in:
Iku-turso 2022-06-21 12:56:35 +03:00
parent d6bbe3a969
commit 07eaf835de
4 changed files with 223 additions and 2 deletions

View File

@ -0,0 +1,14 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { BrowserWindow } from "electron";
const createTemporaryBrowserWindowInjectable = getInjectable({
id: "create-temporary-browser-window",
instantiate: () => () => new BrowserWindow({ show: false }),
causesSideEffects: true,
});
export default createTemporaryBrowserWindowInjectable;

View File

@ -0,0 +1,14 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import electron from "electron";
const electronInjectable = getInjectable({
id: "electron",
instantiate: () => electron,
causesSideEffects: true,
});
export default electronInjectable;

View File

@ -3,13 +3,33 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import electronInjectable from "./electron.injectable";
import createTemporaryBrowserWindowInjectable from "./create-temporary-browser-window.injectable";
const resolveProxyFromElectronInjectable = getInjectable({ const resolveProxyFromElectronInjectable = getInjectable({
id: "resolve-proxy-from-electron", id: "resolve-proxy-from-electron",
instantiate: () => async (url: string) => "not-implemented-yet", instantiate: (di) => {
const electron = di.inject(electronInjectable);
const createTemporaryBrowserWindow = di.inject(createTemporaryBrowserWindowInjectable);
causesSideEffects: true, return async (url: string) => {
const webContent = electron.webContents
.getAllWebContents()
.find((x) => !x.isDestroyed());
if(!webContent) {
const tempWindow = createTemporaryBrowserWindow();
const proxy = await tempWindow.webContents.session.resolveProxy(url);
tempWindow.destroy();
return proxy;
}
return webContent?.session.resolveProxy(url);
};
},
}); });
export default resolveProxyFromElectronInjectable; export default resolveProxyFromElectronInjectable;

View File

@ -0,0 +1,173 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getDiForUnitTesting } from "../../../../main/getDiForUnitTesting";
import resolveProxyFromElectronInjectable from "./resolve-proxy-from-electron.injectable";
import electronInjectable from "./electron.injectable";
import type { AsyncFnMock } from "@async-fn/jest";
import asyncFn from "@async-fn/jest";
import type electron from "electron";
import { getPromiseStatus } from "../../../../common/test-utils/get-promise-status";
import createTemporaryBrowserWindowInjectable from "./create-temporary-browser-window.injectable";
describe("technical: resolve-proxy-from-electron", () => {
let resolveProxyMock: AsyncFnMock<(url: string) => Promise<string>>;
describe("given there are non-destroyed Lens windows, when called with URL", () => {
let actualPromise: Promise<string>;
beforeEach(() => {
const di = getDiForUnitTesting();
resolveProxyMock = asyncFn();
di.override(
electronInjectable,
() =>
({
webContents: {
getAllWebContents: () => [
{
isDestroyed: () => true,
session: {
resolveProxy: () => {
throw new Error("should never come here");
},
},
},
{
isDestroyed: () => false,
session: { resolveProxy: resolveProxyMock },
},
{
isDestroyed: () => false,
session: {
resolveProxy: () => {
throw new Error("should never come here");
},
},
},
],
},
} as unknown as typeof electron),
);
di.override(createTemporaryBrowserWindowInjectable, () => () => {
throw new Error("should never come here");
});
const resolveProxyFromElectron = di.inject(
resolveProxyFromElectronInjectable,
);
actualPromise = resolveProxyFromElectron("some-url");
});
it("calls to resolve proxy from the first window", () => {
expect(resolveProxyMock).toHaveBeenCalledWith("some-url");
});
it("does not resolve yet", async () => {
const promiseStatus = await getPromiseStatus(actualPromise);
expect(promiseStatus.fulfilled).toBe(false);
});
it("when call for proxy, resolves with the proxy", async () => {
resolveProxyMock.resolve("some-proxy");
expect(await actualPromise).toBe("some-proxy");
});
});
describe("given there are only destroyed Lens windows, when called with URL", () => {
let actualPromise: Promise<string>;
let createTemporaryBrowserWindowMock: jest.Mock;
let destroyTempWindowMock: jest.Mock;
beforeEach(() => {
const di = getDiForUnitTesting();
di.override(
electronInjectable,
() =>
({
webContents: {
getAllWebContents: () => [
{
isDestroyed: () => true,
session: {
resolveProxy: () => {
throw new Error("should never come here");
},
},
},
],
},
} as unknown as typeof electron),
);
resolveProxyMock = asyncFn();
destroyTempWindowMock = jest.fn();
createTemporaryBrowserWindowMock = jest.fn(() => ({
webContents: {
session: {
resolveProxy: resolveProxyMock,
},
},
destroy: destroyTempWindowMock,
}));
di.override(createTemporaryBrowserWindowInjectable, () => createTemporaryBrowserWindowMock);
const resolveProxyFromElectron = di.inject(
resolveProxyFromElectronInjectable,
);
actualPromise = resolveProxyFromElectron("some-url");
});
it("creates a new temporary window for resolving proxy", () => {
expect(createTemporaryBrowserWindowMock).toHaveBeenCalledWith();
});
it("calls for proxy from the temporary window", () => {
expect(resolveProxyMock).toHaveBeenCalledWith("some-url");
});
it("does not resolve yet", async () => {
const promiseStatus = await getPromiseStatus(actualPromise);
expect(promiseStatus.fulfilled).toBe(false);
});
it("does not destroy the temp window yet", () => {
expect(destroyTempWindowMock).not.toHaveBeenCalled();
});
describe("when the call resolves", () => {
beforeEach(async () => {
await resolveProxyMock.resolve("some-proxy-from-temp-window");
});
it("destroys the temp window", () => {
expect(destroyTempWindowMock).toHaveBeenCalled();
});
it("resolves with the proxy", async () => {
expect(await actualPromise).toBe("some-proxy-from-temp-window");
});
});
});
});