Skip to content

[FEATURE] support local files tracking for FF in background.js #628

@realSilasYang

Description

@realSilasYang

非常喜欢您的插件,可视化效果做得太漂亮了!不过,设置中说火狐不支持统计本地文件阅读时间,这让它的功能对我来说缺失了重要一环。我问了问ChatGPT,也许能供您参考?

下面我用 Firefox / WebExtensions(Manifest V2/MV3 通用) 的角度,给你说明能做到什么、做不到什么、以及可行的实现方案
你想做的事情分两部分:

  1. 读取用户在浏览器中打开的本地文件名(file:/// 路径)
  2. 统计每个标签页的浏览时间

一、能否读取本地文件名?

结论:可以,但只限于你能访问到 tab.url,并且用户必须手动授予 Host 权限。

Firefox 对 file:// 有额外保护,扩展 默认不能访问本地文件的 URL
你必须要求用户启用:

about:config → privacy.file_unique_origin = false

⚠️ 但更推荐、更标准的做法是:让用户手动授予扩展 file:// 权限*:

"permissions": ["tabs"],
"host_permissions": [
  "file:///*"
]

然后要用户去扩展详情 → 权限 → “允许访问文件 URL”。

获取文件名示例

browser.tabs.query({}).then(tabs => {
    tabs.forEach(t => {
        if (t.url.startsWith("file://")) {
            console.log("本地文件路径:", t.url);
        }
    });
});

这就能得到类似:

file:///C:/Users/.../example.pdf
file:///D:/books/a.html

二、如何统计浏览时间?

核心原则

浏览时间=某标签页在前台停留的时长。

关键事件有:

  • tabs.onActivated(前台标签变化)
  • windows.onFocusChanged(浏览器失焦/获焦)
  • tabs.onUpdated(URL改变时重置计时)

最小可运行示例(后台脚本 background.js)

let activeTabId = null;
let activeStart = null;
let stats = {}; // tabId → milliseconds

function startTiming(tabId) {
    activeTabId = tabId;
    activeStart = Date.now();
}

function stopTiming() {
    if (activeTabId !== null && activeStart !== null) {
        const duration = Date.now() - activeStart;
        stats[activeTabId] = (stats[activeTabId] || 0) + duration;
        console.log(`Tab ${activeTabId} 浏览时间累计:${stats[activeTabId]} ms`);
    }
    activeTabId = null;
    activeStart = null;
}

// 切换活动标签
browser.tabs.onActivated.addListener(activeInfo => {
    stopTiming();
    startTiming(activeInfo.tabId);
});

// 浏览器窗口是否聚焦
browser.windows.onFocusChanged.addListener(windowId => {
    if (windowId === browser.windows.WINDOW_ID_NONE) {
        stopTiming(); // 失焦
    } else {
        browser.tabs.query({ active: true, windowId }).then(tabs => {
            if (tabs[0]) startTiming(tabs[0].id);
        });
    }
});

// 当页面刷新/导航时
browser.tabs.onUpdated.addListener((tabId, changeInfo) => {
    if (changeInfo.status === "loading" && tabId === activeTabId) {
        stopTiming();
        startTiming(tabId);
    }
});

三、如何确保只统计 PDF/HTML 的本地文件?

判断扩展的条件是 url:

if (url.startsWith("file://") && (url.endsWith(".pdf") || url.endsWith(".html"))) {
    // 可以记录
}

四、你要做的扩展需要哪些权限?

{
  "manifest_version": 3,
  "name": "Local File Usage Stats",
  "version": "1.0",
  "permissions": ["tabs", "storage"],
  "host_permissions": [
    "file:///*"
  ],
  "background": {
    "service_worker": "background.js"
  }
}

用户必须手动点 “允许访问文件 URL”,否则扩展无法读取本地文件路径。


五、注意:不能读取真实文件内容,只能看到路径

Firefox 扩展 不能访问真实磁盘内容,不能读取 PDF 内容,只能得到:

  • URL(即 file:// 路径)
  • tab.title(如果有)

这样不会自动泄露敏感数据,也符合法律要求。


六、完整流程总结

  1. 扩展声明 tabsfile:///* host 权限
  2. 让用户手动开启“允许访问文件 URL”
  3. 后台脚本监听页面激活与焦点变化,计算浏览时间
  4. 通过 tab.url 获取本地文件路径
  5. 把统计数据存到 browser.storage.local

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions