「this.parent」の「this」がメインウィンドウになっていた。
前回の続き。
やはり他の拡張でも問題が発生するかもしれないので、根本的に解決するために「window.parent._content」がvoidになってしまう原因を突き止める事にした。
Watchリストに「window」、「window.parent」「window.parent._content」を加えて、google検索した後の値を、ConQuery有効/無効の場合で比べてみた。
- ConQuery有効
Name | Value |
---|---|
window | {ChromeWindow} |
window.parent | "" |
window.parent._content | void |
- ConQuery無効
Name | Value |
---|---|
window | {ChromeWindow} |
window.parent | {ChromeWindow} |
window.parent._content | {Window} |
ConQuery有効の場合に、「window.parent」が「""」になっている。
そこでもしやと思って「parent」でConQueryのソースコードをgrep検索したら、以下の部分が怪しいことがわかった。
cqrFileFactory.js:
var cqrItemClass = function(){ //cqrFileDataClass //Common properties //////省略////// this.parent = ""; //////省略////// } //////以下略//////
cqrQueryFactory.js:
var cqrCoUnitProto = function(){ //////省略////// this.parent = ""; //////省略////// } //////以下略//////
この内、「cqrFileFactory.js」の「this.parent = "";」をコメントアウトすると、「window.parent」が「""」にならなくなり、Google検索の結果にもSiteAdvisorの評価アイコンが表示されるようになった。つまり、ここでは「this」が「window」になっていたため、「window.parent」が「""」にセットされ、「window.parent._content」がvoidになってしまっていた。
しかし、いったんコメントアウトを戻して、Venkmanでこの部分にブレークポイントを設け、再度Google検索してみると、cqrItemClass()は何度も呼び出されているが、「this」が「window」になるのは、最後の呼び出しのときだけだということがわかった。そして問題の呼び出しはchrome://conquery/content/main.jsの216行目(バージョンによって違うかもしれない)、
var cqrFileObj = cqrItemClass();
から呼び出されていたので、この部分をコメントアウトすることで、SiteAdvisorが正常に動作するようになった。(「cqrFileObj」はここにしか登場しないので多分問題は発生しないと思う。)
そもそも「cqrItemClass()」はおそらくコンストラクタ関数とやらで、ここ以外は 「new cqrItemClass();」で呼び出されている。上の「cqrFileObj」がここしか登場しないことと合わせて、コードを書いた人の意図がわからない。
というわけでパッチ。
diff -u main.js.orig main.js --- main.js.orig +++ main.js @@ -213,7 +213,7 @@ //Active Entries holder //var cqrFileFactory = new _cqrFileHash(); //File factory var cqrFItem = new cqrItemClass(); //File item -var cqrFileObj = cqrItemClass(); +//var cqrFileObj = cqrItemClass(); //var cqrFileHash = new _cqrFileHash(); var QueryHash = new Object(); var cqrShowAlternatives = false;