onSelectionChanged,onActiveChanged和onActivated之间有什么区别?

时间:2012-04-06 01:17:33

标签: google-chrome-extension deprecated

  1. Documentation onActivated 描述为:chrome.tabs.onActivated.addListener(function(object activeInfo) {...});

      

    窗口中的活动标签更改时触发。 [...]

  2. 作为对another question自己答案的评论,@ RobW说:

      

    正确的方法是   chrome.tabs.onActiveChanged,具有与之相同的签名   不存在的chrome.tabs.onActivated。

  3. 最后,a sample extension使用 onSelectionChanged ,似乎是出于同样的目的:

    chrome.tabs.onSelectionChanged.addListener(function(tabId) {
      lastTabId = tabId;
      chrome.pageAction.show(lastTabId);
    });
    
  4. onSelectionChanged onActiveChanged 之间的区别是什么?为什么 onSelectionChanged 没有文档? I 应该用什么来收听标签更改?

1 个答案:

答案 0 :(得分:3)

您应该使用onActivated(仅限Chrome 18+)来监听标签更改。 onActivatedonSelectionChanged是不推荐使用的事件。

在源代码中(参见附件),这些事件的目的及其用法。我已经用一个小型演示更新了my previous answer,以便澄清。

这是source code的相关部分,突出显示了值得注意的部分:

  void ExtensionBrowserEventRouter::ActiveTabChanged(
    TabContentsWrapper* old_contents,
    TabContentsWrapper* new_contents,
    int index,
    bool user_gesture) {
  ListValue args;
  int tab_id = ExtensionTabUtil::GetTabId(new_contents->web_contents());
  args.Append(Value::CreateIntegerValue(tab_id));

  DictionaryValue* object_args = new DictionaryValue();
  object_args->Set(tab_keys::kWindowIdKey, Value::CreateIntegerValue(
      ExtensionTabUtil::GetWindowIdOfTab(new_contents->web_contents())));
  args.Append(object_args);

  // The onActivated event replaced onActiveChanged and onSelectionChanged. The
  // deprecated events take two arguments: tabId, {windowId}.
  std::string old_json_args;
  base::JSONWriter::Write(&args, &old_json_args);

  // The onActivated event takes one argument: {windowId, tabId}.
  std::string new_json_args;
  args.Remove(0, NULL);
  object_args->Set(tab_keys::kTabIdKey, Value::CreateIntegerValue(tab_id));
  base::JSONWriter::Write(&args, &new_json_args);

  Profile* profile = new_contents->profile();
  DispatchEvent(profile, events::kOnTabSelectionChanged, old_json_args);
  DispatchEvent(profile, events::kOnTabActiveChanged, old_json_args);
  DispatchEvent(profile, events::kOnTabActivated, new_json_args);
}