使用file://进行Delphi和FireMonkey WebBrowser回调

时间:2018-01-18 12:42:21

标签: javascript delphi firemonkey twebbrowser delphi-10.2-tokyo

我在应用程序中使用10.2.2 Tokyo Enterprise和FireMonkey的TWebBrowser。我希望收到一个回调响应,但是当我运行代码时ShouldStartLoadWithRequest触发时,我没有收到回传。

我想知道如果没有编写包装器,这是否可行。我觉得我错过了一些简单的事情。

我已经检查了这些网站以及更多网站,并尝试了许多不同的方式...

Callback from Firemonkey WebBrowser JavaScript code

Adding Javascript processing capability to TWebBrowser in iOS

Callback Delphi function from TWebBrowser by javascript on Delphi XE6 for all platforms (including iOS, ANDROID)?

这是我的简单代码版本:

的index.html

<!DOCTYPE html><html lang="en">
<body>
<h2> Get Callback</h2>
</body>
</html>
procedure TForm2.FormCreate(Sender: TObject);
begin
  WebBrowser1.URL := 'file://' + GetCurrentDir +  '/../../index.html';
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  js : string;
begin
  js := ' var url = "file://' + GetCurrentDir +  '/../../index.html";'+
        'var encodedurl = encodeURIComponent(url);'+
        'window.location.href = encodedurl+"?67";';
  WebBrowser1.EvaluateJavaScript(js);
end;

procedure TForm2.WebBrowser1ShouldStartLoadWithRequest(ASender: TObject;
  const URL: string);
var
  js,TheURL: String;
begin
  TheURL := 'file://' + GetCurrentDir +  '/../../index.html';
  js := URL;
  Fetch(js, TheURL+'?',true,false);  //remove the URL and ?
  js := TIdURI.URLDecode(js, IndyTextEncoding_UTF8);
  Memo1.Lines.Text := js;
end;

原则上,更改URL的结尾应该诱使WebBrowser相信它是一个新的URL,并且我应该能够在保持页面刷新的同时提取数字67。

请你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

我继续进一步调查......

通常在向服务器发送标题时,服务器会接受标题,但在上面的实例中,标题会从本地网址 发送到本地网址,浏览器将选择此项并将标题标记为格式错误。这是因为CORS政策步入。

可以使用--disable-web-security标志在Chrome中禁用同源请求策略。但是当我使用标准的Firemonkey Web浏览器时,Chrome解决方案并不完全适用。

然而,似乎IE 11和Edge的可更改安全/区域设置已完全删除。您可以访问它的唯一方法是通过包装器。

请参阅Can the same-origin request policy be disabled in Microsoft Edge?

希望Embarcadero很快就会将回调函数添加到Firemonkey Web浏览器中。所以在此期间我发现了一个简单的解决方法。我从Getit Package Manager下载了ScriptGate 1.0并使用了他们的包装器库。虽然这不是我的问题的真正解决方案,但它是寻求快速解决方案的其他人的解决方案。

这是我用来实现它的回调函数......

uses
SG.ScriptGate,...
 var
    FScriptGate: TScriptGate;

procedure TForm2.FormCreate(Sender: TObject);
begin
  WebBrowser1.URL := 'file://' + GetCurrentDir +  '/../../index.html';
  FScriptGate := TScriptGate.Create(Self, WebBrowser1, 'YourOrgScheme');
  end;

procedure TForm2.FormShow(Sender: TObject);
begin
//use a timer (set to 200) to call evalfunction if URL not loaded in time 
  evalfunction;
end;

procedure TForm2.Button1Click(Sender: TObject);//callback function
begin
    FScriptGate.CallScript(
    'getvalue()',   // calls the javasacript getvalue function
    procedure(const iResult: String)
    begin
      ShowMessage(iResult); //result will be 67        
  );
end;

procedure TForm2.evalfunction; //populates browser onFormshow
var
 js:string;
begin
    js :=
       'function getvalue(){'+
      ' return "67";'+
       '}';
    WebBrowser1.EvaluateJavaScript(js);
   end;