Cef加载自定义本地资源

server/2024/12/22 4:00:06/

在Cef auto build下载cefCEF Automated Builds

我下载的是104,使用cefsimple工程。

例如:前端资源如下

 通过http协议把前端资源加载出来。所有的资源都通过http://local.test.cn/xxx加载。

前端资源包括index.html、test.css、test.js

index.html:

<!DOCTYPE html><html>
<head><meta charset=utf-8><title>测试</title><div>加载成功!</div><div id="test_id" style="width: 100px;height: 100px;" ></div><script type="text/javascript" src="http://local.test.cn/js/test.js"></script><link rel="stylesheet" href="http://local.test.cn/css/test.css"></link>
<head>
<script>window.onload = function (){console.log("load..")}</script>

test.css:

简单做个设置背景颜色

#test_id{background-color: aqua;
}

test.js:

简单终端打印信息

console.log("load test js...")

如果能更改颜色和devtools打印对应信息则表示成功,效果如下:

在cefsimple_win.cc通过CefSettings把远端调试端口打开,就可以在chrome通过localhost:port的方式查看devtools:

我这里设置为1234

在simple_app.cc把加载url地址改为自定义地址:

 要处理前端的请求,需要实现接口CefRequestHandler

在接口CefClient有个成员获取该handler

在SimpleHandler继承CefRequestHandler并实现GetRequestHandler:

把SimpleHandler自己返回出去就行

 CefRequestHandler是通过GetResourceRequestHandler获得资源请求处理对象的,所以我们override这个成员:

判断url是以http://local.test.cn/开头的就使用自定义的SimpleResourceRequestHandler处理

SimpleResourceRequestHandler是继承接口CefResourceRequestHandler的,里面的成员可以自己看文档,这里只实现GetResourceHandler,GetResourceHandler返回处理资源的对象。在cef中CefResourceHandler都是用来处理资源的,例如还有自定义协议等等。

这里我们返回一个自定义resourceHandler,用来读取我们的本地文件并返回给cef:

 CefResourceHandler接口主要实现:

bool Open(CefRefPtr<CefRequest> request,bool& handle_request,CefRefPtr<CefCallback> callback)override;void GetResponseHeaders(CefRefPtr<CefResponse> response,int64& response_length,CefString& redirectUrl) override;bool Read(void* data_out,int bytes_to_read,int& bytes_read,CefRefPtr<CefResourceReadCallback> callback) override;

Open接口:

如果url是我们目标的url,则handle_request=true和返回true,告诉cef这个资源立即处理。

 GetResponseHeaders

需要告诉Cef响应的资源类型,简单处理文件后缀映射类型:

{"html", "text/html"},
{"css","text/css"},
{"js","text/javascript"}

response_length = -1 是告诉cef这个资源由Read接口控制结束,当Read接口返回false,则cef认为该资源读取完毕。

 Read接口

data_out是cef分配好的内存,读取的数据直接拷贝到data_out

 

SimpleTools主要用来读取文件:

SimpleTools.h

#ifndef CEF_TESTS_CEFSIMPLE_TOOLS_H_
#define CEF_TESTS_CEFSIMPLE_TOOLS_H_#include <string>
#include <vector>namespace SimpleTools
{std::string GetModuleDir();class LocalFileReader{public:LocalFileReader();bool PreRead(const std::string& filePath);size_t Read(void* data_out, int& bytes_to_read);std::string MimeType();private:void formatMimeType(const std::string& filePath);size_t m_bytesReadPos = 0;std::vector<char> m_dataBuf;std::string m_mimeType;};}#endif //CEF_TESTS_CEFSIMPLE_TOOLS_H_

SimpleTools.cc

#include "simple_tools.h"#include <Windows.h>
#include <cassert>
#include <fstream>
#include <map>std::string SimpleTools::GetModuleDir()
{static std::string strDir = []()->std::string {CHAR path[MAX_PATH];GetModuleFileNameA(NULL, path, MAX_PATH);std::string strPath = path;size_t index = strPath.rfind('\\');return strPath.substr(0, index);}();return strDir;
}SimpleTools::LocalFileReader::LocalFileReader()
{}bool SimpleTools::LocalFileReader::PreRead(const std::string& filePath)
{m_bytesReadPos = 0;size_t size = 0;std::ifstream file;file.open(filePath, std::ios::binary | std::ios::in);if (file.is_open()){file.seekg(0, file.end);size = file.tellg();file.seekg(0);m_dataBuf.resize(size, 0);file.read((char*)&m_dataBuf[0], size);formatMimeType(filePath);return true;}return false;
}size_t SimpleTools::LocalFileReader::Read(void* data_out, int& bytes_to_read)
{if (m_bytesReadPos == m_dataBuf.size())return 0;if ((m_bytesReadPos + bytes_to_read) > m_dataBuf.size())bytes_to_read = m_dataBuf.size() - m_bytesReadPos;memcpy(data_out, &m_dataBuf[0] + m_bytesReadPos, bytes_to_read);m_bytesReadPos += bytes_to_read;return bytes_to_read;
}std::string SimpleTools::LocalFileReader::MimeType()
{return m_mimeType;
}void SimpleTools::LocalFileReader::formatMimeType(const std::string& filePath)
{size_t idx = filePath.find_last_of(".");if (idx != -1) {static std::map<std::string, std::string> extMimeTypeMap = {{"html", "text/html"},{"css","text/css"},{"js","text/javascript"}};std::string ext = filePath.substr(idx + 1);auto iter = extMimeTypeMap.find(ext);if (iter != extMimeTypeMap.end()) {m_mimeType = iter->second;}}
}


http://www.ppmy.cn/server/131669.html

相关文章

[Linux] 逐层深入理解文件系统 (1)—— 进程操作文件

标题&#xff1a;[Linux] 文件系统 &#xff08;1&#xff09;—— 进程操作文件 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一、进程与打开的文件 二、文件的系统调用与库函数的关系 1.系统调用open() 三、内存中的文件描述符表 四、缓冲区…

Android 10.0 滑动解锁流程

前言 滑动解锁相对于来说逻辑还是简单的&#xff0c;说白了就是对事件的处理&#xff0c;然后做一些事。 这里主要从锁屏的界面Layout结构、touchEvent事件分发、解锁动作逻辑几个方面进行源码的分析。 锁屏的界面Layout结构分析 StatusbarWindowView 整个锁屏界面的顶级 Vi…

【spring ai】java 实现RAG检索增强,超快速入门

rag 需求产生的背景介绍&#xff1a; 在使用大模型时&#xff0c;一个常见的问题是模型会产生幻觉&#xff08;即生成的内容与事实不符&#xff09;&#xff0c;同时由于缺乏企业内部数据的支持&#xff0c;导致其回答往往不够精准和具体&#xff0c;偏向于泛泛而谈。这些问题…

单体到微服务架构服务演化过程

单体到微服务架构服务演化过程 架构服务化 聊聊从单体到微服务架构服务演化过程 单体分层架构 在 Web 应用程序发展的早期&#xff0c;大部分工程是将所有的服务端功能模块打包到单个巨石型&#xff08;Monolith&#xff09;应用中&#xff0c;譬如很多企业的 Java 应用程序…

现代数字信号处理I-P3 MVUE学习笔记

目录 1. 参数估计问题的提出与本质 2. 估计的性质 2.1 Ancillary&#xff08;多余估计&#xff09; 例1&#xff0c;Ancillary估计量 2. Uniformly Optimal 3. Sufficiency充分性 3.1 统计量充分性定义 例2&#xff1a;利用充分统计量定义获取伯努利分布的充分统计量 …

File IO

Unix标准为程序员提供了一系列的通用IO(无缓冲IO)接口以实现文件读写操作&#xff0c;原书第三章主要所涉及到的系统接口主要针对普通文件为操作目标。通用IO相比于标准IO的最大的区别在于没有缓冲机制&#xff0c;只要调用一次标准IO&#xff0c;就进行IO&#xff0c;而不是像…

finebi面试题精选

‌‌FineBI‌是由‌帆软软件有限公司开发的一款商业智能&#xff08;Business Intelligence&#xff09;产品&#xff0c;旨在通过最终业务用户自主分析企业已有的信息化数据&#xff0c;帮助企业发现并解决存在的问题&#xff0c;及时调整策略以做出更好的决策&#xff0c;从而…

Adobe Photoshop Lightroom(图像处理软件) v8.0 中文版

Adobe Photoshop Lightroom 是由 Adobe 公司推出的一个专业的图像处理软件&#xff0c;主要用于数字摄影后期处理。Lightroom 与 Adobe Photoshop 不同&#xff0c;它是专门为数字摄影而设计的软件&#xff0c;注重于整个摄影工作流程的管理和处理&#xff0c;能够帮助摄影师更…