web-dev-qa-db-ja.com

WasmアクセスDOM

JavaScriptなしでDOMやWebAPI(つまり、フルスクリーンAPI)への読み取り/書き込みアクセスを取得する方法はありますか?

私はCで基本的なアプリケーションを構築しようとしています(Cソースは実際にはGC言語からの翻訳の結果です)。作成しているアプリはデスクトップアプリとして実行されるため(まだ「実際の」ブラウザーで実行することを意図していません)、必要に応じて環境(つまり、レイアウトエンジン)を微調整できます。

17
themihai

WebAssembly Minimal Viable Productでは、WebAssemblyを呼び出したり呼び出したりする唯一の方法は、インポートとエクスポートです。将来的に、WebAssemblyは 埋め込み機能がAPIを直接公開できるようになる機能を得る になる可能性があります。これを埋め込むブラウザでは、DOMを含めることができます。

Importsexports はそれほど複雑ではありません。Cコードの観点からは、DLL onに似たextern呼び出しのように見えますWindowsプラットフォーム。 Emscriptenを使用してCコードをコンパイルする可能性があります。これがどのように機能するかについての詳細は そのドキュメント「C/C++からJavaScript関数を呼び出す」 を参照してください(これはあなたが求めている質問ではないためですが、次の質問だと思います)。


次の場合、質問からは明確ではありません。

  1. CコードをコンパイルしてWebAssembly insideブラウザー内で実行したい。
  2. CコードをコンパイルしてWebAssembly outsideブラウザー内で実行したい。

または両方。

13
JF Bastien

それはすべてコンパイラの機能に依存します。

現在、DOMまたはその他のブラウザAPIに直接アクセスする方法はありません。 Wasm線形メモリまたはWasmテーブル内にJavaScript参照を格納することもできません。また、JavaScript参照を関数の引数または戻り値として使用することもできません。それらはMVP型システムには存在しません。ただし、参照タイプの提案があり、いつかWasmランタイムの一部になる可能性がありますが、正式なリリース日はありません。

それでは、Wasmからホスト環境への相互作用をどのように実行できますか?まあ、インポートとエクスポートを備えたWasmモジュールシステムを使用してエミュレーションレイヤーを作成できることがわかりました。このレイヤーを手動で作成するのは面倒なので、コンパイラーがそれを作成するのは良い仕事です。しかし、どうやって?

たとえば、ドキュメントのタイトルを現在のブラウザウィンドウに設定したいとします。 Wasmは、現在のウィンドウインスタンスにアクセスし、ドキュメントを選択して、titleプロパティを設定する必要があります。 Wasmランタイムは参照にアクセスできないため、JS側にマッピングテーブルを作成し、マッピングロジックを含む一部のJS関数を作成して、Wasmモジュールにインポートする必要があります。

そこで、getWindowという関数を作成します。この関数は、グローバルウィンドウ参照を受け取り、それをマッピングテーブルに入れて、テーブルのインデックスを返します。このインデックスは、Wasm側のI32としてアクセスできます。この関数はWasmモジュールにインポートされます。

次に、getDocumentFromWindowという関数を作成します。この関数は、インデックスをマッピングテーブルに取り、別のインデックスを返します。実装は、マッピングテーブルからウィンドウ参照を検索し、そのドキュメントプロパティを解決して、このドキュメントをマッピングテーブルに入れ、そのインデックスをWasmに返します。この関数はWasmモジュールにもインポートされます。

Wasm側では、インポートされた関数によってWasm Host参照を間接的に操作できるようになりました。マッピングテーブルは、整数インデックスによってJS参照をエミュレートします。これは、Wasm参照タイプの提案に付属しているものの遅いバージョンです。

したがって、この全体のマッピングロジックは、コンパイラによって作成できます。参照型が利用可能になったら、コンパイラーを変更し、新しい型システムを使用してより効率的なコードを作成できます。

コンパイラが動作している場合にこのような種類を確認するには、 https://github.com/mirkosertic/Bytecoder を参照してください。これは、JVMバイトコードをJavaScriptとWebAssemblyにコンパイルし、DOMとブラウザAPIの双方向のやり取りに透過的な方法を提供します。 WasmからDOMを呼び出すことも可能です。たとえば、クリックリスナーやvue.jsのような高レベルのフレームワークとの相互作用のような他のクールなものを実装するために、DOMからWasmを呼び出すこともできます。

免責事項:私はBytecoderの発明者ですが、説明されているロジックは他のどのコンパイラにも適応できます。

3
Mirko Sertic

WebAssemblyの人々は、WebAssemblyのJSオブジェクトがどのように見えるかについて、まだ強い考えを持っていません。

私はPR #108 を調べます。これは、ガベージコレクションの仕様が今のところ独自のリポジトリに分離されていることについてです。しかし、それが起こっている間、彼らはウェブプラットフォームの唯一の言及と、仕様に存在するJSオブジェクトとの相互運用を削除しています。

It's more aspirational that concrete,
1
rektide