编程技术记录

世界你好!

本文要实现的是在右键菜单中添加一个修改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);
}

© Beli. All Rights Reserved.