Firefox4でcan’t wrap XML objectsというエラーが出る件について
Firefox4にしてから主にGreasemonkeyのGM_addStyleメソッドで
TypeError: can’t wrap XML objects**
というエラーが出たりすることがあります。
これはBug 609143 – E4X XML objects cannot be passed to sandboxのsandbox内でのE4X(XML)の挙動が変わった(意図的に)のが原因らしいです。(あまり詳しくないので…)
GM_addStyle(<><![CDATA[
/* 適当なCSSのコード*/
.clearfix:after {
content: "."; /* 新しい要素を作る */
display: block; /* ブロックレベル要素に */
clear: both;
height: 0;
visibility: hidden;/*表示はしない*/
}
]]></>)
のような感じでE4X(XML)を直接GM_addStyleに渡しているときなどに起きています。
これを回避するためには、E4X(XML)を明示的に文字列化して渡せばよい見たいです。
GM_addStyle(String(<><![CDATA[ /* CSSコード */ ]]></>));
のようにString(E4X)するか、E4X全体をtoString()、””+E4X のような感じで文字列化すればいい。
もしくはGreasemonkeyにはメタ情報に// @resource CSS example.css という感じで、CSSファイルをロードできるので、そのファイルをGM_addStyle(GM_getResourceText(‘CSS’));して使うなどでもいいと思います。
もしくは下のようにGM_addStyleを書き換えてしまう事でも回避できそうです。(あんまり推奨しないけど)
function GM_addStyle(css) {
if (!GM_addStyle.style) {
var head = document.getElementsByTagName("head")[0] ||
document.documentElement;
if (!head) {
return;
}
GM_addStyle.style = document.createElement('style');
GM_addStyle.style.type = 'text/css';
head.insertBefore(GM_addStyle.style, head.firstChild);
}
GM_addStyle.style.appendChild(document.createTextNode(css) + 'n');
}
書き換えの参考
Constellation’s gist: 803115 — GistのようにTomblooパッチでGM_addStyleの挙動を変えてしまおうと思ったけどよく分からなくなってあきらめました。
参考
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。