Cef加载自定义本地资源

news2024/10/24 13:29:44

在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.coloradmin.cn/o/2211165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

麒麟系统离线安装英伟达驱动

麒麟系统离线安装英伟达驱动 驱动相关程序下载下载显卡驱动下载CUDA-Toolkit下载cudnn 安装关闭自带图形界面禁用 Nouveau 驱动安装驱动安装CUDA-Toolkit安装cudnn 驱动相关程序下载 下载显卡驱动 进入显卡驱动查询页面&#xff0c;下载对应的显卡驱动&#xff0c;页面如下&a…

第十节:React路由:react-router认识与基本使用

1. React Router的理解 React的路由根据项目的不同使用不同的路由库,web应用主要使用react-router和react-router-dom react-router和react-router-dom的区别 react-rotuer 核心库,提供了一些核心的api,但是没有提供dom操作进行跳转的api react-router-dom扩展了核心库,提供了一…

Edge TTS

edge-tts项目地址&#xff1a;https://github.com/rany2/edge-tts 1.安装部署 在cmd中运行以下命令安装edge-tts pip install edge-tts pip install edge-tts速度非常快&#xff0c;几秒钟就安装完成了。 2.文本转语音 输入以下命令&#xff0c;将一段英文转为音频。 edg…

Linux——传输层协议

目录 一再谈端口号 1端口号范围划分 2两个问题 3理解进程与端口号的关系 二UDP协议 1格式 2特点 3进一步理解 3.1关于UDP报头 3.2关于报文 4基于UDP的应用层协议 三TCP协议 1格式 2TCP基本通信 2.1关于可靠性 2.2TCP通信模式 3超时重传 4连接管理 4.1建立…

RocketMq的学习

1.mq的秒杀场景 2.mq产品的选型

基于SpringBoot的校园兼职管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

solidity中的mapping以及Memory,Storage Calldata

1.Memory&#xff0c;Storage & Calldata 在 Solidity 中&#xff0c;有以下几种数据存储位置&#xff1a; 栈&#xff08;Stack&#xff09;&#xff1a;栈是一种临时存储区域&#xff0c;用于存储局部变量和函数参数。在函数执行期间&#xff0c;栈上的数据会被分配和释…

探索光耦:光耦——电动自行车安全与智能的坚实保障

随着电动自行车市场的蓬勃发展&#xff0c;如何提升其安全性、可靠性和智能化水平已成为行业关注的焦点。在众多关键元件中&#xff0c;光电耦合器&#xff08;简称光耦&#xff09;正以其独特的功能&#xff0c;成为电动自行车设计中的关键角色。下面&#xff0c;让我们一同探…

Ubuntu22.04阿里云服务器 Gitlab搭建CICD

gitlab搭建cicd流水线教程 1、阿里云申请免费云盘 申请免费云盘用于创建gitlab 申请方法百度 2、安装gitlab-ce 更新系统&#xff1a; sudo apt update sudo apt upgrade -y 安装必要的依赖&#xff1a; sudo apt install -y curl openssh-server ca-certificates pos…

【云原生】Helm资源清单管理工具

资源清单管理工具-Helm 文章目录 资源清单管理工具-Helm资源列表基础环境一、Helm的介绍1.1、Helm的价值概述1.2、Helm的关键名词 二、安装部署Helm2.1、解压安装包2.2、添加命令补全设置 三、使用Helm部署服务管理3.1、使用Helm创建chart3.2、响应式创建名称空间3.3、安装char…

基于Arduino的植物状态监测系统

Arduino植物监测/浇水系统 本项目的3D打印及源码开源&#xff0c;可以私信我进行获取 简介 大家好&#xff0c;今天我将向大家介绍一个非常有趣的项目——Arduino植物监测/浇水系统。这个项目利用一些传感器来观察土壤的状况&#xff0c;并根据这些读数来判断植物是否需要浇…

异构环境下统一授权管理系统的兼容性具体如何实现?

在异构环境中&#xff0c;由于不同系统的差异性&#xff0c;实现统一授权管理面临诸多挑战。其中&#xff0c;兼容性问题是关键之一。兼容性的实现不仅关系到不同系统之间的协同工作&#xff0c;还直接影响到整个管理系统的效率和稳定性。 异构系统带来的挑战 异构系统的存在…

手写mybatis之通过注解配置执行SQL语句

前言 可能领导也都觉得可能就是码农不爱说话&#xff0c;其实不爱说话是一方面&#xff0c;但还有另外一方面是有些领导对于码农提出的问题&#xff0c;给出的回复往往是&#xff1a;“你提出这个问题&#xff0c;你就要给出这个问题的解决办法&#xff01;” 所以不同的岗位要…

AD24之铺铜操作

1.选择板框&#xff0c;即机械1层&#xff0c;转换为覆铜 这样顶层就铺好了&#xff0c;还需要铺底层 2.打开底层&#xff0c;选择板框&#xff0c;转换为铺铜&#xff0c;然后给铜皮添加网络和层&#xff0c;最后是铺铜 注意&#xff1a;None铺铜是无效果的&#xff0c;要Ha…

2.使用 Label Studio 标注文本

使用 Label Studio 标注文本 文章目录 使用 Label Studio 标注文本前言Label Studio的简单使用1.创建项目2.添加本地存储3.选择标注模板4.添加数据5.标注6.添加关系 总结 前言 Label Studio是一个开源的功能强大的标注平台&#xff0c;可以标注视频&#xff0c;图片&#xff0…

一个新韭菜的炒股心得

一个新韭菜的炒股心得 前言 股市其实是一场修行。时刻控制人性的弱点。所以量化优势明显&#xff0c;它没有情绪&#xff0c;可以随意止盈止损。我从一个小白一路走过来&#xff0c;发现A股里有学不完的知识,有做不完的功课。我的主要关注点在如何有效实现价值投资(价值投资在…

算法: 位运算题目练习

文章目录 位运算判定字符是否唯一丢失的数字两整数之和只出现一次的数字 II消失的两个数字常见位运算总结 位运算 判定字符是否唯一 有很多解法,比如hash表,或者给字符串排个序,然后遍历… 写这道题时没注意到如果出现奇数个相同字符,此时就应该返回false了. 而不是全部放到位…

智慧高铁站的概念与优势

1. 概念介绍 智慧高铁站是指利用先进的信息技术和智能化手段&#xff0c;对高铁站的运营管理、服务功能、安全保障等方面进行全面升级和优化的现代化交通枢纽。通过数字化、网络化和智能化技术的应用&#xff0c;实现高铁站的智能化管理、便捷化服务和可持续发展&#xff0c;从…

【Linux】Linux进程基础

1.进程介绍与概念 进程的本质是在计算机内存中运⾏的程序&#xff0c;但是这⼀个概念太过于⼴泛 每个应用程序运行于现代操作系统之上时&#xff0c;操作系统会提供一种抽象&#xff0c;好像系统上只有这个程序在运行&#xff0c;所有的硬件资源都被这个程序在使用。这种假象…

ui自动化知识点-web端

UI &#xff1a; User Interface( ⽤户接⼝ - ⽤户界⾯ ) &#xff0c;主要包括&#xff1a; app 、 web ui ⾃动化测试&#xff1a;使⽤⼯具或代码执⾏⽤例的过程 什么样的项⽬适合做⾃动化&#xff1a;1、需要回归测试项⽬&#xff08;甲⽅⾃营项⽬、⾦融、电商&#xff09…