FAQ VCL
Компоненты\Chromium (dcef3)

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как загрузить страницу?

// Способ первый
procedure TForm1.Button1Click(Sender: TObject);
begin
   Chromium1.Load('http://ya.ru');
   // или так
   // Chromium1.Browser.MainFrame.LoadUrl('http://ya.ru');
end;

// Способ второй
// загрузка локальной страницы
procedure TForm1.Button1Click(Sender: TObject);
begin
   Chromium1.Load('file:///c:/local.html');
   // или так
   // Chromium1.Browser.MainFrame.LoadUrl('file:///c:/local.html');   
end;


Как передать логин/пароль для авторизации?

procedure TForm1.Chromium1GetAuthCredentials(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean;
  const host: ustring; port: Integer; const realm, scheme: ustring;
  const callback: ICefAuthCallback; out Result: Boolean);
begin
   Callback.Cont(FUser, FPass);
   Result := True;
end;


Как изменить папку, в которой должны храниться куки (cookies)?

uses
  {...,} ceflib;

procedure TForm1.Button1Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
  CookiesPath: string;
begin
   CookiesPath := ExtractFilePath(Application.ExeName) + 'Cookies';
   CookieManager := TCefCookieManagerRef.Global(nil);
   CookieManager.SetStoragePath(CookiesPath, False, nil);
   Chromium1.Load('http://ya.ru');
end;


Как удалить куки (cookies)?

// Способ первый
uses
  {...,} ceflib;

procedure TForm1.Button1Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
   CookieManager := TCefCookieManagerRef.Global(nil);
   if not CookieManager.DeleteCookies('', '', nil) then
      raise Exception.Create('Кукисы не удалены!');
end;

// Способ второй
uses
  {...,} ceflib;

// Нужно обойти все хранящиеся куки с помощью VisitAllCookiesProc
// и внутри visitor-а установить их свойство deleteCookie равным True
procedure TForm1.Button3Click(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
   CookieManager := TCefCookieManagerRef.Global(nil);
   CookieManager.VisitAllCookiesProc(
      function(const name, value, domain, path: ustring; secure, httponly,
         hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
         count, total: Integer; out deleteCookie: Boolean): Boolean
      begin
         deleteCookie := True;
         ShowMessage('Кукисы для домена ' + domain + ' удалены!');
      end
   );
end;

// name, value, domain, path, secure, httponly, hasExpires, creation, lastAccess, expires —
//    свойства объекта класса TCefCookie;
// count — индекс "текущего" cookie;
// total — общее количество кукисов;
// deleteCookie — если установите True, то "текущий" кукис будет удален.

// Способ третий
// Если место хранения куков устанавлено принудительно с помощью SetStoragePath,
// то можно удалить все содержимое этой папки.


Как заставить TChromium игнорировать ошибки SSL?

// Способ первый
// В dpr до вызова CefLoadLibDefault
program Project1;

uses
  {...,} ceflib;

{$R *.res}

begin
  CefIgnoreCertificateErrors := True;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

// Способ второй
procedure TForm1.Chromium1CertificateError(Sender: TObject;
  const browser: ICefBrowser; certError: Integer; const requestUrl: ustring;
  const sslInfo: ICefSslInfo; const callback: ICefRequestCallback;
  out Result: Boolean);
begin
   callback.Cont(True);
   Result := True;
end;


Как изменить User-Agent?

// В dpr до вызова CefLoadLibDefault
program Project1;

uses
  {...,} ceflib;

{$R *.res}

begin
  CefUserAgent := 'My User Agent';

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Как загрузить строковые данные в TChromium не прибегая к открытию файла?

procedure TForm1.Button1Click(Sender: TObject);
const
  Content = 'Some content';
begin
   Chromium1.Browser.MainFrame.LoadString(Content, 'http://none.ru');
end;


Как программно заполнить и отправить форму?

procedure TForm1.FormCreate(Sender: TObject);
const
  Content = '<html>' +
            '   <body>' +
            '      <form name="loginform" id="loginform">' +
            '         <input type="text" name="login" id="login" />' +
            '         <input type="password" name="password" id="password" />' +
            '         <input type="submit" value="Войти" />' +
            '      </form>' +
            '   </body>' +
            '</html>';
var
  CodeStr: string;
begin
   Chromium1.Browser.MainFrame.LoadString(Content, 'http://none.ru');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  CodeStr: string;
begin
   if Assigned(Chromium1.Browser) and Assigned(Chromium1.Browser.Mainframe) then
   begin
      CodeStr := 'document.forms[0].login.value="UserLogin";';
      Chromium1.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
      CodeStr := 'document.forms[0].password.value="UserPass";';
      Chromium1.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
      CodeStr := 'document.forms[0].submit();';
      Chromium1.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
    end;
end;


Как получить результат выполнения JavaScript'а?

// Способ первый
// Вывести результат в сообщении
procedure TForm1.Button1Click(Sender: TObject);
var
  CodeStr: string;
begin
   if Assigned(Chromium1.Browser) and Assigned(Chromium1.Browser.Mainframe) then
   begin
      CodeStr := 'alert("123");';
      Chromium1.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
   end;
end;

procedure TForm1.Chromium1Jsdialog(Sender: TObject; const browser: ICefBrowser;
  const originUrl, acceptLang: ustring; dialogType: TCefJsDialogType;
  const messageText, defaultPromptText: ustring; callback: ICefJsDialogCallback;
  out suppressMessage, Result: Boolean);
begin
   case dialogType of
      JSDIALOGTYPE_ALERT: Caption := '[ALERT] ' + messageText;
      JSDIALOGTYPE_CONFIRM: Caption := '[CONFIRM] ' + messageText;
      JSDIALOGTYPE_PROMPT: Caption := '[PROMPT] ' + messageText;
   end;

   // Подавить вывод сообщения можно одним из двух способов:
   //   • suppressMessage := True;
   //   • Result := True;
   Result := True;
end;

// Способ второй
// Вывести результат в консоли
procedure TForm1.Button1Click(Sender: TObject);
var
  CodeStr: string;
begin
   if Assigned(Chromium1.Browser) and Assigned(Chromium1.Browser.Mainframe) then
   begin
      CodeStr := 'console.log("123");';
      Chromium1.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
   end;
end;

procedure TForm1.Chromium1ConsoleMessage(Sender: TObject;
  const browser: ICefBrowser; const message, source: ustring; line: Integer;
  out Result: Boolean);
begin
   Caption := message;
   Result := True;
end;


Как показать исходный код страницы?

// Способ первый
uses
  {...,} ceflib;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Chromium1.Browser.MainFrame.GetSourceProc(procedure (const src: ustring)
      var
        source: ustring;
      begin
         source := src;
         source := StringReplace(source, '<', '&lt;', [rfReplaceAll]);
         source := StringReplace(source, '>', '&gt;', [rfReplaceAll]);
         source := '<html><body>Source:<pre>' + source + '</pre></body></html>';
         Form1.Chromium1.Browser.MainFrame.LoadString(source, 'source://html');
      end);
end;

// Способ второй
uses
  {...,} ceflib;

type
  TForm1 = class(TForm)
  {...}
  private
    HTML: ustring;
  end;

procedure ShowSource(const Src: ustring);
begin
   Form1.HTML := Src;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(HTML);
end;

procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; httpStatusCode: Integer);
begin
   if (browser <> nil) and (browser.Identifier = Chromium1.BrowserId) and
      ((frame = nil) or (frame.IsMain))
   then
      Chromium1.Browser.MainFrame.GetSourceProc(ShowSource);
end;

При использовании материала - ссылка на сайт обязательна