Chromium 中chrome.topSites扩展接口定义c++

一、chrome.topSites

使用 chrome.topSites API 访问新标签页上显示的热门网站(即最常访问的网站)。不包括用户自定义的快捷方式。

权限

topSites

您必须声明“topSites”扩展程序清单中授予使用此 API 的权限。

{
  "name": "My extension",
  ...
  "permissions": [
    "topSites",
  ],
  ...
}

示例

若要试用此 API,请安装 chrome-extension-samples 中的 topSites API 示例 存储库

类型

MostVisitedURL

用于封装最常访问的网址(例如新标签页上的默认快捷方式)的对象。

属性
  • 标题

    字符串

    网页的标题

  • 网址

    字符串

    最常访问的网址。

方法

get()

<ph type="x-smartling-placeholder"></ph> 承诺

chrome.topSites.get(
  callback?: function,
)

获取热门网站列表。

api更多介绍参考:chrome.topSites  |  API  |  Chrome for Developers

二、top_sites.json接口定义:

chrome\common\extensions\api\top_sites.json

// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

[
  {
    "namespace": "topSites",
    "description": "Use the <code>chrome.topSites</code> API to access the top sites (i.e. most visited sites) that are displayed on the new tab page. These do not include shortcuts customized by the user.",
    "types": [
      {
        "id": "MostVisitedURL",
        "type": "object",
        "description": "An object encapsulating a most visited URL, such as the default shortcuts on the new tab page.",
        "properties": {
          "url": {"type": "string", "description": "The most visited URL."},
          "title": {"type": "string", "description": "The title of the page"}
        }
      }
    ],
    "functions": [
      {
        "name": "get",
        "type": "function",
        "description": "Gets a list of top sites.",
        "parameters": [],
        "returns_async": {
          "name": "callback",
          "parameters": [
            {
              "type": "array",
              "name": "data",
              "items": {"$ref": "MostVisitedURL"}
            }
          ]
        }
      }
    ]
  }
]

 out\Debug\gen\chrome\common\extensions\api\generated_schemas.cc

constexpr char kTopSites[] = R
"R({"namespace":"topSites","types":[{"id":"topSites.MostVisitedURL","type":"object","properties":
{"url":{"type":"string"},"title":{"type":"string"}}}],
"functions":[{"name":"get","type":"function","parameters":[],"returns_async":{"name":"callback","parameters":[{"type":"array","name":"data","items":{"$ref":"topSites.MostVisitedURL"}}]}}]})R";

三、top_sites_api定义:

chrome\browser\extensions\api\top_sites\top_sites_api.h

chrome\browser\extensions\api\top_sites\top_sites_api.cc

namespace extensions {

class TopSitesGetFunction : public ExtensionFunction {
 public:
  DECLARE_EXTENSION_FUNCTION("topSites.get", TOPSITES_GET)

  TopSitesGetFunction();

 protected:
  ~TopSitesGetFunction() override;

  // ExtensionFunction:
  ResponseAction Run() override;

 private:
  void OnMostVisitedURLsAvailable(const history::MostVisitedURLList& data);
};

}  // namespace extensions

namespace extensions {

TopSitesGetFunction::TopSitesGetFunction() = default;
TopSitesGetFunction::~TopSitesGetFunction() = default;

ExtensionFunction::ResponseAction TopSitesGetFunction::Run() {
  scoped_refptr<history::TopSites> ts = TopSitesFactory::GetForProfile(
      Profile::FromBrowserContext(browser_context()));
  if (!ts)
    return RespondNow(Error(kUnknownErrorDoNotUse));

  ts->GetMostVisitedURLs(
      base::BindOnce(&TopSitesGetFunction::OnMostVisitedURLsAvailable, this));

  // GetMostVisitedURLs() will invoke the callback synchronously if the URLs are
  // already populated.
  return did_respond() ? AlreadyResponded() : RespondLater();
}

void TopSitesGetFunction::OnMostVisitedURLsAvailable(
    const history::MostVisitedURLList& data) {
  base::Value::List pages_value;
  for (const auto& url : data) {
    if (!url.url.is_empty()) {
      base::Value::Dict page_value;
      page_value.Set("url", url.url.spec());
      if (url.title.empty()) {
        page_value.Set("title", url.url.spec());
      } else {
        page_value.Set("title", url.title);
      }
      pages_value.Append(std::move(page_value));
    }
  }

  Respond(WithArguments(std::move(pages_value)));
}

}  // namespace extensions

四、chrome.topSites.get数据源介绍:

1、GetMostVisitedURLs函数具体定义在

components\history\core\browser\top_sites_impl.h

components\history\core\browser\top_sites_impl.cc

  // Initializes TopSitesImpl.
  void Init(const base::FilePath& db_name);

  // TopSites implementation.
  void GetMostVisitedURLs(GetMostVisitedURLsCallback callback) override;


// WARNING: this function may be invoked on any thread.
void TopSitesImpl::GetMostVisitedURLs(GetMostVisitedURLsCallback callback) {
  MostVisitedURLList filtered_urls;
  {
    base::AutoLock lock(lock_);
    if (!loaded_) {
      // A request came in before we finished loading. Store the callback and
      // we'll run it on current thread when we finish loading.
      pending_callbacks_.push_back(base::BindOnce(
          &RunOrPostGetMostVisitedURLsCallback,
          base::RetainedRef(base::SingleThreadTaskRunner::GetCurrentDefault()),
          std::move(callback)));
      return;
    }
    filtered_urls = thread_safe_cache_;
  }
  std::move(callback).Run(filtered_urls);
}

2、topSites数据库操作类:

components\history\core\browser\top_sites_backend.h

components\history\core\browser\top_sites_backend.cc

3、topSites数据库初始化类:

components\history\core\browser\top_sites_database.h

components\history\core\browser\top_sites_database.cc

截取数据库表初始化代码:

bool InitTables(sql::Database* db) {
  static constexpr char kTopSitesSql[] =
      "CREATE TABLE IF NOT EXISTS top_sites("
      "url TEXT NOT NULL PRIMARY KEY,"
      "url_rank INTEGER NOT NULL,"
      "title TEXT NOT NULL)";
  return db->Execute(kTopSitesSql);
}

4、topSites数据库存储位置:

  C:\Users\Administrator\AppData\Local\Chromium\User Data\Default\Top Sites

数据库表定义如下:

五、加载扩展看下堆栈:

1、chrome.topSites.get->TopSitesGetFunction::Run

2、TopSitesImpl::GetMostVisitedURLs

3、TopSitesGetFunction::OnMostVisitedURLsAvailable 

    调用 Respond(WithArguments(std::move(pages_value))); 将返回的history::MostVisitedURLList& data数据回调给扩展。

4、看下扩展运行效果: 

总结:分析完毕。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905927.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网设备如何助力实现高效远程老人监护

在发达国家&#xff0c;老龄化进程加速&#xff0c;老年人常需医疗、行动辅助、安全保障及个人卫生护理&#xff0c;费用高昂。传统老人监护依赖护士或助理现场照料&#xff0c;而物联网远程监控方案能有效改进此模式。它通过运用传感器等技术&#xff0c;实现全天候低成本实时…

NPM 包开发与优化全面指南

前言 Hey, 我是 Immerse系列文章首发于【Immerse】&#xff0c;更多内容请关注该网站转载说明&#xff1a;转载请注明原文出处及版权声明&#xff01; 1. 理解 NPM 包的结构 1.1 package.json 文件&#xff1a;包的核心 package.json文件是 NPM 包的中央配置&#xff0c;定…

基于redis实现延迟队列

Redis实现延时队列 延时队列里装的主要是延时任务&#xff0c;用延时队列来维护延时任务的执行时间。 1、延时队列有哪些使用情景&#xff1f; 1、如果请求加锁没加成功 可以将这个请求扔到延时队列里&#xff0c;延后处理。 2、业务中有延时任务的需要 比如说&#xff0…

探索Python安全字符串处理的奥秘:MarkupSafe库揭秘

文章目录 探索Python安全字符串处理的奥秘&#xff1a;MarkupSafe库揭秘第一部分&#xff1a;背景介绍第二部分&#xff1a;MarkupSafe是什么&#xff1f;第三部分&#xff1a;如何安装MarkupSafe&#xff1f;第四部分&#xff1a;MarkupSafe的简单使用方法1. 使用escape函数2.…

Docker(一):Docker简介及安装

目录 1 Docker简介1.1 容器跟虚拟机的区别1、虚拟机是什么2、容器是什么3、容器和虚拟机的区别 1.2 为什么要学习容器1.3 Docker 是什么 2 Docker安装2.1 安装docker-centos71、环境初始化2、安装docker-ce3、配置docker镜像加速器 2.2 安装docker-ubuntu22.041、安装2、添加镜…

scp免密传输教程

scp免密传输教程 为了在使用 scp 命令时不需要输入密码&#xff0c;通常的做法是通过设置 SSH 公钥认证来实现。这种方法不仅避免了每次都要输入密码的麻烦&#xff0c;而且也更加安全。下面是如何设置 SSH 公钥认证的步骤&#xff1a; 1. 生成 SSH 密钥对&#xff08;如果你…

使用Postman发送POST请求的指南

作为一名软件测试工程师&#xff0c;掌握如何使用Postman发送POST请求是非常重要的技能。POST请求通常用于向服务器发送数据&#xff0c;以创建或更新资源。本文将详细介绍如何在Postman中发送POST请求&#xff0c;帮助你高效地进行接口测试。 什么是POST请求&#xff1f; PO…

<项目代码>YOLOv8 猫狗识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

auto占位符(C++11~C++17)

文章目录 1. 定义1.1 注意事项 2. 推导规则3. 返回类型推导(C14)4. lambda表达式中使用auto类型推导5. 非类型模板形参占位符&#xff08;C17&#xff09; 1. 定义 在C11以前&#xff0c;auto关键字是用来声明自动变量的。从C11起auto被用来&#xff1a;声明变量时根据初始化表…

栈虚拟机和寄存器虚拟机,有什么不同?

本来这节内容是打算直接讲字节码指令的&#xff0c;但讲之前又必须得先讲指令集架构&#xff0c;而指令集架构又分为两种&#xff0c;一种是基于栈的&#xff0c;一种是基于寄存器的。 那不妨我们这节就单独来讲讲栈虚拟机和寄存器虚拟机&#xff0c;它们有什么不同&#xff0…

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143388189 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ground…

vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了

Vxe UI vue vxe-table v4.8 与 v3.10 解决了老版本虚拟滚动不支持动态行高的问题&#xff0c;重构了虚拟渲染&#xff0c;渲染性能大幅提升了&#xff0c;行高自适应和列宽拖动都支持&#xff0c;大幅降低虚拟渲染过程中的滚动白屏&#xff0c;大量数据列表滚动更加流畅。 自适…

Docker | 将本地项目发布到阿里云的实现流程

发布到阿里云 本地镜像发布到阿里云流程具体流程1. docker commit 生成新镜像文件2. 查看镜像3. 阿里云开发者平台选择控制台&#xff0c;进入容器镜像服务&#xff0c;选择个人实例创建命名空间仓库名称进入管理界面获得脚本推送到阿里云 补充&#xff1a; docker tag 命令基本…

龙迅#LT8668EX显示器图像处理芯片 适用于HDMI1.4+VGA转4PORT LVDS,支持4K30HZ分辨率,可做OSD菜单亮度调节!

1. 一般说明 LT8668EX 是 Lontium 的第二代 LCD 控制器&#xff0c;基于 ClearEdge 技术&#xff0c;支持 VGA 接口和 HDMI 接口&#xff0c;符合 HDMI 1.4 规范。它可以支持带 HDMI 接口的双模 DP。为了向后兼容&#xff0c;该 LCD 控制器还包括一个高性能模拟接口&#xff0…

如何在Linux系统中使用Apache HTTP Server

如何在Linux系统中使用Apache HTTP Server Apache简介 安装Apache 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 启动Apache服务 验证Apache是否正在运行 访问Apache默认页面 配置Apache虚拟主机 创建虚拟主机配置文件 示例虚拟主机配置 创建网站根目录 准备静态网站内…

【大模型开发指南】llamaindex配置deepseek、jina embedding及chromadb实现本地RAG及知识库(win系统、CPU适配)

说一些坑&#xff0c;本来之前准备用milvus&#xff0c;但是发现win搞不了&#xff08;docker都配好了&#xff09;。然后转头搞chromadb。这里面还有就是embedding一般都是本地部署&#xff0c;但我电脑是cpu的没法玩&#xff0c;我就选了jina的embedding性能较优&#xff08;…

拔得头筹 | 怿星科技斩获第四届“乌镇杯”高层次人才创业创新大赛一等奖

10月31日&#xff0c;第四届“乌镇杯”高层次人才创业创新大赛总决赛在桐乡市隆重举行&#xff0c;怿星科技“智能汽车软件研发测试工具链”项目成功入围总决赛&#xff0c;并荣获“人工智能”赛道一等奖。 本次大赛以“e城桐创智领未来”为主题&#xff0c;围绕桐乡市重点产业…

鸢尾博客项目总结

1.博客介绍 鸢尾博客是一个基于Spring BootVue3 TypeScript ViteJavaFx的客户端和服务器端的博客系统。项目采用前端与后端分离&#xff0c;支持移动端自适应&#xff0c;配有完备的前台和后台管理功能。后端使用Sa-Token进行权限管理,支持动态菜单权限&#xff0c;服务健康…

Installshield 总是跳出 Activation 激活对话框,而且创建项目失败

今天打开InstallShield &#xff0c;总是出现这个对话框&#xff0c;而且输入序列号后&#xff0c;虽然现实激活&#xff0c;但是无论打开原来的项目&#xff0c;还是新建项目都是失败。 解决方法&#xff1a; 一直没有思路&#xff0c;后来&#xff0c;使用管理员打开VS&#…

TLV320AIC3104IRHBR 数据手册 一款低功耗立体声音频编解码器 立体声耳机放大器芯片麦克风

TLV320AIC3104 是一款低功耗立体声音频编解码器&#xff0c;具有立体声耳机放大器以及在单端或全差分配置下可编程的多个输入和输出。该器件包括基于寄存器的全面电源控制&#xff0c;可实现立体声 48kHz DAC 回放&#xff0c;在 3.3V 模拟电源电压下的功耗低至 14mW&#xff0…