0090616f7b
* feat: add a new contextBridge module * chore: fix docs linting * feat: add support for function arguments being proxied * chore: ensure that contextBridge can only be used when contextIsolation is enabled * docs: getReverseBinding can be null * docs: fix broken links in md file * feat: add support for promises in function parameters * fix: linting failure for explicit constructor * Update atom_api_context_bridge.cc * chore: update docs and API design as per feedback * refactor: remove reverse bindings and handle GC'able functions across the bridge * chore: only expose debugGC in testing builds * fix: do not proxy promises as objects * spec: add complete spec coverage for contextBridge * spec: add tests for null/undefined and the anti-overwrite logic * chore: fix linting * spec: add complex nested back-and-forth function calling * fix: expose contextBridge in sandboxed renderers * refactor: improve security of default_app using the new contextBridge module * s/bindAPIInMainWorld/exposeInMainWorld * chore: sorry for this commit, its a big one, I fixed like everything and refactored a lot * chore: remove PassedValueCache as it is unused now Values transferred from context A to context B are now cachde in the RenderFramePersistenceStore * chore: move to anonymous namespace * refactor: remove PassValueToOtherContextWithCache * chore: remove commented unused code blocks * chore: remove .only * chore: remote commented code * refactor: extract RenderFramePersistenceStore * spec: ensure it works with numbered keys * fix: handle number keys correctly * fix: sort out the linter * spec: update default_app asar spec for removed file * refactor: change signatures to return v8 objects directly rather than the mate dictionary handle * refactor: use the v8 serializer to support cloneable buffers and other object types * chore: fix linting * fix: handle hash collisions with a linked list in the map * fix: enforce a recursion limit on the context bridge * chore: fix linting * chore: remove TODO * chore: adapt for PR feedback * chore: remove .only * chore: clean up docs and clean up the proxy map when objects are released * chore: ensure we cache object values that are cloned through the V8 serializer
53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import { ipcRenderer, contextBridge } from 'electron'
|
|
|
|
async function getOcticonSvg (name: string) {
|
|
try {
|
|
const response = await fetch(`octicon/${name}.svg`)
|
|
const div = document.createElement('div')
|
|
div.innerHTML = await response.text()
|
|
return div
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
async function loadSVG (element: HTMLSpanElement) {
|
|
for (const cssClass of element.classList) {
|
|
if (cssClass.startsWith('octicon-')) {
|
|
const icon = await getOcticonSvg(cssClass.substr(8))
|
|
if (icon) {
|
|
for (const elemClass of element.classList) {
|
|
icon.classList.add(elemClass)
|
|
}
|
|
element.before(icon)
|
|
element.remove()
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
async function initialize () {
|
|
const electronPath = await ipcRenderer.invoke('bootstrap')
|
|
|
|
function replaceText (selector: string, text: string) {
|
|
const element = document.querySelector<HTMLElement>(selector)
|
|
if (element) {
|
|
element.innerText = text
|
|
}
|
|
}
|
|
|
|
replaceText('.electron-version', `Electron v${process.versions.electron}`)
|
|
replaceText('.chrome-version', `Chromium v${process.versions.chrome}`)
|
|
replaceText('.node-version', `Node v${process.versions.node}`)
|
|
replaceText('.v8-version', `v8 v${process.versions.v8}`)
|
|
replaceText('.command-example', `${electronPath} path-to-app`)
|
|
|
|
for (const element of document.querySelectorAll<HTMLSpanElement>('.octicon')) {
|
|
loadSVG(element)
|
|
}
|
|
}
|
|
|
|
contextBridge.exposeInMainWorld('electronDefaultApp', {
|
|
initialize
|
|
})
|