2

大量の古いデータ (数十メガバイト) を含む複雑な HTML5 オフライン アプリがあり、そのコピーを読み込んでユーザーのディスクに書き込みたいと考えています。

私たちはすでに HTML5 IndexedDB でこのような動作をしていますが、Chrome は大量のデータで非常に遅く (読み込みに約 10 分)、現在のバージョンの Firefox にはDB 全体をランダムかつ取り返しのつかないほど破壊する素敵なバグがあります。これはプラン B です。さらに、ユーザーがバックアップしたり、メールで送信したりできるように、ユーザーが指定できるファイルが必要です。

もちろん、通常のブラウザー権限ではこれを行うことはできませんが、サンドボックス外の Firefox 拡張機能はファイル システムにアクセスでき、この拡張機能を使用する基本的な概念を理解しました。唯一の問題は、拡張機能がDOM 属性の読み取りと書き込みによってデータをやり取りすることです。これは、私たちが話しているデータの量にとって理想的ではないようです。

ここに画像の説明を入力

ただし、Gecko は特権ページ (拡張機能など) と非特権ページ (Web サイトなど) を厳密に分離しているため、実際にはこれが唯一の方法です別の解決策はありますか?

4

3 に答える 3

1

拡張コードは、Web ページから任意のデータを読み取ることができます。.wrappedJSObject作業中のオブジェクトのプロパティを取得して、その「Web ページ」ビューを取得することで、それをオプトインする必要があります。

于 2012-05-28T06:53:22.153 に答える
1

まず、indexedDB のオプションを見ても、mozIStorageService (別名 sqlite) が機能しない理由がわからなかった場合。カスタム dom イベントと組み合わせた async 機能は、うまく適合しているように見えますが、それはデータのニーズによって異なります。

その質問に対する答えは、拡張機能から Web ページにデータを取得する方法に関するあなたの声明にあると思います。dom イベントでニーズが満たされない場合は、おそらくカスタム xpcom コンポーネントのコーディングを検討する必要がありますが、それは大変な作業です。

それができない理由がサーバーとの間で大きなデータを移動することに関連している場合は、ストリーミング リーダー/コンバーター (gzip 圧縮コンバーターの追加を含む) の使用を検討できますが、それは「データの大きな古いもの」は、ストリームとして理にかなっています。

于 2012-06-11T20:11:48.287 に答える
0

あまりにも多くの苦労の末、これをどのように機能させたかを次に示します。私たちを正しい方向に向けてくれたBorisに敬意を表します!

以下のすべてのコードは、これを有効にするためにユーザーがインストールする必要がある Firefox 拡張機能用であり、コードは Coffeescript に含まれています。

最初のステップは、拡張機能のonDocumentLoadイベントにフックすることです。これは、ユーザーが Firefox ウィンドウを見る前にトリガーされます。

  onDocumentLoad: =>
    gBrowser.addEventListener('DOMContentLoaded', @onLoad, true)

したがって、この後DOMContentLoaded、ユーザーがウィンドウまたはタブを開くたびに起動されます。

  onLoad: (event) =>
    doc = event.originalTarget
    loadedWindow = doc.defaultView.wrappedJSObject

そしてブーム、ユーザーの真新しいウィンドウがあり、読み取りと書き込みが可能です!

    loadedWindow.myExtension = new myExtension()

次に、拡張機能コードをユーザーのウィンドウにフックするだけで、そのウィンドウ内の JavaScript コード (DOMContentLoaded の後に初期化および実行される) は次のように拡張機能にアクセスできます。

    if window.myExtension
      window.myExtension.write(data)
      data = window.myExtension.read()
    else
      alert("Install my extension, you fool")
于 2012-06-15T05:03:43.383 に答える