2014年3月29日土曜日

Chrome appsで外部サイトの画像をロードする方法

Chrome apps では外部サイトの画像を読み込みたいとき、 HTML内部で <img src="http://..../hoge.gif"> のようにしても上手く行きません。

例えば、<img src="http://k.yimg.jp/images/top/sp2/cmn/logo-ns-131205.png" /> のような画像URLをHTMLから読み込んだとき、以下のエラーが発生します。

Refused to load the image 'http://k.yimg.jp/images/top/sp2/cmn/logo-ns-131205.png' because it violates the following Content Security Policy directive: "img-src 'self' data: chrome-extension-resource:".

これは Chrome apps の Content Security Policy (CSP) による規制のためです。
これを回避して、外部の画像を読み込むには以下のようにします。

まずは、HTMLを修正します。imgタグのsrc属性を削除しています。

main.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <img id="img1" />
</body>
<script src="app.js"></script>
</html>

background.js はいつもどおりに。
chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('main.html', {
    'bounds': {
      'width': 400,
      'height': 500
    }
  });
});

次に manifest.json の permissions に参照可能なURLを設定します。<all_urls> の部分はURLを指定してもOK。
{
  "name": "External resource loading Test",
  "description": "External resource loading Test",
  "version": "0.1.0",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "icons": {
    "128": "128.png"
  },
  "permissions": [
    "<all_urls>"
  ]
}

そして app.js (content script) の中で以下のように画像をロードします。
var url = "http://k.yimg.jp/images/top/sp2/cmn/logo-ns-131205.png";

var loadImage = function(uri) {
  var xhr = new XMLHttpRequest();
  xhr.responseType = 'blob';
  xhr.onload = function() {
    document.getElementById("img1").src 
      = window.URL.createObjectURL(xhr.response);
  }
  xhr.open('GET', uri, true);
  xhr.send();
}

loadImage(url);
ポイントは、ダウンロードした画像のローカルなURIを createObjectURL で取得し、imgタグのsrc属性に設定しているところです。取得されるURIは、blob:chrome-extension%3A//*/* のような形式になります。

0 件のコメント:

コメントを投稿