重写javascript全局变量的可靠方法

重写javascript全局变量的可靠方法,javascript,c#,chromium,chromium-embedded,cefsharp,Javascript,C#,Chromium,Chromium Embedded,Cefsharp,我试图通过在每运行一个脚本之前注入并将其设置为某个固定日期来模拟浏览器上的日期。任何帧上的每个窗口对象在任何时候都只能访问模拟日期,因此理想的做法是在内部重新定义JavaScript日期对象,但我认为CefSharp甚至Chromium都没有这个选项。我还将模拟一些其他功能,如setTimeout和Math.rand,以防止浏览器产生任何副作用(这是一个更大项目的一部分,其目的是能够记录/重播浏览活动),因此干扰操作系统的时间并不能解决问题 我考虑使用,因为它实际上可以覆盖现有的全局变量,但我不

我试图通过在每运行一个脚本之前注入并将其设置为某个固定日期来模拟浏览器上的日期。任何帧上的每个
窗口
对象在任何时候都只能访问模拟日期,因此理想的做法是在内部重新定义JavaScript
日期
对象,但我认为CefSharp甚至Chromium都没有这个选项。我还将模拟一些其他功能,如
setTimeout
Math.rand
,以防止浏览器产生任何副作用(这是一个更大项目的一部分,其目的是能够记录/重播浏览活动),因此干扰操作系统的时间并不能解决问题

我考虑使用,因为它实际上可以覆盖现有的全局变量,但我不认为有办法传递JavaScript构造函数

到目前为止,我尝试的是处理事件:


其中“Inject.js”包含模拟日期代码。但我注意到,随机的,有时它会工作,有时不会。我猜是因为函数是异步的,javascript上下文有时还没有创建,因为根据文档,这里不应该运行脚本。文档建议改为处理,但它只针对主框架运行,不允许在任何iframe上注入代码。因此,我想知道我是否有其他选择。

如果您可以编辑HTML入口点,那么您可以在任何其他脚本之前添加
window.Date=MockDate
。例如:

<html>
<body>
<script src="mockdate.js"></script>
<script>
    window.Date = MockDate
</script>
<script src="myscript.js"></script>
</body>
</html>

window.Date=MockDate
因此,您可以调整HTML中的脚本加载顺序。它可以在任何浏览器中完成

如果您不能或不想编辑HTML,那么就要复杂得多。您可以在CEF C++中使用,或者在CEFAXP中使用它。 UPD
事实上,我不太清楚。可靠的方法是实现您自己的,但您已经提到了。如果它不起作用,那么它是CEFApple或CEF C++本身的一个bug。在这种情况下,最好在

< P>上写下,如果有其他人需要这个,解决方案是通过添加一个行到“代码”> CEFAPunMaundEngRePrA::OnCutExcBeutix< /Cux:< /P>来修改实际的C++ CEFHARP代码。
frame->ExecuteJavaScript(CodeToInject, "something://something", 1);

如果在C#端注入,这将不起作用,我相信,因为这些调用是异步的,所以在页面上的脚本已经运行之后,注入可能太晚了

如果你需要这种程度的控制,那么你最好使用CefGlue或ChromiumFx@amaitland对我来说,修改CefSharp以针对每一帧触发
OnContextCreated
,有多难?你能告诉我正确的方向吗?只需搜索oncontextcreated的源代码,只需几分钟即可找到
frame->ExecuteJavaScript(CodeToInject, "something://something", 1);