在一个表单上的两个铬实例的不同的cookie处理程序 [英] Different cookie handlers for two chromium instances on one form

查看:452
本文介绍了在一个表单上的两个铬实例的不同的cookie处理程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Delphi XE3上使用DCEF3。



任务是:为不同的TChromium实例创建不同的Cookie存储。
问题:我为每个TChromium实例创建不同的ICefCookieManager实例,并在GetCookieManager事件中返回。



示例代码:

  type 
TForm1 = class(TForm)
Button1:TButton;
Button2:TButton;
Chromium1:TChromium;
Chromium2:TChromium;
procedure Button1Click(Sender:TObject);
procedure Button2Click(Sender:TObject);
procedure FormCreate(Sender:TObject);
procedure Chromium1GetCookieManager(Sender:TObject;
const browser:ICefBrowser; const mainUrl:ustring;
out Result:ICefCookieManager);
procedure Chromium2GetCookieManager(Sender:TObject;
const browser:ICefBrowser; const mainUrl:ustring;
out Result:ICefCookieManager);
private
{Private declarations}
CookieManager:ICefCookieManager;
CookieManager2:ICefCookieManager;
public
{public declarations}
end;

var
Form1:TForm1;

procedure TForm1.FormCreate(Sender:TObject);
begin
CookieManager:= TCefCookieManagerRef.New('C:\Cookies\1');
CookieManager2:= TCefCookieManagerRef.New('C:\Cookies\2');
end;

procedure TForm1.Chromium1GetCookieManager(Sender:TObject;
const browser:ICefBrowser; const mainUrl:ustring;
out Result:ICefCookieManager);
begin
结果:= CookieManager;
end;

procedure TForm1.Chromium2GetCookieManager(Sender:TObject;
const browser:ICefBrowser; const mainUrl:ustring;
out Result:ICefCookieManager);
begin
结果:= CookieManager2;
end;

procedure TForm1.Button1Click(Sender:TObject);
begin
Chromium1.Load('http://somesite.com');
end;

procedure TForm1.Button2Click(Sender:TObject);
begin
Chromium2.Load('http://somesite.com');
end;

如果我添加 ShowMessage('First') Chromium1GetCookieManager 事件和 ShowMessage('Second') Chromium2GetCookieManager ,总是显示消息第一,无论是按button1还是button2。

换句话说,Chromium1GetCookieManager被调用的两个实例。



如何解决问题?

>

只需关闭project1.dpr中的cefsingleprocess变量即可。

示例:

 程序Project1; 

使用
形式,
cefvcl,
ceflib,
Unit1在'Unit1.pas'{Form1};

{$ R * .res}

begin
CefSingleProcess:= False; //这是我所说的
Application.Initialize;
Application.CreateForm(TForm1,Form1);
Application.Run;
end。


I'm using DCEF3 on Delphi XE3.

Task is : Create different cookie storages for different TChromium instances.
Problem : I'm creating different ICefCookieManager instances for each TChromium instances and its returning in GetCookieManager event.

Example code:

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Chromium1: TChromium;
    Chromium2: TChromium;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Chromium1GetCookieManager(Sender: TObject;
      const browser: ICefBrowser; const mainUrl: ustring;
      out Result: ICefCookieManager);
    procedure Chromium2GetCookieManager(Sender: TObject;
      const browser: ICefBrowser; const mainUrl: ustring;
      out Result: ICefCookieManager);
  private
    { Private declarations }
      CookieManager: ICefCookieManager;
      CookieManager2: ICefCookieManager;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

procedure TForm1.FormCreate(Sender: TObject);
begin
    CookieManager:=TCefCookieManagerRef.New('C:\Cookies\1');
    CookieManager2:=TCefCookieManagerRef.New('C:\Cookies\2');
end;

procedure TForm1.Chromium1GetCookieManager(Sender: TObject;
  const browser: ICefBrowser; const mainUrl: ustring;
  out Result: ICefCookieManager);
begin
    Result:=CookieManager;
end;

procedure TForm1.Chromium2GetCookieManager(Sender: TObject;
  const browser: ICefBrowser; const mainUrl: ustring;
  out Result: ICefCookieManager);
begin
    Result:=CookieManager2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    Chromium1.Load('http://somesite.com');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    Chromium2.Load('http://somesite.com');
end;

If I add ShowMessage('First') to Chromium1GetCookieManager event, and ShowMessage('Second') to Chromium2GetCookieManager, always the message "First" will be shown, no matter whether I press button1 or button2.
In other words Chromium1GetCookieManager is called for both instances.

解决方案

Problem is solved, thanks to all.

How to solve the problem?
Just turn off cefsingleprocess variable in your project1.dpr.
Example:

program Project1;

uses
  Forms,
  cefvcl,
  ceflib,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  CefSingleProcess := False;//this what i'm talking about
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

这篇关于在一个表单上的两个铬实例的不同的cookie处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆