XPCOM: URLからdataスキームを取得

const Cc = Components.classes;
const Ci = Components.interfaces;

var getDataFromURL = function(aURL){
    var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
    var uri = ioService.newURI(aURL, null, null);
    var channel = ioService.newChannelFromURI(uri);
    var inputStream = channel.open();
    var contentType = channel.contentType;
    var bis = Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream);
    bis.setInputStream(inputStream);
    var data = "", bufSize = 0;
    while (bufSize = bis.available()) {
        data += bis.readBytes(bufSize);
    }
    bis.close();
    return data ? "data:" + contentType + ";base64," + window.btoa(data) : "";
};

主としてfaviconの保存用。

nsIBinaryInputStreamを使うのが良いみたい。

faviconのURLは

var win = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator)
                                                       .getMostRecentWindow("navigator:browser");
var browser = win.document.getElementById("content");
var faviconURL = "";
if (browser.shouldLoadFavIcon(browser.selectedBrowser.currentURI)) {
    faviconURL = win.gProxyFavIcon.getAttribute("src");
}

こんな感じで、今表示しているロケーションバーのアイコンから取得。


作成中

ようやく形になってきました。


他にはまったこと。

  • mozStorageでのAUTOINCREMENTはINTEGER NOT NULL PRIMARY KEYあるいはINTEGER PRIMARY KEY
    • AUTOINCREMENTを入れるとエラー。
    • INTと省略してもエラー。
  • 日時はdatetime('now', 'localtime')などとして文字列として保存。
  • mozIStorageStatement#executeStepしたらmozIStorageStatement#resetを呼ばないとダメ。

Comment: 0

コメントの受け付けは終了しました。

Trackback: 1

トラックバックの受け付けは終了しました。