Как отключить опцию просмотра источника в Chromium Embedded?

Можно ли отключить параметр просмотра источника в Delphi Chromium Embedded?
Я не нашел ничего подходящего в списке свойств / методов.

2 ответа

Решение

Нет прямых настроек или событий, позволяющих скрыть пункты всплывающего меню Chromium. Однако у вас есть как минимум несколько вариантов продолжения, например, вы можете:

1. Скажите пользователю, что опция Просмотр источника запрещена, и откажитесь от действия

Вы можете решить, какие действия вы позволите или отклоните в OnMenuAction обработчик события, где, если вы назначите True для Result Параметр действие отклонено. Следующий код проверяет, что вы выполнили действие просмотра источника, и если да, отклоните действие и покажите информационное сообщение:

type
  TCefMenuId = TCefHandlerMenuId;

procedure TForm1.Chromium1MenuAction(Sender: TObject;
  const browser: ICefBrowser; menuId: TCefMenuId; out Result: Boolean);
begin
  if menuId = MENU_ID_VIEWSOURCE then
  begin
    Result := True;
    ShowMessage('View page source is not allowed!');
  end;
end;

2. Подделайте пункт меню к чему-то особенному, изменив заголовок пункта меню с его действием

Вы можете использовать пункт меню для чего-то другого, изменив заголовок пункта меню и выполнив некоторые пользовательские действия. В следующем примере кода показано, как изменить элемент меню представления источника на элемент меню about box:

type
  TCefMenuId = TCefHandlerMenuId;

procedure TForm1.Chromium1GetMenuLabel(Sender: TObject;
  const browser: ICefBrowser; menuId: TCefMenuId; var caption: ustring;
  out Result: Boolean);
begin
  if menuId = MENU_ID_VIEWSOURCE then
    caption := 'About my application...';
end;

procedure TForm1.Chromium1MenuAction(Sender: TObject;
  const browser: ICefBrowser; menuId: TCefMenuId; out Result: Boolean);
begin
  if menuId = MENU_ID_VIEWSOURCE then
  begin
    Result := True;
    ShowMessage('About box...!');
  end;
end;

3. Создайте свое собственное всплывающее меню страницы (фрейма)

Вы можете создать свое собственное всплывающее меню, но вы должны учитывать, что это меню довольно жестко запрограммировано, поэтому вам нужно будет поддерживать его, если вам нужно, чтобы оно было одинаковым с каждой новой версией оболочки Delphi Chromium. Вот код, как создать меню страницы без пункта меню просмотра источника:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, cefvcl, ceflib;

type
  PCefMenuInfo = PCefHandlerMenuInfo;

type
  TForm1 = class(TForm)
    Chromium1: TChromium;
    procedure FormCreate(Sender: TObject);
    procedure Chromium1BeforeMenu(Sender: TObject; const browser: ICefBrowser;
      const menuInfo: PCefMenuInfo; out Result: Boolean);
  private
    PageMenu: TPopupMenu;
    procedure OnNavigateBackMenuItemClick(Sender: TObject);
    procedure OnNavigateForwardMenuItemClick(Sender: TObject);
    procedure OnPrintMenuItemClick(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.OnNavigateBackMenuItemClick(Sender: TObject);
begin
  Chromium1.Browser.GoBack;
end;

procedure TForm1.OnNavigateForwardMenuItemClick(Sender: TObject);
begin
  Chromium1.Browser.GoForward;
end;

procedure TForm1.OnPrintMenuItemClick(Sender: TObject);
begin
  Chromium1.Browser.GetFocusedFrame.Print;
end;

procedure TForm1.Chromium1BeforeMenu(Sender: TObject;
  const browser: ICefBrowser; const menuInfo: PCefMenuInfo;
  out Result: Boolean);
begin
  if menuInfo.typeFlags = MENUTYPE_PAGE then
  begin
    Result := True;
    PageMenu.Items[0].Enabled := browser.CanGoBack;
    PageMenu.Items[1].Enabled := browser.CanGoForward;
    PageMenu.Popup(menuInfo^.x, menuInfo^.y);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  MenuItem: TMenuItem;
begin
  PageMenu := TPopupMenu.Create(Self);
  MenuItem := TMenuItem.Create(PageMenu);
  MenuItem.Caption := 'Back';
  MenuItem.OnClick := OnNavigateBackMenuItemClick;
  PageMenu.Items.Add(MenuItem);
  MenuItem := TMenuItem.Create(PageMenu);
  MenuItem.Caption := 'Forward';
  MenuItem.OnClick := OnNavigateForwardMenuItemClick;
  PageMenu.Items.Add(MenuItem);
  MenuItem := TMenuItem.Create(PageMenu);
  MenuItem.Caption := '-';
  PageMenu.Items.Add(MenuItem);
  MenuItem := TMenuItem.Create(PageMenu);
  MenuItem.Caption := 'Print';
  MenuItem.OnClick := OnPrintMenuItemClick;
  PageMenu.Items.Add(MenuItem);
  Chromium1.Load('www.stackru.com');
end;

end.

сноска

Определения типов, используемые во всех примерах кода, присутствуют, потому что я заметил, что некоторые версии Delphi Chromium имеют неправильные определения обработчиков событий.

Возможно, что-то изменилось за последние годы, сегодня существует прямой метод:

uses
  ceflib;

[..]

implementation

procedure TForm1.Chromium1BeforeContextMenu(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame;
  const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
  //model.Clear;
  model.Remove(Integer(MENU_ID_VIEW_SOURCE));
end;

Ты можешь использовать model.Clear если вы хотите полностью избавиться от всплывающего меню.

Другие вопросы по тегам