Hatena::Grouporera

もし高校野球の女子マネージャーがOpera Browserを使ったら

logo
 | 

2010-02-15

overrideMimeTypeができるようになるらしい

14:01

できるようになった!! akahuku - Opera 10.50 beta (build 3275)



の件について。


スラッシュドットで知ったんだけど、Opera 10.50 では overrideMimeType がちゃんと使えるようになるらしい。Opera の p01 さんという人がコメントしてる。

Support for overriding the charset of an XHR is coming in the next version of Opera, that will allow to read binary data over XHR.

How to download a file? - Opera Developer Community

もうかれこれ何年放置されてたんだろう…


しかし、どうせなら↓こういう効率の悪いハックをしなくてもバイナリが読めるようになってほしいんだけど。

function load_binary_resource(url) {
    var req = new XMLHttpRequest();
    req.open('GET', url, false);
    //XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
    req.overrideMimeType('text/plain; charset=x-user-defined');
    req.send(null);
    if (req.status != 200) return '';
    return req.responseText;  
}  
Using XMLHttpRequest - MDC

失敗

コメント欄の件。できなかったけど一応 UserJS のソースを晒す。

// ==UserScript==
// @name           
// @namespace      
// @description    
// @version        
// @include        http://www.google.ca/
// ==/UserScript==

(function() {
  if (window.top !== window) return;

  window.opera.addEventListener('AfterEvent.load', function() {
    var binary = 'http://www.google.ca/logos/olympics10-xcskiing-hp.png';

    window.opera.addEventListener('BeforeScript', function(e) {
      var script = e.element;
      if (script.getAttribute('src') === binary) {
        opera.postError(script.text);
        window.opera.removeEventListener('BeforeScript', arguments.callee, false);
      }
    }, false);

    var script = document.createElement('script');
    //script.setAttribute('type','text/plain; charset=x-user-defined'); // これがあると BeforeScript を捕まえられないみたい。
    script.setAttribute('src', binary);
    document.body.appendChild(script);
  }, false)

})()

os0xos0x2010/02/15 14:52推測でしかないんですが、overrideMimeTypeが効かなかったのは↓の理由なんじゃないかと思ってます。
http://orera.g.hatena.ne.jp/edvakf/20100113/1263351688

edvakfedvakf2010/02/15 15:26僕もうっすらとそれを考えていました。
script タグは「different origin のスクリプトのエンコーディング指定を無効にする」なのに、XHR では「same origin であるにも関わらずエンコーディング指定を無効にする」ですからおかしな話ですね。

それを書いてて、UserJS からだったら↓みたいにすれば same origin のバイナリが読める気がしてきました。

var script = document.createElement('script');
script.setAttribute('type','text/plain; charset=x-user-defined');
script.setAttribute('src','some.binary');
document.body.appendChild(script);

window.opera.addEventListener('BeforeScript', function(e) {

var script = ujsevt.element;
alert(script.text);

}, false);

emkemk2010/02/15 17:02やってみましたけど、
script.setAttribute('type','text/plain; charset=x-user-defined');
script.setAttribute('type','text/plain');
script.setAttribute('type','text/javascript; charset=x-user-defined');
ではBeforeScriptイベントが発生してくれませんでした。
script.setAttribute('type','text/plain');
script.setAttribute('charset','x-user-defined');
などとやっても、(same originなのに)charsetの指定は無視されてしまうようです。
さらにNUL文字が出現するところで文字列を切られてしまうのでやはりバイナリは読めそうにありません(この問題を何とかしないとoverrideMimeTypeに対応したところでバイナリは読めないような…)。

edvakfedvakf2010/02/15 17:58なるほど。うちでも同じようなことになってます。↓ が無ければ BeforeScript は出るんですけどね。
script.setAttribute('type','text/plain; charset=x-user-defined');

NULL 文字のところで切られるのは、overrideMimeType できるようになれば大丈夫な気もします。UTF-16 だったら NULL イッパイだし。

os0xos0x2010/02/15 19:31> script タグは「different origin のスクリプトのエンコーディング指定を無効にする」
いや、実はsame originであっても、charsetの指定は無視しているみたいです。
実際、livedoor ReaderでDragonflyを起動し、スクリプトのコマンドラインをみると、
Syntax error while loading: line 104 of linked script at http://reader.livedoor.com/js/roma.0.3.4.js
というメッセージが出ていると思います。
このファイルは、ちゃんとcharset="UTF-8"で読み込まれていますが、それは無視されているみたいです。

edvakfedvakf2010/02/15 23:44あれま、斎藤さんの話と違いますね。
とりあえず 10.50 に期待ということで。

emkemk2010/02/26 22:49Windows/UNIXでは25日のweekly buildからついにサポートされました。
http://my.opera.com/desktopteam/blog/2010/02/25/more-fixes
> # Fixed Bug CORE-14632 (Support 'binary download' of 'text/plain;charset=x-user-defined' resource with XmlHttpRequest)
Windowsでは実際に手もとで動作も確認しています。MacのBeta 1に入ってるのかどうかは(環境がないので)わかりません。なお、overrideMimeTypeをopenより前に呼ぶとDOMExceptionが発生します。MDCのサンプル通りなら問題ないのですが、しばらく悩みました。

edvakfedvakf2010/02/26 23:26そのようですね。この記事の一番上に追記してあります。

>overrideMimeTypeをopenより前に呼ぶとDOMExceptionが発生します。
これは良い情報を。どうもありがとうございます。

emkemk2010/03/01 16:20>overrideMimeTypeをopenより前に呼ぶとDOMExceptionが発生します。
これ、仕様かと思ったら27日のsnapshotで修正されていました。
http://my.opera.com/desktopteam/blog/2010/02/27/a-small-changelog
> Fixed CORE-28120 (xhr.overrideMimeType() called before xhr.open throws)
そうなるとCanvasRenderingContext2Dが未定義なのもバグなのかなあ。
http://twitter.com/uupaa/status/9700343274

edvakfedvakf2010/03/01 16:49CanvasRenderingContext2D の件は DSK-283883 として報告済みです。

トラックバック - http://orera.g.hatena.ne.jp/edvakf/20100215
 |