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

news2024/11/24 19:01:59

一、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、看下扩展运行效果: 

总结:分析完毕。

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

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

相关文章

Qt自定义控件:汽车速度表

1、功能 制作一个汽车速度表 2、实现 从外到内进行绘制&#xff0c;初始化画布&#xff0c;画渐变色外圈&#xff0c;画刻度&#xff0c;写刻度文字&#xff0c;画指针&#xff0c;画扇形&#xff0c;画内圈渐变色&#xff0c;画黑色内圈&#xff0c;写当前值 3、效果 4、源…

​Java面试经典 150 题.P13. 罗马数字转整数(012)​

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int romanToInt(String s) {int sum…

stl_stack/queue

一.适配器 stack和queue实际上并不能算是一种容器&#xff0c;而是一种容器适配器。而适配器作为stl的6大组件之一&#xff0c;其实是一种设计模式。适配器模式其实就是将一个类的接口&#xff08;该接口无法直接满足客户的需求&#xff09;转换成客户希望的另一个接口&#x…

计算机网络:网络层 —— 虚拟专用网 VPN

文章目录 虚拟专用网 VPN 概述内联网 VPN外联网 VPN 虚拟专用网 VPN 概述 虚拟专用网&#xff08;Virtual Private Network&#xff0c;VPN&#xff09;&#xff1a;利用公用的因特网作为本机构各专用网之间的通信载体&#xff0c;这样形成的网络又称为虚拟专用网。 出于安全…

SSM酒店预订住宿管理系统-计算机毕业设计源码01085

摘要 随着互联网和移动技术的快速发展&#xff0c;酒店行业也面临着巨大的变革和机遇。传统的酒店管理方式存在着信息不透明、预订流程繁琐等问题&#xff0c;无法满足现代消费者对便捷、高效、个性化服务的需求。因此&#xff0c;开发酒店预订住宿管理系统具有重要的意义。本文…

STM32CubeMX学习(三) SPI+DMA通信

STM32CubeMX学习&#xff08;三&#xff09; SPIDMA通信 一、简介二、新建STM32CubeMX项目并使用外部时钟三、SPI3配置四、相关代码五、测试 一、简介 本文将基于STM32F103RCT芯片介绍如何在STM32CubeMXKEIL5开发环境下进行SPIDMA通信。 操作系统&#xff1a;WIN10 x64硬件电…

LLaMA系列一直在假装开源...

伙伴们&#xff0c;很奇怪~ 关于LLM的开源与闭源模型的竞争又开始愈发激烈。 众所周知&#xff0c;开源模型以其开放性和社区驱动的特点受到一部分用户的青睐&#xff0c;而闭源模型则因其专业性和性能优化被广泛应用于商业领域。由于大模型最近2年的突然兴起&#xff0c;开源…

C语言 核心语法2

时间&#xff1a;2024.11.1 一、学习内容 1、计算机的存储规则 1.1存储规则 视频是图片和声音的结合体。 在计算机中&#xff0c;任意数据都是以二进制的形式进行存储的。 在计算机中&#xff0c;二进制可以表示万事万物。 1.2十进制 1.3二进制的运算过程 1.4文本存储 …

客户端与微服务之间的桥梁---网关

当我们创建好了N多个微服务或者微服务的实例之后&#xff0c;每个服务暴露出不同的端口地址&#xff0c;一般对于客户端请求&#xff0c;只需要请求一个端口&#xff0c;要隔离客户端和微服务的直接关系&#xff0c;保证微服务的安全性和灵活性&#xff0c;避免敏感信息的泄露。…

萤石设备视频接入平台EasyCVR私有化部署视频平台高速公路视频上云的高效解决方案

经济的迅猛发展带来了高速公路使用频率的激增&#xff0c;其封闭、立交和高速的特性变得更加显著。然而&#xff0c;传统的人工巡查方式已不足以应对当前高速公路的监控挑战&#xff0c;监控盲点和响应速度慢成为突出问题。比如&#xff0c;非法占用紧急车道的情况屡见不鲜&…

【论文速读】| APILOT:通过避开过时API陷阱,引导大语言模型生成安全代码

基本信息 原文标题&#xff1a;APILOT: Navigating Large Language Models to Generate Secure Code by Sidestepping Outdated API Pitfalls 原文作者&#xff1a;Weiheng Bai, Keyang Xuan, Pengxiang Huang, Qiushi Wu, Jianing Wen, Jingjing Wu, Kangjie Lu 作者单位&a…

泡泡玛特行至巅峰,又顷刻“瓦解”?

今年&#xff0c;在海外“一呼百应”的LABUBU与“老妈”泡泡玛特一同步入了潮玩时代的全新阶段。 先是LABUBU获授“神奇泰国体验官”&#xff0c;首个LABUBU主题店也落地曼谷。随后泡泡玛特也在发布三季度财报后迎来股价新高&#xff08;10月24日收盘价75.85元/股&#xff0c;…

如何看待长周期项目?

有一个客户&#xff0c;想找你做一个软件项目。你大体评估了一下&#xff0c;项目成本300万&#xff0c;项目收入400万&#xff0c;有大概100万左右的毛利。但项目的周期&#xff0c;会比较长&#xff0c;大概是3年。 你会做吗&#xff1f; 我从自己的经验和直觉来看&#x…

Flutter仿微信,高度还原,开源

Flutter仿微信开源项目&#xff0c;持续更新中 Flutter仿微信项目&#xff0c;已开源&#x1f680;&#x1f680;&#x1f680;说明效果预览开发进度说明未来计划项目结构说明组件封装示例最后持续更新中... Flutter仿微信项目&#xff0c;已开源&#x1f680;&#x1f680;&am…

HBA:基于分层激光雷达集束调整的一致性建图

文章目录 前言一、介绍二、相关工作三、方法A. 概述B. 自底向上的分层BA&#xff08;Bundle Adjustment&#xff09;C. 自顶向下位姿图优化 四. 实验A. 精度分析 前言 代码&#xff1a;github 原文&#xff1a;原文 摘要——重建准确且一致的大规模LiDAR点云地图对机器人应用至…

Docker — 跨平台和环境部署

Docker 是一个开源的容器化平台&#xff0c;通过将应用程序和其依赖打包在一个轻量级、独立的容器中&#xff0c;能够跨平台和环境部署。 1. Docker 基本概念 镜像 (Image)&#xff1a;Docker 镜像是一个只读模板&#xff0c;包含运行应用程序所需的代码、库、依赖和环境配置。…

消息队列-Rabbitmq(消息发送,消息接收)

将来我们开发业务功能的时候&#xff0c;肯定不会在控制台收发消息&#xff0c;而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议&#xff0c;因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息&#xff0c;都可以与RabbitMQ交互。并且RabbitMQ官方也提供了各种不…

一机多控无人机集群飞行控制技术详解

一机多控无人机集群飞行控制技术是指通过单一控制端或多个协同工作的控制端&#xff0c;对多架无人机进行集群管理和控制的技术。这种技术结合了通信技术、路径规划、碰撞避免、分布式与集中式控制等多个方面&#xff0c;以实现无人机集群的协同作战或完成其他特定任务。以下是…

DEVOPS: 认证与调度

概述 不知道大家有没有意识到一个现实&#xff0c;就是大部分时候&#xff0c;我们已经不像以前一样通过命令行&#xff0c;或者可视窗口来使用一个系统了现在我们上微博、或者网购&#xff0c;操作的其实不是眼前这台设备&#xff0c;而是一个又一个集群 通常&#xff0c;这样…

【鸢尾花书籍】编程不难

&#x1f4dd;本文介绍 本文为作者拜读鸢尾花书籍《编程不难》后所做的笔记&#xff0c;整理成文章&#xff0c;以供回顾 &#x1f44b;作者简介&#xff1a;一个正在积极探索的本科生 &#x1f4f1;联系方式&#xff1a;943641266(QQ) &#x1f6aa;Github地址&#xff1a;htt…