首页 > 编程语言 >Chromium 中chrome.topSites扩展接口定义c++

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

时间:2024-11-01 18:20:37浏览次数:3  
标签:chrome top topSites sites c++ url TopSitesGetFunction

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

总结:分析完毕。

标签:chrome,top,topSites,sites,c++,url,TopSitesGetFunction
From: https://blog.csdn.net/jangdong/article/details/143311486

相关文章

  • 06程序IPO模式与C++顺序结构
    一、程序IPO模式编程IPO是指输入、处理和输出(Input,Process,Output)的概念。在计算机编程中,IPO是一种常用的设计模式,用于描述程序的基本流程。具体来说,IPO指的是程序从接受输入数据开始,经过一系列处理计算,最终产生输出结果的过程。IPO模式的组成部分:-输入(Input):在这个阶段......
  • 复合结构(C++ Primer)
    复合结构(C++Primer)使用结构体和string使用结构体示例代码:#include<iostream>#include<string>usingnamespacestd;structperson{stringfn;stringsn;chargrade;intage;};intmain(){person*a=newperson;cout<<"what......
  • 【C++】——高效构建与优化二叉搜索树
    活着就意味必须要做点什么,请好好努力。——村上春树《地下》目录1、二叉搜索树BST1.1什么是二叉搜索树1.2BST的性能功能分析2、二叉搜索树的实现2.1BST框架2.2BST插入2.3BST搜索2.4BST删除2.5BST细节问题3、二叉搜索树遍历3.1中序遍历3.2前序遍历3.3......
  • UEC++中的GetClass和StaticClass函数
    GetClass()用途:GetClass() 是 UObject 类的一个实例方法,用于获取调用它的对象的类信息。返回类型:返回 UClass*,即指向调用对象的类的 UClass 对象的指针。使用场景:当你有一个 UObject 或其子类的实例,并且想要获取这个实例所属类的信息时,你会使用 GetClass()。例......
  • UEC++ UClass类
    一、UClass的定义与功能UClass是虚幻引擎中实现反射机制的关键部分,它允许引擎在运行时动态地查询和操作类的信息。每个UClass都保留了一个称作“类默认对象(ClassDefaultObject,简称CDO)”的模板对象,这个对象由类的构造函数生成,并且之后不会被修改。UClass和CDO都可以为特定对......
  • 题解 洛谷 Luogu P1308 [NOIP2011 普及组] 统计单词数 C++
    题目传送门:P1308[NOIP2011普及组]统计单词数-洛谷|计算机科学教育新生态https://www.luogu.com.cn/problem/P1308getline() 会清除使当次getline() 终止的换行,而cin 不会因此cin 以换行终止,之后还需要getline()的话,需要用getchar() 吞换行Linux的一些相......
  • 为什么 C++ 编译速度比 Java 慢得多
    ###为什么C++编译速度比Java慢得多在探讨为什么C++编译速度比Java慢得多时,我们可以归纳出几个核心原因:C++的编译模型更为复杂、模板元编程、宏处理以及链接时间。其中,C++的编译模型更为复杂这一点尤为突出。C++需要处理的细节更多,如模板实例化、头文件的重复包含等,这些......
  • 【C++】string 类模拟实现:深入探索字符串操作原理
     快来参与讨论......
  • C++11的一些语法
    vector的用法在C++中,std::vector是一个动态数组,它可以在运行时调整大小,std::vector是C++标准模板库(STL)中的一个重要容器类。基本用法在使用std::vector之前,需要包含头文件<vector>。#include<iostream>#include<vector>当然,现在包含万能头<bits/stdc++.h>......
  • 【C++】智能指针的正确使用方式
    本文将从这几方面讲解智能指针:智能指针的应用场景分析智能指针的性能分析:为什么shared_ptr性能比unique_ptr差指针作为函数参数时应该传,传值、传引用,还是裸指针?对于智能指针的使用,实际上是对所有权和生命周期的思考1.unique_ptr:专属所有权1.1unique_ptr介绍我们大......