我想更改v8引擎以便能夠攔截對DOM元素的每次訪問。如您所知,v8不會創建DOM樹。瀏覽器創建DOM樹。v8訪問DOM
- 我的問題1:在v8源代碼中,如何/在哪裏將DOM內存結構交付給v8。
- 如何以最小的努力做到我的截取?
我想更改v8引擎以便能夠攔截對DOM元素的每次訪問。如您所知,v8不會創建DOM樹。瀏覽器創建DOM樹。v8訪問DOM
我無法確切地告訴你DOM在V8中的註冊位置,但我有一些關於你可以開始搜索的提示。首先,當瀏覽器創建DOM時,您還應該查看瀏覽器,而不是v8。如果您發現DOM在V8中註冊的位置,您還會看到V8中的代碼被調用。
在鉻中,Frame是包含網頁的類。在其創建過程中,它會實例化一個ScriptController對象,它自己創建一個V8DOMWindowShell。傳入的DOMWrapperWorld及其DOMDataStore維護從DOM到JS對象的映射。
這並不完全告訴你DOM在V8中註冊的位置,但是你周圍的某個地方應該找到它。使用Eclipse並讓其搜索鉻項目中看似有趣的方法的參考,或列出調用層次結構是進行此類研究的好工具。
P.S.:由於我需要類似的東西,我碰到了/src/out/Debug/gen/webcore/bindings
這是一個在編譯Chromium期間創建並填充DOM對象的所有模板的目錄。您可以根據需要編輯它們,然後重新編譯您的更改。
如果您發現生成它們的腳本,您可能一次爲它們全部附加攔截器。
,其登記與V8的DOM元素的代碼是不是V8源代碼中,它在鉻源的另一部分:THIRD_PARTY/WebKit的/來源/
有幾件在那裏它可能是您感興趣的:
在v8的源代碼中,在object.cc文件中,存在名爲SetProperty和Getproperty的ar4e方法數組。這些是我目前攔截的方法。我發現DOM在v8中保持爲Objects的形式。對象inheret可能是對象類,它們具有屬性,孩子等的哈希表。作爲文檔的根對象是DOM樹的根。當然,也有一些緩存機制,但我無法弄清楚確切的機制。無論如何,我已經能夠做一些原始攔截。 – Hossein
我不知道你想在哪裏攔截,但是當我搜索一種融合信息流跟蹤的方法時,我也遇到了這些方法。我在那裏遇到的主要問題是,在運行時在攔截過程中,我不知道發生上下文的任何事情(是否將屬性讀取寫入下一個SetProperty調用?多少個後續屬性讀取屬於一起?等等)如果你想做類似的事情,在你花費在那裏之前先考慮一下。 (我結束了AST重寫。) – Jonas
我想要加密/解密值。當它們被分配時,它們應該被加密,然後在表達式中使用(例如數學),它們的值應該被解密。但我沒有想到AST。它應該工作,我現在會檢查它。我目前的解決方案的問題是,似乎在v8中有相同對象的不同實例。例如,我猜想在賦值完成後,v8會爲對象的值創建不同的實例。你怎麼看? – Hossein