Chrome Apps のファイルシステムAPIでPERSISTENTの確保

276 views
Skip to first unread message

Toyoaki Washida

unread,
Sep 6, 2013, 10:38:23 PM9/6/13
to chrome-api-d...@googlegroups.com
鷲田です。

タイトルの点でつまづいていまして、どなたかお教えいただければと思い投稿します。

パッケージアプリで、TEMPORARY領域は、問題なく確保できるのですが、
PERSISTENT領域が、いろいろやってみたのですが確保できません。
たとえば、以下のようにしてみます。(誰かのをお借りしています、感謝)
以下のはちょっと複雑ですが、もっと単純化しても動きません。
(単純化したバージョンもメールの最後につけておきます。)

//////////////// ここから
    function setUpOfflineMode(availableSpace) {
        requestFileSystem(PERSISTENT, availableSpace, function(filesystem) {
        //requestFileSystem(TEMPORARY, 500*1024*1024, function(filesystem) {
            NSFileSystem.fs = filesystem;
            console.log("availableSpace byte = "+availableSpace);
        });
    }
    function onOfflineEnabled(amountOfSpaceNeeded) {
        navigator.webkitPersistentStorage.queryUsageAndQuota(
            function(usage, quota) {
        console.log("usage = "+usage+" quota = "+quota);
                var availableSpace = quota - usage;
                if (availableSpace >= amountOfSpaceNeeded) {
                    // We're fine; just continue to set up offline mode.
                    setUpOfflineMode(availableSpace);
                    return;
                }
                var requestingQuota = amountOfSpaceNeeded + usage;
                navigator.webkitPersistentStorage.requestQuota(
                    requestingQuota,
                    function(grantedQuota) {
                        setUpOfflineMode(grantedQuota - usage);
                    },
                    onerror);
        }, onerror);
    }
/////////////////////////
// ここで実行   
////////////////////////
    onOfflineEnabled(500 * 1024 * 1024);
//////////////////// ここまで

これでは、
usage = 0 quota = 0
availableSpace byte = 0
Error: QUOTA_EXCEEDED_ERR
となってしまいます。

しかし、このパッケージを、通常のChromeブラウザの「ファイルを開く」
でひらくと、「パーシステント領域を確保しますが、いいですかというメッセージが出ます」
というようなメッセージを出し、確保できているように見えます。

(同じ領域を、TEMPORARYでは確保できます。HotalはTEMPORARYしか使っていません)

確かに、パッケージアップでは、そのメッセージがどこに出るかが予測できません。
(ですから、パッケージアプでは、PERSISTENTは無理なのではないかと思ってしまいます)

manifestにも、該当する項目は見つけられませんでした。(chromeのファイルシステムの設定はありますが)

MACでもWindowsでも同じでした。

なお、
window.webkitStorageInfo.requestQuota(PERSISTENT, 1024*1024, ・・・・
は古いからだめだと拒絶されます。

電子書籍を読むのは、TEMPORARYでもいいのですが、書くのは、勝手に消されては困りますから。

よろしく、ご指導願います。

///////単純化したもの
navigator.webkitPersistentStorage.requestQuota(500*1024*1024, function(grantedBytes) {
requestFileSystem(PERSISTENT, grantedBytes, function(filesystem) {
console.log("granted byte = "+grantedBytes);
});
}, function(e) {
onerror(e);
console.log('Error', e);
});
//////////////////// ここまで
出力は、

granted byte = 0
となります。要求サイズを小さくしても変わりません。なにしろ、quota可能性は、0なのですから。

Toyoaki Washida

unread,
Sep 7, 2013, 5:52:24 PM9/7/13
to chrome-api-d...@googlegroups.com
鷲田です。

以下のようにして解決できたようです。
manifest.json
に、
  "permissions": ["unlimitedStorage"],
が必要なようです。いまのところ正常に動いています。

通常の、ウェッブアプリのように、ファイル確保いいですかと言う
ユーザーへの許可申請出てきません。
こんなことなら、Hotalも次に改訂するときに、PERSISTENTに
変えようと思います。

Chromeサンプルのdiffに
  "permissions": ["storage",
                  "unlimitedStorage",
                  {"fileSystem": ["write"]},
                  "clipboardRead",
                  "clipboardWrite",
                  "<all_urls>"
                 ],

があって、ようやく理解できました。
お騒がせしました。

2013年9月7日土曜日 11時38分23秒 UTC+9 Toyoaki Washida:

Toyoaki Washida

unread,
Sep 7, 2013, 6:26:36 PM9/7/13
to chrome-api-d...@googlegroups.com
鷲田です。

間違った情報だとまずいので、もう一つ書いておきます。
その後、
"permissions": ["unlimitedStorage"],
を削除しても、QUOTA ERRORが出なくなりました。
私はもう訳が分かりません。
どこかで道にそれてしまったようです。


Toyoaki Washida

unread,
Sep 7, 2013, 7:04:39 PM9/7/13
to chrome-api-d...@googlegroups.com
鷲田です。

スレッド一つを個人的に占拠していて申し訳ありませんが、私のいろいろな間違いも
参考になればと思っています。

HotalをPERSISTENTに確保しようと思い、いろいろ試みた結果、
結局、

  "permissions": [
    "storage",
    "unlimitedStorage"
  ],
の二つのpermissiosが必要だとわかりました。
どちらか一つでは、QUOTA_EXCEED_ERRORが出ます。
それと、いったん、アプリが、PERSISTENTでメモリを確保すると、
上記のパーミッションなしに再起動しても、確保されているようです。
アプリを削除して再起動すると、上記パーミッションが必要に
なります。

なんか、単純なことでした。多分どこかに書いてあることだと思います。
Reply all
Reply to author
Forward
0 new messages