2016-04-02 17 views
0

我正在嘗試創建一個小的Chrome擴展程序來幫助查找Cookie在網站中的使用位置。通過在文檔上設置Cookie的getter方法,擴展名爲SUPPOSE。 像這樣:爲什麼文檔獲取器功能被重置?

document.__defineGetter__('cookie',function(){ 
    alert("test"); 
}); 

當手動投入Chrome的JavaScript控制檯在網站上,然後試圖訪問一個cookie(只需鍵入「document.cookie」),它會導致預期的行爲它會彈出測試提示。

但是,當我把它放入一個擴展名並在頁面的其餘部分加載之前,它將無法工作。

這裏是(我只是用的SoundCloud作爲測試的網站)在manifest.json:

{ 
    "name": "Cookie Auditor", 
    "version": "0.1", 
    "manifest_version": 2, 
    "description": "An extension to help examine where cookies are being used in websites.", 
    "content_scripts": [ 
     { 
      "matches": ["*://*.soundcloud.com/*"], 
      "js": ["content.js"], 
      "run_at": "document_start" 
     } 
    ] 
} 

這裏是content.js:

console.log(document.location); 
document.__defineGetter__('cookie',function(){ 
    alert("test"); 
}); 
console.log(document.__lookupGetter__('cookie')); 

當試圖手動觸發它(document.cookie)它只是返回正常值並且無法執行javascript。當它在這裏工作失敗時,我會對文檔位置進行檢查,以確保它在正確的域中執行並且甚至可以加載。 奇怪的部分是當你用這個擴展加載頁面時,它會打印出它在正確的域上,它甚至表明cookie getter方法被正確覆蓋(它在控制檯中打印該函數)。 但是,當您查找getter方法時,它已被重置(document.__lookupGetter__('cookie'))。

我最後一個想法是,它正在運行我的content.js腳本和初始化頁面的其餘部分之間的某個時候被重置。但是,當我將manifest.json文件中的「run_at」字段更改爲「document_end」,試圖在文檔的任何重新初始化之後使其運行更晚且有力時,soundcloud的東西將在控制檯上開始打印,以顯示它已經正確加載頁面,但是我的腳本仍然沒有產生效果。

編輯:建議之前。我無法使用chrome的cookie API,因爲它沒有提供實際監聽cookie的方式,這是我關心的主要問題。

回答

1

經過一番挖掘,我發現它爲什麼失敗。 Chrome擴展程序在其自己的JavaScript空間中執行,但與其運行的網站具有相同的DOM。請參閱https://developer.chrome.com/extensions/content_scripts#execution-environment。這導致他們有獨立的全局變量,因此我的腳本試圖改變他們只會影響自己。對於任何想要解決此限制的人來說,您只需將代碼的腳本標記添加到您的擴展的文檔中即可。