webFrameMain
ウェブページと iframe を制御します。
プロセス: Main
webFrameMain
モジュールは、既存の WebContents
インスタンスを横断したフレームの探索に利用できます。 ナビゲーションイベントがよくあるユースケースで しょう。
const { BrowserWindow, webFrameMain } = require('electron')
const win = new BrowserWindow({ width: 800, height: 1500 })
win.loadURL('https://twitter.com')
win.webContents.on(
'did-frame-navigate',
(event, url, httpResponseCode, httpStatusText, isMainFrame, frameProcessId, frameRoutingId) => {
const frame = webFrameMain.fromId(frameProcessId, frameRoutingId)
if (frame) {
const code = 'document.body.innerHTML = document.body.innerHTML.replaceAll("heck", "h*ck")'
frame.executeJavaScript(code)
}
}
)
また、WebContents
の mainFrame
プロパティを使用することでも既存ページのフレームへアクセスできます。
const { BrowserWindow } = require('electron')
async function main () {
const win = new BrowserWindow({ width: 800, height: 600 })
await win.loadURL('https://reddit.com')
const youtubeEmbeds = win.webContents.mainFrame.frames.filter((frame) => {
try {
const url = new URL(frame.url)
return url.host === 'www.youtube.com'
} catch {
return false
}
})
console.log(youtubeEmbeds)
}
main()
メソッド
これらのメソッドは、webFrameMain
モジュールからアクセスできます。
webFrameMain.fromId(processId, routingId)
processId
Integer -Integer
型で、そのフレームを所有しているプロセスの内部 ID を表します。routingId
Integer -Integer
型で、現在のレンダラープロセスでの一意なフレーム ID を表します。 ルーティング ID は、WebFrameMain
インスタンス (frame.routingId
) から取得できるほか、フレーム固有のWebContents
ナビゲーションイベント (did-frame-navigate
など) によっても渡されます。
戻り値 WebFrameMain | undefined
- 指定のプロセスとルーティングの ID のフレームです。指定の ID に関連付けられた WebFrameMain がない場合は undefined
になります。
クラス: WebFrameMain
プロセス: メイン
このクラスは 'electron'
モジュールからはエクスポートされません。 Electron API では、他のメソッドの戻り値としてのみ利用できます。
インスタンスイベント
イベント: 'dom-ready'
document が読み込まれたときに発生します
インスタンスメソッド
frame.executeJavaScript(code[, userGesture])
code
stringuserGesture
boolean (任意) - 省略値はfalse
。
戻り値 Promise<unknown>
- Promise 型で、コードの実行結果で解決され、実行で例外の送出または実行結果が拒否された Promise の場合は拒否されます。
ページ内の code
を評価します。
ブラウザウインドウでは、requestFullScreen
のような、いくつかの HTML API は、ユーザからのジェスチャーでのみ呼び出されます。 userGesture
を true
にセットすることでこの制限がなくなります。
frame.reload()
戻り値 boolean
- リロードが正常に開始されたかどうか。 フレームに履歴がない場合のみ false
になります。
frame.send(channel, ...args)
channel
string...args
any[]
引数と共に、channel
を介してレンダラープロセスに非同期メッセージを送信します。 引数は postMessage
と同じように 構造化複製アルゴリズム によってシリアライズされるため、プロトタイプチェーンは含まれません。 関数、Promise、Symbol、WeakMap、WeakSet の送信は、例外が送出されます。
レンダラープロセスは ipcRenderer
モジュールで channel
を聞いてメッセージを処理できます。
frame.postMessage(channel, message, [transfer])
channel
stringmessage
anytransfer
MessagePortMain[] (任意)
メッセージをレンダラープロセスに送信し、任意でゼロ個以上の MessagePortMain
オブジェクトの所有権を転送します。
転送された MessagePortMain
オブジェクトは、レンダラープロセスで発生したイベントの ports
プロパティにアクセスすれば利用できます。 レンダラーに着くと、それらはネイティブの DOM MessagePort
オブジェクトになります。
以下がその例です。
// メインプロセス
const win = new BrowserWindow()
const { port1, port2 } = new MessageChannelMain()
win.webContents.mainFrame.postMessage('port', { message: 'hello' }, [port1])
// レンダラープロセス
ipcRenderer.on('port', (e, msg) => {
const [port] = e.ports
// ...
})