Skip to content

Chrome 扩展 API 兼容性 ​

AuroraView 提供了完整的 Chrome Extension API polyfill 层,让你可以在 WebView 应用中运行 Chrome 扩展或使用熟悉的 Chrome API。

概述 ​

Chrome Extension API 兼容层允许开发者:

  • 迁移现有 Chrome 扩展到 AuroraView,只需最小的代码改动
  • 使用熟悉的 API,如 chrome.storage、chrome.notifications 等
  • 构建跨平台应用,既可以作为 Chrome 扩展也可以作为独立应用运行
  • 利用 WXT 框架进行现代化扩展开发

支持的 API ​

核心 API(完整支持) ​

API描述主要方法
chrome.runtime扩展生命周期和消息传递sendMessage(), getManifest(), getURL()
chrome.storage持久化数据存储local.get/set(), sync.get/set(), session.get/set()
chrome.tabs标签页管理query(), create(), update(), remove()
chrome.action工具栏按钮控制setIcon(), setBadgeText(), setPopup()
chrome.notifications系统通知create(), update(), clear()
chrome.alarms定时任务create(), get(), clear()
chrome.contextMenus右键菜单create(), update(), remove()

数据与隐私 API ​

API描述主要方法
chrome.bookmarks书签管理create(), get(), search(), remove()
chrome.history浏览历史search(), addUrl(), deleteUrl()
chrome.cookiesCookie 管理get(), set(), remove(), getAll()
chrome.downloads下载管理download(), pause(), resume(), cancel()
chrome.browsingData清除浏览数据remove(), removeCache(), removeCookies()

UI 与交互 API ​

API描述主要方法
chrome.sidePanel侧边栏控制open(), setOptions(), getOptions()
chrome.omnibox地址栏集成setDefaultSuggestion(), onInputChanged
chrome.search搜索功能query()
chrome.fontSettings字体自定义getFont(), setFont(), getFontList()

系统 API ​

API描述主要方法
chrome.idle用户活动检测queryState(), setDetectionInterval()
chrome.power电源管理requestKeepAwake(), releaseKeepAwake()
chrome.tts文字转语音speak(), stop(), getVoices()
chrome.topSites最常访问网站get()

扩展管理 API ​

API描述主要方法
chrome.management扩展控制getAll(), get(), setEnabled()
chrome.sessions会话管理getRecentlyClosed(), restore()
chrome.tabGroups标签组管理get(), query(), update()
chrome.permissions权限请求request(), contains(), remove()

网络 API ​

API描述主要方法
chrome.webRequest请求拦截onBeforeRequest, onCompleted
chrome.scripting脚本注入executeScript(), insertCSS()
chrome.declarativeNetRequest声明式请求规则updateDynamicRules()

快速开始 ​

基本用法 ​

javascript
// 等待桥接就绪
window.addEventListener('auroraviewready', async () => {
    // Storage API
    await chrome.storage.local.set({ key: 'value' });
    const data = await chrome.storage.local.get('key');
    console.log(data.key); // 'value'
    
    // Notifications API
    await chrome.notifications.create('my-notification', {
        type: 'basic',
        title: '你好',
        message: '世界',
        iconUrl: 'icon.png'
    });
    
    // Alarms API
    await chrome.alarms.create('my-alarm', { delayInMinutes: 1 });
    chrome.alarms.onAlarm.addListener((alarm) => {
        console.log('闹钟触发:', alarm.name);
    });
});

Storage API 示例 ​

javascript
// 本地存储(跨会话持久化)
await chrome.storage.local.set({
    settings: { theme: 'dark', language: 'zh' },
    userData: { name: '张三', preferences: [] }
});

const { settings } = await chrome.storage.local.get('settings');
console.log(settings.theme); // 'dark'

// 监听变化
chrome.storage.onChanged.addListener((changes, areaName) => {
    for (const [key, { oldValue, newValue }] of Object.entries(changes)) {
        console.log(`${key} 从 ${oldValue} 变为 ${newValue}`);
    }
});

书签 API 示例 ​

javascript
// 创建书签
const bookmark = await chrome.bookmarks.create({
    parentId: '1', // 书签栏
    title: '我的网站',
    url: 'https://example.com'
});

// 搜索书签
const results = await chrome.bookmarks.search({ query: 'example' });

// 获取书签树
const tree = await chrome.bookmarks.getTree();

// 监听书签事件
chrome.bookmarks.onCreated.addListener((id, bookmark) => {
    console.log('新书签:', bookmark.title);
});

下载 API 示例 ​

javascript
// 开始下载
const downloadId = await chrome.downloads.download({
    url: 'https://example.com/file.pdf',
    filename: 'my-file.pdf',
    saveAs: true
});

// 监控下载进度
chrome.downloads.onChanged.addListener((delta) => {
    if (delta.state?.current === 'complete') {
        console.log('下载完成!');
    }
});

// 搜索下载记录
const downloads = await chrome.downloads.search({
    state: 'complete',
    limit: 10
});

// 暂停/恢复/取消
await chrome.downloads.pause(downloadId);
await chrome.downloads.resume(downloadId);
await chrome.downloads.cancel(downloadId);

历史记录 API 示例 ​

javascript
// 搜索历史
const historyItems = await chrome.history.search({
    text: 'github',
    startTime: Date.now() - 7 * 24 * 60 * 60 * 1000, // 最近7天
    maxResults: 100
});

// 添加 URL 到历史
await chrome.history.addUrl({ url: 'https://example.com' });

// 删除特定 URL
await chrome.history.deleteUrl({ url: 'https://example.com' });

// 清除所有历史
await chrome.history.deleteAll();
javascript
// 获取特定 cookie
const cookie = await chrome.cookies.get({
    url: 'https://example.com',
    name: 'session_id'
});

// 设置 cookie
await chrome.cookies.set({
    url: 'https://example.com',
    name: 'user_pref',
    value: 'dark_mode',
    expirationDate: Date.now() / 1000 + 86400 // 1天后过期
});

// 获取域名下所有 cookie
const cookies = await chrome.cookies.getAll({ domain: 'example.com' });

// 删除 cookie
await chrome.cookies.remove({
    url: 'https://example.com',
    name: 'session_id'
});

TTS(文字转语音)示例 ​

javascript
// 朗读文本
chrome.tts.speak('你好,世界!', {
    rate: 1.0,
    pitch: 1.0,
    volume: 1.0,
    onEvent: (event) => {
        if (event.type === 'end') {
            console.log('朗读完成');
        }
    }
});

// 获取可用语音
const voices = await chrome.tts.getVoices();
console.log('可用语音:', voices);

// 停止朗读
chrome.tts.stop();

空闲检测示例 ​

javascript
// 查询当前空闲状态
const state = await chrome.idle.queryState(60); // 60秒阈值
console.log('用户状态:', state); // 'active', 'idle', 或 'locked'

// 设置检测间隔
chrome.idle.setDetectionInterval(30);

// 监听状态变化
chrome.idle.onStateChanged.addListener((newState) => {
    console.log('空闲状态变为:', newState);
});

电源管理示例 ​

javascript
// 阻止系统休眠
chrome.power.requestKeepAwake('display'); // 保持显示器开启
// 或
chrome.power.requestKeepAwake('system'); // 阻止休眠

// 允许系统休眠
chrome.power.releaseKeepAwake();

最佳实践 ​

1. 始终等待 Ready 事件 ​

javascript
// 正确:等待桥接就绪
window.addEventListener('auroraviewready', () => {
    // 这里可以安全使用 chrome.* API
});

// 错误:立即使用 API 可能失败
chrome.storage.local.get('key'); // 可能抛出错误

2. 优雅地处理错误 ​

javascript
try {
    const result = await chrome.storage.local.get('key');
    // 处理结果
} catch (error) {
    console.error('存储错误:', error.message);
    // 降级处理
}

3. 正确使用事件监听器 ​

javascript
// 添加监听器
const handler = (changes) => {
    console.log('变化:', changes);
};
chrome.storage.onChanged.addListener(handler);

// 不再需要时移除监听器
chrome.storage.onChanged.removeListener(handler);

4. 批量存储操作 ​

javascript
// 正确:单次操作多个键
await chrome.storage.local.set({
    key1: 'value1',
    key2: 'value2',
    key3: 'value3'
});

// 错误:多次操作
await chrome.storage.local.set({ key1: 'value1' });
await chrome.storage.local.set({ key2: 'value2' });
await chrome.storage.local.set({ key3: 'value3' });

5. 清理资源 ​

javascript
// 不再需要时清理闹钟
await chrome.alarms.clear('my-alarm');

// 清除通知
await chrome.notifications.clear('my-notification');

// 移除右键菜单
await chrome.contextMenus.removeAll();

限制与差异 ​

单标签页模式 ​

AuroraView 默认运行在单标签页模式。这意味着:

  • chrome.tabs.query() 只返回当前标签页
  • chrome.tabs.create() 导航当前标签页而不是打开新标签
  • 标签页 ID 简化(通常只有 1)
javascript
// 在 AuroraView 中,这返回单元素数组
const tabs = await chrome.tabs.query({ active: true });
// tabs = [{ id: 1, url: '...', title: '...' }]

存储限制 ​

存储区域Chrome 限制AuroraView
local10 MB无限制(基于文件系统)
sync100 KB与 local 相同(无同步)
session10 MB基于内存,关闭时清除

同步存储

chrome.storage.sync 可用但不会真正跨设备同步。它的功能与 local 存储完全相同。

权限 ​

与 Chrome 扩展不同,AuroraView 不需要 manifest 权限声明。所有 API 默认可用:

javascript
// 不需要在 manifest 中声明 "permissions": ["storage", "notifications"]
// 直接使用 API 即可
await chrome.storage.local.set({ key: 'value' });
await chrome.notifications.create('id', { ... });

网络 API ​

  • chrome.webRequest 提供基本拦截但不能修改请求
  • chrome.declarativeNetRequest 规则支持有限

平台特定功能 ​

某些 API 在不同平台上表现不同:

APIWindowsmacOSLinux
chrome.tts完整完整需要 espeak
chrome.power完整完整有限
chrome.idle完整完整完整

从 Chrome 扩展迁移 ​

步骤 1:移除 Manifest 权限 ​

diff
// manifest.json(不再需要)
- {
-   "permissions": ["storage", "notifications", "alarms"]
- }

步骤 2:更新后台脚本 ​

javascript
// Chrome 扩展 background.js
chrome.runtime.onInstalled.addListener(() => {
    // 初始化代码
});

// AuroraView - 包装在 ready 事件中
window.addEventListener('auroraviewready', () => {
    // 相同的初始化代码在这里也能工作
});

步骤 3:处理标签页差异 ​

javascript
// Chrome 扩展 - 打开新标签页
chrome.tabs.create({ url: 'https://example.com' });

// AuroraView - 导航当前视图
// 方式 1:使用相同 API(导航当前标签页)
chrome.tabs.create({ url: 'https://example.com' });

// 方式 2:使用 AuroraView 原生导航
auroraview.call('navigate', { url: 'https://example.com' });

WXT 框架兼容性 ​

AuroraView 与 WXT 框架 兼容,支持现代化扩展开发:

javascript
// wxt.config.ts
export default defineConfig({
    // WXT 配置与 AuroraView 兼容
    manifest: {
        name: 'My Extension',
        version: '1.0.0'
    }
});
javascript
// entrypoints/background.ts
export default defineBackground(() => {
    // WXT 后台脚本在 AuroraView 中正常工作
    chrome.storage.local.set({ initialized: true });
});

API 参考 ​

详细 API 文档请参考:

故障排除 ​

API 不可用 ​

javascript
// 检查 API 是否可用
if (typeof chrome !== 'undefined' && chrome.storage) {
    // API 可用
} else {
    console.warn('Chrome API 不可用');
}

事件不触发 ​

javascript
// 确保在事件发生前添加监听器
window.addEventListener('auroraviewready', () => {
    // 在这里添加监听器
    chrome.storage.onChanged.addListener(handler);
    
    // 然后执行触发事件的操作
    chrome.storage.local.set({ key: 'value' });
});

存储数据不持久化 ​

javascript
// 检查存储是否正常工作
await chrome.storage.local.set({ test: 'value' });
const result = await chrome.storage.local.get('test');
console.log('存储测试:', result.test === 'value' ? '正常' : '失败');

Released under the MIT License.