Свойства фальшивого навигатора

Я хотел бы подделать свойство платформы Navigator для CasperJS (/PhantomJS). Я нашел простые решения для перезаписи объекта Navigator при загрузке страницы, который предлагается во многих других местах в Интернете:

    casper.on('page.initialized', function(){
    this.evaluate(function(){
        (function(oldNav){
            var newNav = {};
            [].forEach.call(Object.getOwnPropertyNames(navigator), function(prop){
                 if (prop === 'platform') {
                    Object.defineProperty(newNav, prop, {
                        value: 'Win64'
                    }); }else {
                    Object.defineProperty(newNav, prop, {
                        get: function(){
                            return oldNav[prop];
                        }
                    });
                }
            });
            window.navigator = newNav;
        })(window.navigator);
    });
});

Но проблема в том, что если мы получим свойства Navigator из iframe, значения по-прежнему будут оригинальными, потому что page.initialized устанавливает его только для главной страницы. Поэтому я решил изменить его в своем исходном коде и снова создать его. Я загрузил Phantomjs из репозитория git, и я искал значение жестко установленной платформы (Linux x86_64 для моего случая). Я нашел жестко закодированную строку в ./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp

Я изменил его на строку, которую я хотел вернуть в качестве платформы navigator.platform, но это не повлияло на навигационную платформу. Где я должен его изменить? Является ли это (платформа) привязанной строкой или создается динамически?

Ответы

Ответ 1

После просмотра кода я выяснил, что следующий файл следует изменить:

src/qt/qtwebkit/Source/WebCore/page/NavigatorBase.cpp

и NavigatorBase::platform() должны быть установлены нужная строка, которую вы хотите вернуть в качестве платформы navigator.platform. Но я не уверен, что это испортит другие вещи, пожалуйста, дайте советы, если это не подходящее решение.