Cef加载自定义本地资源

在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.rhkb.cn/news/446137.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

福州少儿自闭症寄宿制学校:专注关爱每个孩子

在福州&#xff0c;少儿自闭症寄宿制学校以其专注与关爱&#xff0c;为自闭症儿童提供了一个温暖的避风港。这些学校不仅提供教育服务&#xff0c;更是一个充满爱与包容的大家庭&#xff0c;让孩子们在这里找到归属感和自信心。然而&#xff0c;当我们把目光投向广州&#xff0…

《鸟哥的Linux私房菜基础篇》---1 Linux的介绍与如何开启Linux之路

目录 一、Linux的简单介绍 1、Linux的简介 2、Linux的起源与发展 3、主要特点 4、应用场景 二、开启Linux之路 1、学习Linux的相关知识 2、正规表示法、管线命令、数据流重导向 前言 整体大纲预览 一、Linux的简单介绍 1、Linux的简介 &#xff08;1&#xff09;Linu…

[棋牌源码] 2023情怀棋牌全套源代码含多套大厅UI及600+子游源码下载

降维打击带来的优势 这种架构不仅极大提升了运营效率&#xff0c;还降低了多端维护的复杂性和成本。运营商无需投入大量资源维护多套代码&#xff0c;即可实现产品的全终端覆盖和快速更新&#xff0c;这就是产品层面的降维打击。 丰富的游戏内容与多样化大厅风格 类型&#…

VS2017 编译 SQLite3 动态库

首先官方下载源码: Tags sqlite/sqlite (github.com) 1.安装 VS2017 community edition 2.打开VS2017命令行工具 3.安装TCL 开发库,推荐 TCL 9.0 先下载源码: Tcl/Tk 9.0 使用vs2017编译tcl&

图书馆自习室座位预约管理微信小程序+ssm(lw+演示+源码+运行)

摘 要 随着电子商务快速发展世界各地区,各个高校对图书馆也起来越重视.图书馆代表着一间学校或者地区的文化标志&#xff0c;因为图书馆丰富的图书资源能够带给我们重要的信息资源&#xff0c;图书馆管理系统是学校管理机制重要的一环&#xff0c;,面对这一世界性的新动向和新…

vue3中监视 Reactive对象中的属性

watch 的第一个参数可以是不同形式的“数据源”&#xff1a;它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组 一、框架&#xff1a; <template><div class"divBox"><h2>姓名&#xff1a;{{ person.…

ElasticSearch是什么?

1.概述 Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。它专为云计算环境设计&#xff0c;提供了一个分布式的、高可用的实时分析和搜索平台。Elasticsearch 可以处理大量数据&#xff0c;并且具备横向扩展能力&#xff0c;能够通过增加更多的硬…

力扣周赛:第419场周赛

&#x1f468;‍&#x1f393;作者简介&#xff1a;爱好技术和算法的研究生 &#x1f30c;上期文章&#xff1a;力扣周赛&#xff1a;第415场周赛 &#x1f4da;订阅专栏&#xff1a;力扣周赛 希望文章对你们有所帮助 因为一些特殊原因&#xff0c;这场比赛就打了1h&#xff0c…

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建立…

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…

开源商城系统crmeb phpstudy安装配置

BOSS让我最快时间部署一套开源商场系统&#xff0c;今天就以crmeb为例。 快速部署在linux中我会首选docker&#xff0c;因为我要在windows中部署&#xff0c;本文就选用phpstudy集成环境做了。 什么是crmeb 我从官网摘点&#xff1a; CRMEB产品与服务 CRMEB通过将CRM&#x…

Leecode刷题之路第18天之四数之和

题目出处 18-四数之和-题目出处 题目描述 个人解法 思路&#xff1a; todo 代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo 官方解法 18-四数之和-官方解法 方法1&#xff1a;排序双指针 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java…

codeforces round976 div2

A find minimum operations 思路&#xff1a;将所给的n变成k进制数&#xff0c;答案就是n的k进制形式下的位数之和 代码&#xff1a; #include <bits/stdc.h> using namespace std;typedef long long ll;ll n, k;void solve() {cin >> n >> k;ll cnt 0…

陪诊小程序搭建:打造便利的陪诊环境

陪诊行业作为一个新兴行业&#xff0c;随着老龄化的严重&#xff0c;在近几年中需求量日益旺盛。陪诊师为大众的就医提供了极大的便利性&#xff0c;在看病难、医疗资源紧张方面发挥了积极作用。 在陪诊行业的快速发展下&#xff0c;陪诊小程序为行业带来了便捷的模式&#xf…

解决:gpg: 从公钥服务器接收失败:服务器故障

当你添加密钥时报错&#xff0c;可以按照下面的步骤&#xff0c;依次输入。 # 停止 Network Manager 服务 sudo service network-manager stop# 删除 Network Manager 的状态文件 sudo rm /var/lib/NetworkManager/NetworkManager.state# 重新启动 Network Manager 服务 sudo …

TCP IP网络编程

文章目录 TCP IP网络编程一、基础知识&#xff08;TCP&#xff09;1&#xff09;Linux1. socket()2.bind()2.1前提2.2字节序与网络字节序2.3 字节序转换2.4 字符串信息转化成网络字节序的整数型2.5 INADDR_ANY 3.listen()4.accept()5.connect()6.案例小结6.1服务器端6.2 客户端…

Idea不能创建java8切换路径

顶部的Server URL改成https://start.aliyun.com/

【原创】可用于 Android Studio 的翻译插件

在不少讲解Android 开发的老师视频中会出现一个运行在Android Studio 上的翻译插件&#xff0c;感觉挺实用的。 接下来&#xff0c;我们把它安装在我们的Android Studio 上。 设置 点击右上角齿轮按钮&#xff0c;选择Settings 安装 翻译插件 输入Tanslation&#xff0c;选…

ZStack ZROP首个商用版本发布,打造云的可持续发展框架

经过长时间的研发和测试&#xff0c;ZStack ZROP IT服务中台V4.2.0版本正式发布。ZROP 是针对ZStack全系列产品运营、运维、一体化的自研平台。作为第一个商用版本&#xff0c;ZROP V4.2.0支持包含ZStack Cloud、ZStack Cube、ZStack ZStone、ZStack Zaku、ZStack Edge、ZStack…

针对考研的C语言学习(循环队列-链表版本以及2019循环队列大题)

题目 【注】此版本严格按照数字版循环队列的写法&#xff0c;rear所代表的永远是空数据 图解 1.初始化部分和插入部分 2出队 3.分部代码解析 初始化 void init_cir_link_que(CirLinkQue& q) {q.rear q.front (LinkList)malloc(sizeof(LNode));q.front->next NULL…