slackgmailskypefacebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegramhangouts
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.3 KiB
127 lines
3.3 KiB
/** |
|
* This file is loaded in the service web views to provide a Rambox API. |
|
*/ |
|
|
|
const { desktopCapturer, ipcRenderer } = require("electron"); |
|
const { |
|
ContextMenuBuilder, |
|
ContextMenuListener, |
|
} = require("electron-contextmenu-wrapper"); |
|
|
|
/** |
|
* Make the Rambox API available via a global "rambox" variable. |
|
* |
|
* @type {{}} |
|
*/ |
|
window.rambox = {}; |
|
|
|
/** |
|
* Sets the unread count of the tab. |
|
* |
|
* @param {*} count The unread count |
|
*/ |
|
window.rambox.setUnreadCount = function (count) { |
|
ipcRenderer.sendToHost("rambox.setUnreadCount", count); |
|
}; |
|
|
|
/** |
|
* Clears the unread count. |
|
*/ |
|
window.rambox.clearUnreadCount = function () { |
|
ipcRenderer.sendToHost("rambox.clearUnreadCount"); |
|
}; |
|
|
|
/** |
|
* Override to add notification click event to display Rambox window and activate service tab |
|
*/ |
|
var NativeNotification = Notification; |
|
Notification = function (title, options) { |
|
var notification = new NativeNotification(title, options); |
|
|
|
notification.addEventListener("click", function () { |
|
ipcRenderer.sendToHost("rambox.showWindowAndActivateTab"); |
|
}); |
|
|
|
//It seems that gmail is checking if such event handler func are available. Just remplacing them by a void function that is always returning true is making the thing right! |
|
notification.addEventListener = function () { |
|
return true; |
|
}; |
|
notification.attachEvent = function () { |
|
return true; |
|
}; |
|
notification.addListener = function () { |
|
return true; |
|
}; |
|
|
|
return notification; |
|
}; |
|
|
|
Notification.prototype = NativeNotification.prototype; |
|
Notification.permission = NativeNotification.permission; |
|
Notification.requestPermission = NativeNotification.requestPermission.bind( |
|
Notification |
|
); |
|
|
|
window.rambox.contextMenuBuilder = new ContextMenuBuilder(); |
|
window.rambox.contextMenuListener = new ContextMenuListener(function ( |
|
event, |
|
info |
|
) { |
|
window.rambox.contextMenuBuilder.showPopupMenu(info); |
|
}); |
|
|
|
const mousetrap = require("mousetrap"); |
|
mousetrap.bind( |
|
process.platform === "darwin" |
|
? ["command+left", "command+right"] |
|
: ["alt+left", "alt+right"], |
|
(e) => { |
|
if (location.href.indexOf("slack.com") !== -1) return; |
|
e.key === "ArrowLeft" ? history.back() : history.forward(); |
|
} |
|
); |
|
|
|
// ScreenShare |
|
window.navigator.mediaDevices.getDisplayMedia = () => |
|
new Promise(async (resolve, reject) => { |
|
try { |
|
const sources = await desktopCapturer.getSources({ |
|
types: ["screen", "window"], |
|
}); |
|
|
|
const unlisten = () => { |
|
ipcRenderer.removeAllListeners("screenShare:cancel"); |
|
ipcRenderer.removeAllListeners("screenShare:share"); |
|
}; |
|
|
|
ipcRenderer.on("screenShare:cancel", () => { |
|
unlisten(); |
|
reject(new Error("Cancelled by user")); |
|
}); |
|
|
|
ipcRenderer.on("screenShare:share", (_, shareId) => { |
|
unlisten(); |
|
window.navigator.mediaDevices |
|
.getUserMedia({ |
|
audio: false, |
|
video: { |
|
mandatory: { |
|
chromeMediaSource: "desktop", |
|
chromeMediaSourceId: shareId, |
|
}, |
|
}, |
|
}) |
|
.then((stream) => resolve(stream)); |
|
}); |
|
|
|
const mappedSources = sources.map((it) => ({ |
|
id: it.id, |
|
name: it.name, |
|
thumbnail: it.thumbnail.toDataURL(), |
|
})); |
|
|
|
ipcRenderer.send("screenShare:show", mappedSources); |
|
} catch (err) { |
|
reject(err); |
|
} |
|
});
|
|
|