为 Firefox for Android 构建 Firefox Hub 附加组件

Firefox Hub API 允许附加组件在 Firefox for Android 主页添加新的面板,用户通常在该页面上找到他们的热门网站、书签和历史记录。这些 API 在 Firefox 30 中引入,但在 Firefox 31 和 32 中有更多功能和错误修复。您已经可以在 addons.mozilla.org 上找到一些这些附加组件,并且有一些 github 上的样板代码 来帮助您入门。

image01
image00

概述

构建 Firefox Hub 附加组件主要包括两个部分:创建主页面板和存储要在该面板中显示的数据。主页面板由不同的视图组成,每个视图都显示来自给定数据集的数据。

创建新的主页面板

要创建主页面板,首先使用 Home.panels API 注册面板。register API 接受面板 ID 和一个选项回调函数作为参数。每次安装或更新面板时,都会调用此选项回调来动态生成选项对象,从而允许动态进行语言环境更改。

function optionsCallback() {
  return {
    title: "My Panel",
    views: [{
      type: Home.panels.View.LIST,
      dataset: "my.dataset@mydomain.org"
    }]
  };
}

Home.panels.register("my.panel@mydomain.org", optionsCallback);

您必须始终在启动时注册任何现有面板,但当您第一次希望面板实际上出现在用户的首页时(例如,当您的附加组件安装时),您还需要显式安装面板。

Home.panels.install("my.panel@mydomain.org");

您可以修改选项回调函数以自定义在面板中显示数据的方式。例如,您可以选择以网格或列表形式显示数据,自定义在没有可用数据时显示的视图,或者选择在用户点击其中一个项目时启动一个意图。

存储面板数据

要实际在新的主页面板中显示内容,请使用 HomeProvider API 存储数据。此 API 允许您异步保存和删除数据,以及注册回调以允许浏览器定期为您同步数据。

HomeProvider API 使您可以访问 HomeStorage 对象,您可以与这些对象交互以从给定数据集保存和删除数据。这些方法旨在与 Task.jsm 一起使用,以便在任务中执行异步事务。

let storage = HomeProvider.getStorage("my.dataset@mydomain.org");
Task.spawn(function() {
  yield storage.save(items);
}).then(null, Cu.reportError);

在 Firefox 31 中,我们扩展了 save API 以支持为您替换现有数据,这对于定期刷新数据集来说非常方便。

function refreshDataset() {
  let items = fetchItems();
  Task.spawn(function() {
        yield storage.save(items, { replace: true });
  }).then(null, Cu.reportError);
}

HomeProvider.addPeriodicSync("my.dataset@mydomain.org", 3600,
refreshDataset);

此代码片段将确保每 3600 秒(1 小时)刷新一次数据集。

Firefox 32 Beta 中的新功能

除了错误修复之外,Firefox 32 还为 Firefox Hub API 添加了一些新功能。

刷新处理程序

除了支持定期更新数据之外,我们还添加了对“下拉刷新”的支持,这使用户能够手动刷新面板数据。要利用此功能,可以在视图声明中添加 onrefresh 属性。

function optionsCallback() {
  return {
    title: "My Panel",
    views: [{
      type: Home.panels.View.LIST,
      dataset: "my.dataset@mydomain.org",
      onrefresh: refreshDataset
    }]
  };
}

添加此新行后,在面板上向下滑动将触发一个刷新指示器并调用 refreshDataset 函数。在对该数据集进行保存调用后,刷新指示器将消失。

身份验证视图

我们添加了对身份验证视图的支持,以使您的附加组件更容易使用需要身份验证的数据。此视图包括文本和图像的空间,以及一个触发身份验证流程的按钮。要使用此功能,可以在面板声明中添加 auth 属性。

function optionsCallback() {
  return {
    title: "My Panel",
    views: [{
      type: Home.panels.View.LIST,
      dataset: "my.dataset@mydomain.org"
    }],
    auth: {
     authenticate: function authenticate() {
        // … do some stuff to authenticate the user …
       Home.panels.setAuthenticated("my.panel@mydomain.org", true);
     },
     messageText: "Please log in to see your data",
     buttonText: "Log in"
   }
  };
}

默认情况下,身份验证视图将在面板首次安装时出现,并且当用户点击视图中的按钮时将调用 authenticate 函数。由您决定在用户成功完成身份验证流程时调用 setAuthenticated(true),并且您也可以在用户未经身份验证时调用 setAuthenticated(false)。此身份验证状态将在应用程序运行之间持续存在,因此如果您需要重置它,则由您负责。

未来工作

我们有一些关于如何扩展这些 API 的想法,但如果您想看到任何东西,请告诉我们!我们也一直在寻找新的 Firefox for Android 贡献者,我们很乐意帮助您 开始编写补丁.

关于 Margaret Leibovic

Margaret 是 Mozilla Firefox for Android 团队的开发者。她热爱网络、开源以及帮助人们参与 Mozilla。您可以在 IRC 上找到她,她的用户名是 margaret。

更多 Margaret Leibovic 的文章...

关于 Chris Heilmann

HTML5 和开放网络的布道者。让我们一起解决这个问题!

更多 Chris Heilmann 的文章...


4 条评论

  1. pd

    不幸的是,除非我弄错了,否则 Firefox 在 Android 上几乎没有市场份额。即使是糟糕的“Android 浏览器”仍然拥有很多份额,但 Firefox 却没有。

    我个人在 Android 上使用 Firefox 时遇到了一些烦人的 bug,这表明人们不使用它是有原因的。例如,有一种情况是网页根本不显示任何内容。选项卡列表上有该页面的缩略图,但选择该“选项卡”却完全显示为白色背景,没有任何内容。即使重新加载页面也无法解决此问题。

    然后是 Android 上的 Firefox 在升级时会销毁会话并清除主屏幕书签收藏夹图标,并将它们替换为 Firefox 图标。真棒!

    此外,从列表中关闭实际上不想关闭的选项卡太容易了,而且没有用于撤消此操作的视觉 UI,不过我想至少您可以在笨拙地打开一个新选项卡、输入某种字符串并将其显示在历史记录中之后找到相同的选项卡/页面。

    总而言之,体验并不好。

    Mozilla 正在做些什么来迫使 Google 允许其他浏览器访问 Android 主屏幕“电话 | 联系人 | 消息 | ... | 应用”部分中的“互联网”快捷方式?这与 Microsoft 以前在 Windows 上针对 Internet Explorer 的反竞争优惠待遇相似,但更糟糕。抱怨开发人员在为移动设备编写网页时使用准标准的 webkit CSS 选择器前缀是毫无意义的,因为这两个移动平台上都没有非 webkit 浏览器?也许应该少投入一些资源/关注度来征服第三世界智能手机的市场份额,而多投入一些资源/关注度来影响第一世界浏览器市场份额?

    最后对我的 Android 设备进行了 root 操作,至少我可以从我的手机中删除可怕的“Android 浏览器”,包括主屏幕底部的快捷方式!:) 不幸的是,每次 Firefox 太多 bug 时,我现在都不得不使用 Chrome。

    2014 年 7 月 25 日 上午 03:02

    1. Robert Nyman [编辑]

      据我所知,Firefox 是 Google Play 商店中评价最高的 Web 浏览器,拥有超过一百万次投票。也就是说,我们自然认为在 Android 上覆盖更多用户是一件好事。

      不过,这篇文章专门介绍了在 Android 上的 Firefox 中为首页构建面板,因此我想在这里的评论应与主题保持一致。

      如果您在 Android 上的 Firefox 中遇到任何 bug,请与 Android 上的 Firefox 支持 联系,并/或为 Android 上的 Firefox 提交 bug。

      2014 年 7 月 25 日 上午 10:38

  2. Hu

    如果有一个适用于所有 Firefox(桌面、Android 等)的通用 API,那么我们可以编写一次这些面板,并且它们可以在任何地方运行,这将很有趣。在桌面版 Firefox 上打开新选项卡时,如果可以拥有此 Firefox Hub,那将非常棒。

    2014 年 7 月 27 日 上午 02:15

    1. Margaret Leibovic

      是的,那将非常有趣!我们开始将此作为 Android 上的实验性功能进行开发,但我们肯定有兴趣与桌面团队合作,将类似的支持添加到桌面版 Firefox 中。

      与此同时,我认为有人可以编写一个 shim 库,为桌面版 Firefox 添加对这些 API 的支持。我认为这将是对桌面版 Firefox 附加组件黑客来说一项有趣的练习,因为您只需要实现自己的 Home.jsm 和 HomeProvider.jsm 即可。

      2014 年 7 月 28 日 上午 07:35

本文的评论已关闭。