「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;