Можете ли вы проверить, обернут ли объект XPConnect (Firefox)? - PullRequest
2 голосов
/ 17 марта 2011

Мой сценарий: Я перебираю объект окна и пытаюсь извлечь только пользовательские переменные / функции и отфильтрую нативные объекты браузера.

for(var i in window) {
    // Right now I just have a bunch of if checks on window[i]
}

Я заметил, что нативные объекты браузера / компоненты XPCOM оборачиваются через XPConnect, который возвращает обертку объекта, которая позволяет ему взаимодействовать с Javascript. Я думаю, что если бы я мог как-то проверить и посмотреть, является ли объект оберткой, я бы мог отфильтровать его. Есть ли способ проверить, обернут ли объект через XPConnect? Я хотел бы отфильтровать все объекты, которые упакованы как любой из типов оболочек, перечисленных здесь: https://developer.mozilla.org/en/XPConnect_wrappers

Ответы [ 2 ]

4 голосов
/ 18 марта 2011

Вы можете обнаружить XPCWrappedNative, потому что x instanceof Components.interfaces.nsISupports возвращает true. Однако это также возвращает true для узлов DOM, документов, окон и т. Д. Если это не то, что вам нужно, последующий x.QueryInterface(Components.interfaces.nsIClassInfo) должен быть успешным для большинства объектов DOM.

Вы не можете обнаружить XPCWrappedJS, если базовый объект JS не предоставляет свойство wrappedJSObject. (На самом деле вы не видите сам объект XPCWrappedJS, поскольку это объект C ++, но этот объект затем может быть передан обратно в JS как XPCWrappedNative.)

Вы можете обнаружить XPCNativeWrapper, используя x == XPCNativeWrapper(x). Конечно, базовый объект сам по себе будет XPCWrappedNative.

Вы действительно не можете обнаружить XPCSafeJSObjectWrapper, вы просто должны знать, что если вы развернете XPCNativeWrapper для объекта содержимого, вы получите XPCSafeJSObjectWrapper.

0 голосов
/ 18 марта 2011

Почему бы просто не проверить наличие свойства с именем wrappedJSObject, которое открывают обернутые объекты?Если это крякает как утка ...

...