【问题标题】:Reliable way to override javascript globals覆盖javascript全局变量的可靠方法
【发布时间】:2017-04-08 17:33:59
【问题描述】:

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

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

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

private static string Inject = File.ReadAllText("Inject.js");

private void ChromeBrowser_FrameLoadStart(object sender, FrameLoadStartEventArgs e)
{
    e.Frame.ExecuteJavaScriptAsync(Inject);
}

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

【问题讨论】:

  • 如果您需要这种级别的控制,那么使用 CefGlue 或 ChromiumFx 可能会更好
  • @amaitland 将 CefSharp 修改为每帧触发 OnContextCreated 有多难?你能指出我正确的方向吗?
  • 只搜索oncontextcreated的来源,只需几分钟即可找到

标签: javascript c# chromium chromium-embedded cefsharp


【解决方案1】:

如果其他人需要这个,解决方案是通过在CefAppUnmanagedWrapper::OnContextCreated 末尾添加一行来修改实际的 C++ CefSharp 代码:

frame->ExecuteJavaScript(CodeToInject, "something://something", 1);

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

【讨论】:

    【解决方案2】:

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

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

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

    如果您不能或不想编辑 HTML,那就更麻烦了。您可以在 CEF C++ 中使用 CefLoadHandler 或在 CefSharp 中使用它的替代方法。

    UPD 其实我不确定CefLoadHandler。可靠的方法是实现你自己的CefRenderProcessHandler 但你已经提到过。如果它不起作用,那么它是 CefSharp 或 CEF C++ 本身的一个错误。在这种情况下,最好写在http://magpcss.org/ceforum/

    【讨论】:

      猜你喜欢
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多