Kokudoriing

技術系与太話ブログ

WebViewのinvokeScriptではまったところ

.NETでWebアプリのクライアントアプリを作る場合、Windows.UI.Xaml.Controls.WebView を使ってスクレイピングをしたりするわけです。

その時、InvokeScriptAsyncを使ったりするわけです。

こいつは第1引数に呼び出すJavaScriptの関数を、第2引数にその関数に渡す実引数を配列で渡します。 なので、eval関数を呼び出せば、任意のJavaScriptコードが実行できます。

var result = await webView.InvokeScriptAsync("eval", new[] { "'hogehoge'" });
Debug.Assert(result == "hogehoge");

が、このInvokeScriptAsyncはかなり癖のあるメソッドです。

まず第1に、関数に渡す実引数は文字列である必要があります。

そして、戻り値も文字列型である事を期待します。

さらに、戻り値が文字列型でない場合は勝手に空文字列が返ります

var result = await webView.InvokeScriptAsync("eval", new[] { "[1, 2, 3]" });
Debug.Assert(result == "");

これはなかなかアレ気な仕様というかなんというか…。


スクレイピングに関連して.NETのJSONデシリアライザの話。

DataContractJsonSerializerが認識するJSONはかなり厳密です。

具体的には

  1. keyも文字列リテラルとして記述しないといけない
  2. 文字列リテラルはダブルクォーテーションで囲わないといけない(シングルクォーテーションは不可)

などなど。

以上スクレイピングしようとして小1時間悩んでしまったところでした。

Gavia(ActiveRecor for IndexedDB) v0.1.0 リリース

半年以上前に作ったActiveRecordなIndexedDBライブラリをちょこちょこ手直ししてみました。

https://github.com/kokudori/gavia/

http://kokudori.github.io/gavia/

例によってbower install gaviaで入ります。

一番の変更点は今までjQueryDeferredを使うためにjQueryに依存してたんですが、 なんちゃってjQueryDeferredもどきを作ったので依存ライブラリが無くなりました。

やったー、といってもjQuery依存が消えることってそんな嬉しいかなー。 最近はJavaScriptMVCフレームワークが増えてきて(というか乱立しすぎ)、 以前ほどjQuery必須というわけでも無くなりましたが、まぁ、まだまだそんなことはなく。

BootstrapがjQeury依存というのがでかい気もしますがどうだろう。

ついでにずっと死んでたtravis-ciの自動テストもパスさせておいた。 travis-ci上のnpm installが手持ちPCの何倍も早く済むのがこの作業を通しての最大の悲しみ。