Связь между предзагрузкой и клиентом с учетом изоляции контекста в электроне - PullRequest
3 голосов
/ 06 апреля 2019

У меня есть электронное приложение.Мой клиентский скрипт (рендерер) должен иметь доступ к электронным API, но это предупредило меня о безопасности, поэтому я переместил его в сценарий предварительной загрузки и отключил nodeIntegration.Затем я получил предупреждение о contextIsolation, поэтому я включил его.Мой скрипт предварительной загрузки ранее прикреплял к окну функцию, которую клиент мог прочитать следующим образом:

window.readClipboard = function(){
    return clipboard.readText()
}

К сожалению, изоляция контекста означала, что клиент больше не мог получить доступ к этой функции.Есть ли способ заставить эту работу работать с изоляцией контекста или я должен отключить ее?

Дополнительные сведения

Предупреждение, которое заставило меня попытаться включить изоляцию контекста, былоследующее:

Предупреждение об устаревании электронов (изменение контекста по умолчанию) В этом окне по умолчанию отключена изоляция контекста.В Electron 5.0.0 изоляция контекста будет включена по умолчанию.Чтобы подготовиться к этому изменению, установите {contextIsolation: false} в webPreferences для этого окна или убедитесь, что это окно не зависит от отключения изоляции контекста, и установите {contextIsolation: true}.

В client.js я пытаюсь получить доступ к:

console.log("window.readClipboard", window.readClipboard)

С выводом:

window.readClipboard undefined

1 Ответ

3 голосов
/ 11 апреля 2019

Насколько я вижу, контекстная изоляция предназначена для предотвращения самого описанного вами случая.Поэтому, если вы хотите добавить данные в window, лучшее, что вы можете сделать, это отключить изоляцию.

Однако я посмотрел документы Сценарии содержимого , указанные в BrowserWindow документируйте определение contextIsolation и найдите способ использовать postMessage для получения текста буфера обмена.

main.js

const { app, BrowserWindow } = require('electron')
const path = require('path')

app.once('ready', () => {
  let win = new BrowserWindow({
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: true,
      preload: path.join(__dirname, 'preload.js')
    }
  })
  win.loadURL(path.join(__dirname, 'index.html'))
})

предварительная загрузка.js

const { clipboard } = require('electron')

window.addEventListener("message", (event) => {
  if (event.source != window) return
  if (event.data.type && (event.data.type == "READCLIP_REQ")) {
    window.postMessage({ type: "READCLIP_ANS", text: window.readClipboard() }, "*")
  }
}, false)

window.readClipboard = function(){
  return clipboard.readText()
}

index.html

<html>
  <body>
    <p></p>
    <p></p>
    <script>
      // Try window.readClipboard directly (works with no isolation)
      document.getElementsByTagName("p")[0].innerText =
        window.readClipboard && window.readClipboard()
      // Try the same with postMessage
      const readClipboardMessage = () => {
        window.postMessage({ type: "READCLIP_REQ" }, "*")
      }
      window.addEventListener("message", (event) => {
        if (event.source != window) return
        if (event.data.type && (event.data.type == "READCLIP_ANS")) {
          document.getElementsByTagName("p")[1].innerText = event.data.text
        }
      }, false)
      readClipboardMessage()
    </script>
  </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...