本文要实现的是在右键菜单中添加一个修改User-Agent功能
定义一个变量,用来控制是使用默认UA还是Android UA
static bool s_UerAgentAndroid = false;
添加右键菜单
// 添加菜单枚举
enum client_menu_ids {
CLIENT_ID_SHOW_DEVTOOLS = MENU_ID_USER_FIRST,
...
....
CLIENT_ID_UserAnget,
};
// 修改菜单项和菜单事件处理
void ClientHandler::OnBeforeContextMenu(CefRefPtr browser,
CefRefPtr frame,
CefRefPtr params,
CefRefPtr model) {
......
......
//添加菜单项
model->AddItem(CLIENT_ID_UserAnget, s_UerAgentAndroid ? "默认UA":"Android UA");
if (delegate_)
delegate_->OnBeforeContextMenu(model);
}
bool ClientHandler::OnContextMenuCommand(CefRefPtr browser,
CefRefPtr frame,
CefRefPtr params,
int command_id,
EventFlags event_flags) {
CEF_REQUIRE_UI_THREAD();
switch (command_id) {
......
......
//菜单事件处理
case CLIENT_ID_UserAnget:
s_UerAgentAndroid = !s_UerAgentAndroid;
browser->Reload(); // 修改UA后重新加载网页
return true;
default: // Allow default handling, if any.
return ExecuteTestMenu(command_id);
}
}
下面就是对每一个请求修改HTTP报文的User-Agent。CEF3会将网页所有资源请求事件通知给CefRequestHandler
或其子类处理,其OnBeforeResourceLoad
是在http请求发出前的处理点,修改相应内容,代码如下
cef_return_value_t ClientHandler::OnBeforeResourceLoad(
CefRefPtr browser,
CefRefPtr frame,
CefRefPtr request,
CefRefPtr callback) {
......
......
if (s_UerAgentAndroid) {
//设置UA字段
request->SetHeaderByName("User-Agent", "Mozilla/5.0 (Android5.1.1)", true);
}
return resource_manager_->OnBeforeResourceLoad(browser, frame, request,
callback);
}