Skip to content

Commit 77a0db7

Browse files
committed
@ProtonMail web clients: make outside links clicking work, closes #344
1 parent 99c8215 commit 77a0db7

File tree

5 files changed

+61
-0
lines changed

5 files changed

+61
-0
lines changed

patches/protonmail/common.patch

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,37 @@ index b6913e1..31a52f7 100644
2424

2525
export const getClientID = (appName: APP_NAMES) => {
2626
return APPS_CONFIGURATION[appName].clientID;
27+
diff --git a/node_modules/proton-shared/lib/helpers/browser.ts b/node_modules/proton-shared/lib/helpers/browser.ts
28+
index cf3991e..8ff16c7 100644
29+
--- a/node_modules/proton-shared/lib/helpers/browser.ts
30+
+++ b/node_modules/proton-shared/lib/helpers/browser.ts
31+
@@ -112,20 +112,10 @@ export const requireDirectAction = () => isSafari() || isFirefox() || isEdge();
32+
* @links { https://mathiasbynens.github.io/rel-noopener/}
33+
*/
34+
export const openNewTab = (url: string) => {
35+
- if (isIE11() || isFirefox()) {
36+
- const otherWindow = window.open();
37+
- if (!otherWindow) {
38+
- return;
39+
- }
40+
- otherWindow.opener = null;
41+
- otherWindow.location.href = url;
42+
- return;
43+
- }
44+
- const anchor = document.createElement('a');
45+
-
46+
- anchor.setAttribute('rel', 'noreferrer nofollow noopener');
47+
- anchor.setAttribute('target', '_blank');
48+
- anchor.href = url;
49+
-
50+
- return anchor.click();
51+
+ window.dispatchEvent(
52+
+ new CustomEvent(
53+
+ "electron-mail:./node_modules/proton-shared/lib/helpers/browser.ts:openNewTab",
54+
+ {detail: { url }},
55+
+ ),
56+
+ );
57+
};
2758
diff --git a/node_modules/proton-shared/lib/constants.ts b/node_modules/proton-shared/lib/constants.ts
2859
index a1b7919..ff7f6ec 100644
2960
--- a/node_modules/proton-shared/lib/constants.ts

src/electron-preload/webview/calendar/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@ import {curryFunctionMembers, testProtonCalendarAppPage} from "src/shared/util";
33
import {getLocationHref} from "src/electron-preload/webview/lib/util";
44
import {initProviderApi} from "./provider-api";
55
import {registerApi} from "./api";
6+
import {setupProtonOpenNewTabEventHandler} from "src/electron-preload/webview/lib/custom-event";
67

78
const logger = curryFunctionMembers(WEBVIEW_LOGGERS.calendar, "[index]");
89
const protonAppPageStatus = testProtonCalendarAppPage({url: getLocationHref(), logger});
910

11+
setupProtonOpenNewTabEventHandler(logger);
12+
1013
// TODO throw error if "not calendar or blank.html" page loaded
1114
if (protonAppPageStatus.shouldInitProviderApi) {
1215
// TODO set up timeout

src/electron-preload/webview/lib/const.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ export const WEBVIEW_LOGGERS: Readonly<Record<"primary" | "calendar", Logger>> =
88
primary: buildLoggerBundle("[preload: webview/primary]"),
99
calendar: buildLoggerBundle("[preload: webview/calendar]"),
1010
};
11+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {Logger} from "src/shared/model/common";
2+
import {resolveIpcMainApi} from "src/electron-preload/lib/util";
3+
4+
class ProtonOpenNewTabEvent extends CustomEvent<{ url: string }> {
5+
static readonly eventType = "electron-mail:./node_modules/proton-shared/lib/helpers/browser.ts:openNewTab";
6+
7+
constructor(detail: { url: string }) {
8+
super(ProtonOpenNewTabEvent.eventType, {detail});
9+
}
10+
}
11+
12+
declare global {
13+
interface WindowEventMap {
14+
[ProtonOpenNewTabEvent.eventType]: ProtonOpenNewTabEvent
15+
}
16+
}
17+
18+
export const setupProtonOpenNewTabEventHandler = (logger: Logger): void => {
19+
const openExternal = resolveIpcMainApi({logger})("openExternal");
20+
21+
window.addEventListener(ProtonOpenNewTabEvent.eventType, async ({detail: {url}}) => {
22+
await openExternal({url}); // eslint-disable-line @typescript-eslint/no-floating-promises
23+
});
24+
};

src/electron-preload/webview/primary/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ import {curryFunctionMembers, testProtonMailAppPage} from "src/shared/util";
33
import {getLocationHref} from "src/electron-preload/webview/lib/util";
44
import {initProviderApi} from "./provider-api";
55
import {registerApi} from "./api";
6+
import {setupProtonOpenNewTabEventHandler} from "src/electron-preload/webview/lib/custom-event";
67
import {setupProviderIntegration} from "./provider-api/setup";
78

89
const logger = curryFunctionMembers(WEBVIEW_LOGGERS.primary, "[index]");
910
const protonAppPageStatus = testProtonMailAppPage({url: getLocationHref(), logger});
1011

12+
setupProtonOpenNewTabEventHandler(logger);
1113
setupProviderIntegration(protonAppPageStatus);
1214

1315
if (protonAppPageStatus.shouldInitProviderApi) {

0 commit comments

Comments
 (0)