WebView2 アプリでのフレームの使用
フレームを使用すると、他の Web ページを独自の Web ページに埋め込むことができます。 フレームは、Web ページ内の Web ページのように、Web ページ内のサブページまたは領域です。
iframe は 1 種類のフレームです。 その他の種類のフレームは frameset
、、 portal
、 embed
、 fencedFrame
、および です object
。 フレームのメイン WebView2 型は ですCoreWebView2Frame
。これは現在、最上位の iframe で有効になっています。 他の種類のフレームのサポートが計画されています。
WebView2 では、iframe と対話するための API がサポートされています。 次の操作を行うことができます:
- iframe がいつ作成されているかを確認します。
- iframe が別の URL に移動するタイミングを確認します。 これは、WebView2 アプリの状態コンピューターのナビゲーション イベントと同じように機能します。
- ホスト アプリと iframe 間で通信し、双方向でメッセージを送信します。
- アプリが HTTP 応答ヘッダーを
X-Frame-Options
無視できるようにします。
関連項目:
- WebView2 の機能と API の概要に関するページの iframe。
- HTML <iframe> タグ
FrameCreated イベントをサブスクライブしてフレームを取得する
ホスト アプリでフレームを操作するには、まず、ホスト アプリがフレーム オブジェクトを FrameCreated
取得するようにイベントをサブスクライブします。 イベントは FrameCreated
、新しいフレームが作成されるたびに発生します。 ホスト アプリがフレーム オブジェクトを取得したら、frame オブジェクトを使用して変更を監視し、この特定のフレームと対話します。
フレームが破棄されると、ホスト アプリはそのフレームを参照できなくなるため、ホスト アプリはイベントを CoreWebView2Frame.Destroyed
サブスクライブしてフレームの有効期間を監視する必要があります。 フレームは、新しい Web ページナビゲーションのたびに作成され、破棄されます。 フレームがまだCoreWebView2Frame.IsDestroyed
存在するかどうかをチェックするには、 メソッドを使用します。
関連項目:
- WebView2 の機能と API の概要に関するページの iframe。
フレーム内の移動
フレームが作成されると、フレームはフレームのソース URL に移動します。 iframe では、 や などのFrameNavigationStarting
NavigationCompleted
ナビゲーション イベントとナビゲーション イベントが使用されます。 フレームがソース URL に移動すると、次のナビゲーション イベントが発生します。
NavigationStarting
ContentLoading
HistoryChanged
DOMContentLoaded
NavigationCompleted
フレーム内を移動する頻度
ナビゲーションは、フレーム内で発生する可能性があります。 単純なユース ケースとして、 iframe
要素の source
属性は wikipedia.com などの URL であり、URL は iframe に読み込まれます。 通常、ナビゲーションはフレームが作成された直後に行われます。
DOMContentLoaded
その後、ContentLoading
および NavigationCompleted
イベントが発生します。
フレーム自体が移動中です。 Web ページは URL に移動します。 同様に、フレームが移動する可能性があります。
フレームが作成されると、フレームはホスト アプリによって駆動されるように移動します。 メイン ページで何が起こっているかを監視するには、 などのNavigationStarting
NavigationCompleted
イベントを監視しHistoryChanged
、ホスト アプリがフレームまたは Web ページ間を行き来できるようにします。 フレームは Web ページよりも頻繁に新しい URL に移動されますが、同じナビゲーション スタイルがサポートされています。 通常、ユーザーはフレーム内を移動できませんが、JavaScript では有効になります。通常、フレームはナビゲーションに関して静的です。
関連項目:
- WebView2 アプリのナビゲーション イベントのイベントの標準シーケンス。
- CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync メソッド - このメソッドは、iframe と Web ページで使用できます。 スクリプトが iframe 内にあるかどうかをチェックする必要があります。
ナビゲーション イベント:
重複する同等NavigationStarting
のイベントとNavigationCompleted
イベントに関しては、 の同等CoreWebView2Frame
の置き換えられたイベントではなく、 のイベントCoreWebView2
CoreWebView2Frame
をお勧めします。これは、型がフレームとの対話を可能にするシナリオが増えるためです。
関連項目:
- WebView2 アプリのナビゲーション イベントのイベントの標準シーケンス。
- WebView2 の機能と API の概要に関するページのナビゲーション イベント。
- WebView2 の機能と API の概要で不要な移動をブロックします。
iframe でのホスト オブジェクトの使用
ホスト アプリのネイティブ側と iframe 内の JavaScript との間で通信するには、ホスト オブジェクトを使用します。 ホスト オブジェクトは、ホスト アプリで作成した後、アプリの Web ページ側の JavaScript コードから使用するオブジェクトです。
フレーム内のスクリプトからホスト オブジェクトを介してネイティブ側 API を使用することは、「Web 側コードからネイティブ側コードを呼び出す」で説明されているように、Web/ネイティブ相互運用ページ構造に似ています。
iframe 内でホスト オブジェクトを使用するには:
- ホスト オブジェクトを定義し、 を実装
IDispatch
します。 - (Win32) または
AddHostObjectToScript
(.NET) を使用AddHostObjectToScriptWithOrigins
して、ネイティブ側にホスト オブジェクトを追加します。 - Web 側コードの JavaScript から、API を使用
chrome.webview.hostObjects.<name>
してこのホスト オブジェクトにアクセスします。
フレーム内の Web 側 JavaScript からネイティブ側オブジェクトにアクセスして制御するには、パラメーターを持つ (Win32) または CoreWebView2Frame.AddHostObjectToScript
(.NET) をorigins
使用AddHostObjectToScriptWithOrigins
します。 パラメーターは origins
、セキュリティ上の理由から、アクセスを許可する URL iframe を指定します。 このパラメーターは、iframe がホスト オブジェクトにアクセスできる URL を識別します。
フレームがリストにない origins
URL に移動した場合、フレームはホスト オブジェクトを操作できません。フレームはプロパティの読み取りまたは書き込みを行うことはできません。
フレームワークの メソッドのAddHostObjectToScript
メソッド名テーブルを参照してください。 次の 2 つの行を参照してください。
-
applyHostFunction
、getHostProperty
、およびsetHostProperty
。 -
getLocalProperty
およびgetLocalProperty
。
-
CoreWebView2Frame.AddHostObjectToScript メソッド - にはパラメーターがあります
origins
。 ドキュメントには メソッド名 テーブルがありません。
上記のメソッドは、次のメソッドのように動作します。
-
CoreWebView2.AddHostObjectToScript メソッド。
メソッド名の表を参照してください。 これらの API リファレンス の両方のトピックをお読みくださいが、フレームの場合は、代わりに パラメーターをサポートする メソッドを
origins
使用します。
コード例
「 手順 6: AddHostObjectToScript を呼び出してホスト オブジェクトを Web 側のコードに渡す 」を参照してください。「Web 側コード からネイティブ側コードを呼び出す」を参照してください。
関連項目:
- WebView2 の機能と API の概要に関するページのホスト/Web オブジェクト共有。
メッセージの送受信
メッセージは、iframe 内のネイティブ アプリと JavaScript コードの間で送信できます。
- HTML ページの iframe 内の JavaScript からホスト アプリにメッセージを送信できます。
- ホスト アプリから HTML ページの iframe で JavaScript にメッセージを送信できます。
iframe からホスト アプリへの Web メッセージの送信
iframe からホスト アプリに Web メッセージを送信するには、 メソッドを使用します window.chrome.webview.postMessage
。
window.chrome.webview.postMessage(`SetTitleText ${titleText.value}`);
ホスト アプリでこれらのメッセージを受信するには、ホスト アプリが を WebMessageReceived event
サブスクライブする必要があります。
ホスト アプリから iframe へのメッセージの送信
ホスト アプリは、 メソッドまたは PostWebMessageAsString
メソッドを呼び出して iframe にメッセージをPostWebMessageAsJson
送信します。
iframe は、次のようにイベントをサブスクライブしてメッセージを window.chrome.webview.addEventListener('message')
受信します。
window.chrome.webview.addEventListener('message', arg => {
// implement event listener here
});
関連項目:
- ネイティブ側と Web 側のコードの相互運用
- WebView2 の機能と API の概要に関するページの Web メッセージング。
ExecuteScript を使用して iframe で JavaScript コードを実行する
WebView2 アプリでは、 を使用 ExecuteScript
して、フレーム内の任意の JavaScript を実行できます。
スクリプトを iframe で実行するには、実行コンテキストを作成する必要があります。 実行コンテキストはイベントの後にContentLoading
作成されるため、イベントが発生するContentLoading
前にが呼び出された場合ExecuteScript
、スクリプトは実行されず、文字列null
が返されます。
イベントの詳細 ContentLoading
については、「 WebView2 アプリのナビゲーション イベント」を参照してください。これは、フレームと Web ページに対して有効です。
関連項目:
- WebView2 の機能と API の概要に関するページのスクリプト実行。
iframe のイベントを WebResourceRequested
使用したネットワーク イベントの変更
iframe の場合は、 イベントを使用 WebResourceRequested
して、ネットワーク イベントをリッスンし、変更できます。
関連項目:
- WebView2 の 機能と API の概要に関するページ の WebView2 でネットワーク要求を管理します。
- ネットワーク要求のカスタム管理
- WebView2 SDK のアーカイブリリース ノートの 1.0.1222-prerelease 用の試験的 API。
最新のプレリリース API を参照してください。 次のリンクには が含まれています 1.0.1466-prerelease
。 API リファレンス ドキュメントの左上にある [ バージョン ] ドロップダウン リストで、最新のプレリリースを選択します。
-
CoreWebView2.AddWebResourceRequestedFilter(uri, resourceContext, requestSourceKinds) メソッドオーバーロード - iframe に属するネットワーク要求をサブスクライブするには、このオーバーロードを使用し、 パラメーターの値として を使用
Document
するrequestSourceKinds
必要があります。 - CoreWebView2.RemoveWebResourceRequestedFilter(uri, resourceContext, requestSourceKinds) メソッドオーバーロード
- CoreWebView2WebResourceRequestedEventArgs クラス
X-Frame-Options を無視してフレーム内に Web ページをレンダリングする
X-Frame-Options
HTTP 応答ヘッダーは、アプリケーションがフレーム内でその Web ページをレンダリングできないようにするために、Web ページで使用されます。
AdditionalAllowedFrameAncestors
プロパティを使用すると、アプリケーションでヘッダーをX-Frame-Options
バイパスして、フレーム内に Web ページをレンダリングできます。
関連項目:
ホスト アプリでの iframe の使用例
このサンプル コードでは、次のようなフレーム API を使用する方法を示します。
FrameCreated
CoreWebView2FrameCreatedEventArgs
DOMContentLoaded
CoreWebView2DOMContentLoadedEventArgs
ExecuteScript
このサンプル コードは、WebView2WpfBrowser サンプルのMainWindow.xaml.csから要約されています。
void DOMContentLoadedCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
// Subscribe to the FrameCreated event to obtain the frame object when
// it's created.
webView.CoreWebView2.FrameCreated += WebView_FrameCreatedDOMContentLoaded;
webView.NavigateToString(@"<!DOCTYPE html>" +
"<h1>DOMContentLoaded sample page</h1>" +
"<h2>The content to the iframe and below will be added after DOM content is loaded </h2>" +
"<iframe style='height: 200px; width: 100%;'/>");
}
void WebView_FrameCreatedDOMContentLoaded(object sender, CoreWebView2FrameCreatedEventArgs args)
{
// In order for ExecuteScriptAsync to successfully run inside the iframe,
// subscribe to the ContentLoading or DOMContentLoaded event. Once these
// events are raised, you can call ExecuteScriptAsync.
args.Frame.DOMContentLoaded += (frameSender, DOMContentLoadedArgs) =>
{
args.Frame.ExecuteScriptAsync(
"let content = document.createElement(\"h2\");" +
"content.style.color = 'blue';" +
"content.textContent = \"This text was added to the iframe by the host app\";" +
"document.body.appendChild(content);");
};
}
API リファレンスの概要
WebView2 の機能と API の概要に記載されている次の機能には、フレーム関連の API が含まれます。
関連項目
- Web 側コードからネイティブ側コードを呼び出す
- WebView2 アプリのナビゲーション イベント - フレームと Web ページに対して有効です。
外部ページ: