Chromium 在WebContents中添加自定义数据c++
为了能在WebContents中添加自定义数据先看下几个关键类的介绍。
一、WebContents 介绍:
WebContents是content模块核心,是呈现 Web 内容(通常为 HTML)位于矩形区域中。
最直观的是一个浏览器标签对应一个WebContents,里面加载一个网页等。
二、看下WebContents定义:
content\public\browser\web_contents.h
{
WebContents具体实现在:
content\browser\web_contents\web_contents_impl.cc
content\browser\web_contents\web_contents_impl.h
}
WebContents继承自base::SupportsUserData
// WebContents is the core class in content/. A WebContents renders web content
// (usually HTML) in a rectangular area.
//
// Instantiating one is simple:
// std::unique_ptr<content::WebContents> web_contents(
// content::WebContents::Create(
// content::WebContents::CreateParams(browser_context)));
// gfx::NativeView view = web_contents->GetNativeView();
// // |view| is an HWND, NSView*, etc.; insert it into the view hierarchy
// // wherever it needs to go.
//
// That's it; go to your kitchen, grab a scone, and chill. WebContents will do
// all the multi-process stuff behind the scenes. More details are at
// https://www.chromium.org/developers/design-documents/multi-process-architecture
// .
//
// The owner of `std::unique_ptr<content::WebContents> web_contents` is
// responsible for ensuring that `web_contents` are destroyed (e.g. closed)
// *before* the corresponding `browser_context` is destroyed.
//
// Each WebContents has a `NavigationController`, which can be obtained from
// `GetController()`, and is used to load URLs into the WebContents, navigate
// it backwards/forwards, etc.
// See navigation_controller.h for more details.
class WebContents : public PageNavigator,public base::SupportsUserData {// Do not remove this macro!// The macro is maintained by the memory safety team.ADVANCED_MEMORY_SAFETY_CHECKS();public:struct CONTENT_EXPORT CreateParams {explicit CreateParams(BrowserContext* context,base::Location creator_location = base::Location::Current());CreateParams(BrowserContext* context,scoped_refptr<SiteInstance> site,base::Location creator_location = base::Location::Current());CreateParams(const CreateParams& other);~CreateParams();
..................................
};
三、base::SupportsUserData定义:
base\supports_user_data.h
注意:看下这几个方法:
Data* GetUserData(const void* key) const;
[[nodiscard]] std::unique_ptr<Data> TakeUserData(const void* key);
void SetUserData(const void* key, std::unique_ptr<Data> data);
void RemoveUserData(const void* key);
namespace base {// This is a helper for classes that want to allow users to stash random data by
// key. At destruction all the objects will be destructed.
class BASE_EXPORT SupportsUserData {public:SupportsUserData();SupportsUserData(SupportsUserData&&);SupportsUserData& operator=(SupportsUserData&&);SupportsUserData(const SupportsUserData&) = delete;SupportsUserData& operator=(const SupportsUserData&) = delete;// Derive from this class and add your own data members to associate extra// information with this object. Alternatively, add this as a public base// class to any class with a virtual destructor.class BASE_EXPORT Data {public:virtual ~Data() = default;// Returns a copy of |this|; null if copy is not supported.virtual std::unique_ptr<Data> Clone();};// The user data allows the clients to associate data with this object.// |key| must not be null--that value is too vulnerable for collision.// NOTE: SetUserData() with an empty unique_ptr behaves the same as// RemoveUserData().Data* GetUserData(const void* key) const;[[nodiscard]] std::unique_ptr<Data> TakeUserData(const void* key);void SetUserData(const void* key, std::unique_ptr<Data> data);void RemoveUserData(const void* key);// Adds all data from |other|, that is clonable, to |this|. That is, this// iterates over the data in |other|, and any data that returns non-null from// Clone() is added to |this|.void CloneDataFrom(const SupportsUserData& other);// SupportsUserData is not thread-safe, and on debug build will assert it is// only used on one execution sequence. Calling this method allows the caller// to hand the SupportsUserData instance across execution sequences. Use only// if you are taking full control of the synchronization of that hand over.void DetachFromSequence();protected:virtual ~SupportsUserData();// Clear all user data from this object. This can be used if the subclass// needs to provide reset functionality.void ClearAllUserData();private:// Externally-defined data accessible by key.absl::flat_hash_map<const void*, std::unique_ptr<Data>> user_data_;bool in_destructor_ = false;// Guards usage of |user_data_|SEQUENCE_CHECKER(sequence_checker_);
};// Adapter class that releases a refcounted object when the
// SupportsUserData::Data object is deleted.
template <typename T>
class UserDataAdapter : public SupportsUserData::Data {public:static T* Get(const SupportsUserData* supports_user_data, const void* key) {UserDataAdapter* data =static_cast<UserDataAdapter*>(supports_user_data->GetUserData(key));return data ? static_cast<T*>(data->object_.get()) : nullptr;}explicit UserDataAdapter(T* object) : object_(object) {}UserDataAdapter(const UserDataAdapter&) = delete;UserDataAdapter& operator=(const UserDataAdapter&) = delete;~UserDataAdapter() override = default;T* release() { return object_.release(); }private:scoped_refptr<T> const object_;
};} // namespace base
四、在WebContents添加数据定义:
由于WebContents继承自base::SupportsUserData,所以只需要调用
base::SupportsUserData::SetUserData 方法即可。
1、需要定义一个类AwSettingsUserData 继承自base::SupportsUserData::Data
class AwSettingsUserData : public base::SupportsUserData::Data {public://添加自己的数据private:};
2、base::SupportsUserData::SetUserData设置数据:
web_contents->SetUserData(kAwSettingsUserDataKey,
std::make_unique<AwSettingsUserData>(this));
3、base::SupportsUserData::GetUserData获取数据:
AwSettingsUserData* data = static_cast<AwSettingsUserData*>(
web_contents->GetUserData(kAwSettingsUserDataKey));
总结:至此在WebContents添加自定义数据方法介绍完毕。
添加自定义数据主要是为了标记WebContents 可以根据此标记对标签进行特殊处理。
相关文章:
Chromium 在WebContents中添加自定义数据c++
为了能在WebContents中添加自定义数据先看下几个关键类的介绍。 一、WebContents 介绍: WebContents是content模块核心,是呈现 Web 内容(通常为 HTML)位于矩形区域中。 最直观的是一个浏览器标签对应一个WebContents,…...
【Apache Zookeeper】
一、简介 1、场景 如何让⼀个应⽤中多个独⽴的程序协同⼯作是⼀件⾮常困难的事情。开发这样的应⽤,很容易让很多开发⼈员陷⼊如何使多个程序协同⼯作的逻辑中,最后导致没有时间更好地思考和实现他们⾃⼰的应⽤程序逻辑;又或者开发⼈员对协同…...
13.音乐管理系统(基于SpringBoot + Vue)
目录 1.系统的受众说明 2 需求分析 2.1用例图及用例分析 2.1.1 用户用例图及用例分析 2.1.2 管理员用例图及用例分析 2.2 系统结构图和流程图 2.2.1 音乐播放器的系统流程图(图2.2.1-1) 2.2.2 系统功能表(表2.2.2…...
如何从iconfont中获取字体图标并应用到微信小程序中去?
下面我们一一个微信小程序的登录界面的制作为例来说明,如何从iconfont中获取字体图标是如何应用到微信小程序中去的。首先我们看效果。 这里所有的图标,都是从iconfont中以字体的形式来加载的,也就是说,我们自始至终没有使用一张…...
C语言中的位操作
第一章 变量某位赋值与连续赋值 寄存器 | 值 //例如:a 1000 0011b a | (1<<2) //a 1000 0111 b 单独赋值 a | (3<<2*2) // 1011 0011b 连续赋值 第二章 变量某位清零与连续清零 寄存器 & ~() 值 //例子:a …...
Spring之HTTP客户端--RestTemplate的使用
原文网址:Spring之HTTP客户端--RestTemplate的使用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍RestTemplate的用法。RestTemplate是Spring自带的HTTP客户端,推荐使用。 项目中经常需要使用http调用第三方的服务,常用的客户端如下࿱…...
vscode和pycharm在当前工作目录的不同|python获取当前文件目录和当前工作目录
问题背景 相信大家都遇到过一个问题:一个项目在vscode(或pycharm)明明可以正常运行,但当在pycharm(或vscode)中时,却经常会出现路径错误。起初,对于这个问题,我也是一知…...
速盾:海外高防CDN有哪些优势?
海外高防CDN(Content Delivery Network)是一种通过部署分布式节点服务器来加速网站内容分发的技术,它能够提供更快速、稳定、安全的网站访问体验。相比于传统的CDN服务,海外高防CDN具有以下几个优势: 全球分布…...
OpenCV视觉分析之目标跟踪(4)目标跟踪类TrackerDaSiamRPN的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::TrackerDaSiamRPN 是 OpenCV 中用于目标跟踪的一个类,它实现了 DaSiam RPN(Deformable Siamese Region Proposal Net…...
自动对焦爬山算法原理
自动对焦爬山算法原理可以归纳为以下几个关键步骤: (1)初始化: 爬山算法从一个随机或预设的初始位置开始,这个位置代表了镜头的初始焦距。 (2)清晰度评价: 算法首先在当前焦距下捕…...
Hyperledger Fabric有那些核心技术,和其他区块链对比Hyperledger Fabric有那些优势
Hyperledger Fabric是一个模块化、权限化的企业级区块链平台,与比特币、以太坊等公有链相比,Fabric主要为私有链或联盟链设计,适用于企业应用。它包含多项核心技术,使其在企业级区块链应用中具有独特优势。以下是Fabric的核心技术…...
「Mac畅玩鸿蒙与硬件8」鸿蒙开发环境配置篇8 - 应用依赖与资源管理
本篇将介绍如何在 HarmonyOS 项目中高效管理资源文件和依赖,以确保代码结构清晰并提升应用性能。资源管理涉及图片、字符串、多语言文件等,通过优化文件加载和依赖管理,可以显著提升项目的加载速度和运行效率。 关键词 资源管理应用依赖优化…...
【Gorm】传统sql的增删查改,通过go去操作sql
MySQL中的建库,建表,删库,删表,添加记录,查询,删除记录,更新记录这些命令是一定要回的,就算我们脱离 orm 这些,也能直接连接上数据库进行操作。 一、数据库的操作 # 查…...
HTML小阶段二维表和思维导图
下面是对标签、元素、属性的对比二维表,通过对比3w1h(what是什么、where用在哪、why为什么要用、how如何用)来学习区分学习标签、元素、属性 标签 元素 属性 what (Tags)标签是用来标记内容块或标明元素内容意义 …...
AI与低代码的碰撞:企业数字化转型的新引擎
引言 在当今的商业环境中,企业数字化转型已从选择题变成了必答题。面对日益复杂的市场竞争和不断变化的客户需求,传统的开发模式常常显得力不从心——开发周期冗长、技术门槛高、成本居高不下,企业很难快速响应市场变化。而在这种背景下&…...
HarmonyOS应用开发者基础认证——初级闯关习题参考答案大全
相关文章 HarmonyOS应用开发者中级认证——中级闯关习题参考答案大全 HarmonyOS应用开发者高级认证——高级闯关习题参考答案大全 文章目录 HarmonyOS第一课 HarmonyOS介绍判断题单选题多选题 HarmonyOS第一课 DevEco Studio的使用判断题单选题多选题 HarmonyOS第一课 ArkTS语法…...
Vue背景图片自适应大屏与小屏
1,父绝子相 效果是台式看的更多,笔记本看部分。但是图片不会变形 <div class"father" style"width:100%; position:relative"> <img src"test.png" class"son" style"width:1920px; position:a…...
MongoDB 8.0.3版本安装教程
MongoDB 8.0.3版本安装教程 一、下载安装 1.进入官网 2.选择社区版 3.点击下载 4.下载完成后点击安装 5.同意协议,下一步 6.选择第二个Custon,自定义安装 7.选择安装路径 !记住安装路径 8.默认,下一步 9.取…...
【C语言】预处理(预编译)详解(下)(C语言最终篇)
文章目录 一、#和##1.#运算符2.##运算符 二、预处理指令#undef三、条件编译1.单分支条件编译2.多分支条件编译3.判断符号是否被定义4.判断符号是否没有被定义 四、头文件的包含1.库头文件的包含2.本地头文件的包含3.嵌套包含头文件的解决方法使用条件编译指令使用预处理指令#pr…...
[Linux] linux 软硬链接与动静态库
标题:[Linux] linux 软硬链接与动静态库 个人主页水墨不写bug (图片来源于网络) /** _oo0oo_* o8888888o* 88" . "88* (| -_- |)* …...
别再傻傻匀速拖滑块了!用Python模拟真人鼠标轨迹,轻松过Geetest验证码
突破验证码防线:Python模拟人类行为轨迹的实战艺术 验证码系统正变得越来越智能,Geetest等平台已经能够通过分析用户行为模式来区分人类和机器。传统的匀速滑块操作在这些系统面前几乎无所遁形。本文将带你深入理解现代验证码系统的工作原理,…...
SQL注入的分类靶场实践
SQL注入的分类靶场实践 前言 SQL 注入(SQL Injection)是一种常见且危险的 Web 安全漏洞,攻击者通过在输入字段中插入恶意 SQL 代码,能够绕过应用程序的验证机制,直接操纵数据库。本文将介绍 SQL 注入的分类ÿ…...
从零构建CPWC超声成像仿真:Field II实战与模块化工作流解析
1. CPWC超声成像仿真入门指南 第一次接触CPWC超声成像仿真时,我被各种专业术语和复杂的数学公式搞得晕头转向。经过几个月的实战摸索,终于总结出一套小白也能快速上手的方法。CPWC(相干平面波复合)是近年来超声成像领域的热门技术…...
uniapp动画开发避坑指南:为什么你的json动画在真机上不显示?
Uniapp动画开发实战:解决JSON动画真机不显示的7个关键策略 在移动应用开发中,动画效果是提升用户体验的重要元素。许多Uniapp开发者选择使用JSON格式的Lottie动画来实现复杂的视觉效果,但在真机调试阶段却常常遇到动画无法显示的困扰。本文将…...
如何突破抖音内容保存限制?开源工具douyin-downloader的创新解决方案
如何突破抖音内容保存限制?开源工具douyin-downloader的创新解决方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代,抖音已成为知识传播与创意展示的重要平台。…...
CDAN不只是论文里的公式:深入浅出图解‘条件对抗’如何让领域自适应更精准
CDAN不只是论文里的公式:深入浅出图解‘条件对抗’如何让领域自适应更精准 想象你是一位冰淇淋品鉴师,需要将一家老牌店铺(源域)的配方迁移到新店铺(目标域)。传统方法粗暴混合所有原料,导致巧…...
Electron-builder打包Windows应用,我踩过的三个坑(附详细解决方案)
Electron-builder打包Windows应用:三个典型问题的深度解析与实战解决方案 第一次使用electron-builder打包Windows应用时,那种期待与焦虑交织的感觉至今记忆犹新。作为一个从Web前端转向桌面应用开发的程序员,我本以为有了Electron这个跨平台…...
智能车小白也能懂的舵机PD控制:从电感差比和到方向控制,保姆级避坑指南
智能车方向控制入门:用PD算法驯服你的舵机 第一次看到智能车在赛道上流畅过弯时,很多人都会好奇——这辆小车是如何感知赛道边界并精准控制方向的?作为电磁组智能车的核心部件,舵机就像车辆的"方向盘",而PD控…...
5分钟搞定Qwen2-7B本地部署:从GGUF下载到API调用的保姆级教程
5分钟极速部署Qwen2-7B:从模型下载到API调用的实战手册 在人工智能技术快速迭代的今天,能够在本地高效运行大语言模型已成为开发者的一项核心竞争力。Qwen2-7B作为当前最受关注的中等规模开源模型之一,以其出色的中文理解能力和适中的硬件需求…...
手把手教你用Proteus仿真51单片机与74HC164:从电路搭建到代码调试全流程
从零开始掌握Proteus仿真51单片机与74HC164的完整指南 在电子设计自动化领域,Proteus作为一款功能强大的电路仿真软件,为初学者提供了无与伦比的学习体验。特别是对于51单片机与74HC164这类经典组合的仿真学习,能够帮助工程师和学生以零成本、…...
