chrome插件API协议(Extensions Context Menu API Proposal)

简介: Extensions Context Menu API Proposal NOTE: This document is now out of date. The API evolved some while behind the experimental flag, and is becoming fully supported in chrome 6.

Extensions Context Menu API Proposal


NOTE: This document is now out of date. The API evolved some while behind the experimental flag, and is becoming fully supported in chrome 6. For details on the current implementation you can see 




Status
Being implemented behind the --enable-experimental-extension-apis flag so we can collect developer feedback. Should be landing in the tree relatively soon.

Overview
Provide a way for extensions to add items to the context (aka "right click") menu for web pages. 

Use cases
Many features that extensions want to expose are only applicable to certain kinds of content. Some examples include saving selected text or link urls to a extension-local or web based notepad, removing particular images from a page, filling in form fields, and looking up words in an online dictionary.

Could this API be part of the web platform?
Probably not, since many actions people would like to add are logically "browser-level" functionality.

Do you expect this API to be fairly stable?
Yes, once we get some experience with an experimental version.

What UI does this API expose?
New menu items & submenus in context menus.

How could this API be abused?
Someone could create menu items with innocuous-sounding or misleading names (or even duplicates of built-in menu items) to trick users to click on them.

How would you implement your desired features if this API didn't exist?
You could (and perhaps some extensions do?) inject script into all pages to intercept onmousedown and create your own custom html menu implementation. But that is a terrible user experience since it prevents the browser-native menu from appearing.

Draft API spec

Initially these functions will only be callable from an extension's background page. This will likely not be sufficient, since a frequent use case for context menus is to operate on the specific link/image/etc. that the menu was activated on. See the "Future Improvements" section below for ideas about this.

Note: because this will be initially available as an experiment, the API methods will at first be chrome.experimental.contextMenu.methodname

chrome.contextMenu.create (object properties, function onCreatedCallback);

Creates a new context menu item. The onCreatedCallback function should have a signature like function(id) {}, and will be passed the integer id of the newly created menu item.

The properties parameter can contain:
title  (optional string) - Text for this menu item. This is required for all types except 'SEPARATOR'. The special string %s in a title will be replaced with the currently selected text, if any.
type  (optional string) - One of the strings 'NORMAL', 'CHECKBOX', 'RADIO', or 'SEPARATOR'. Defaults to 'NORMAL' if not specified.
checked (optional boolean) - For items of type CHECKBOX or RADIO, should this be selected (RADIO) or checked (CHECKBOX)? Only one RADIO item can be selected at a time in a given group of RADIO items, with the last one to have checked == true winning.
contexts  (string) - Which contexts should this menu item appear for? An array of one or more of the following strings: 
'ALL', 'PAGE', 'SELECTION', 'LINK', 'EDITABLE', 'IMAGE', 'VIDEO', 'AUDIO'. 
Defaults to PAGE, which means "none of the rest" are selected (no link, no image, etc.). If 'ALL' is in the array, the item will appear in all contexts regardless of the rest of the items in the array.
enabledContexts  (string) - An array of strings similar to the contexts property. This serves to limit the contexts where this item will be enabled (ie not greyed out). If omitted, it defaults to the same set as the contexts property.
parentId  (integer) - If this should be a child item of another item, this is the id
onclick  (function(object info, Tab tab)) - A function that will be called when this menu item is clicked on. The info parameter is an object containing the following properties:
menuItemId  (integer) - The id of the menu item that was clicked.
parentMenuItemId  (optional integer) - The parent id, if any, for the item clicked.
mediaType  (optional string) - One of 'IMAGE', 'AUDIO', or 'VIDEO' if the context item was brought up on one of these types of elements.
linkUrl  (optional string) - If the element is a link, the url it points to.
srcUrl  (optional string) - Will be present for elements with a 'src' url.
pageUrl  (optional string) - The url of the page where the context menu was clicked.
frameUrl  (optional string) - The url of the frame of the element where the context menu was clicked.
selectionText  (optional string) - The text for the context selection, if any.
editable  (boolean) - A flag indicating whether the element is editable (text input, textarea, etc.)

The tab parameter is the tab where the click happened, of the same form as that returned by chrome.tabs.get.

 

 


chrome.contextMenu.remove (id);

Removes an extension menu item with the given id.



Examples

Define the currently selected word(s)

​The following code would live in your background page, and you would need to have "tabs" specified in the permissions section of your manifest.

​function getDefinition(info, tab) {
 if (!info.selectionText || info.selectionText.length == 0) {
   return;
 }
 var maxLength = 1024;
 var searchText = (info.selectionText.length <= maxLength) ?
                  info.selectionText : info.selectionText.substr(0, maxLength);
 var url = "http://www.google.com/search?q=define:" + escape(searchText);
 chrome.tabs.create({"url": url});
}

chrome.contextMenu.create({"title": "Define '%s'", "onclick": getDefinition,
                          "contexts":["SELECTION"]});



Remove an image from a page

The following code would live in your background page, and you would need to have an entry in the permissions section of your manifest which allowed you to run chrome.tabs.executeScript on the page where the image had its context menu activated. This example highlights one of the limitations of the initial proposal, which is that you don't have any way to determine the actual unique node that was clicked on, so it removes any instances of the image from the page.

chrome.contextMenu.create({"title": "Remove This Image", "contexts": ["IMAGE"],
                           "onclick": function(info, tab) {
  var frameUrl = info.frameUrl ? info.frameUrl : "";
  var code = 
      "var imgs = document.getElementsByTagName('img');" +
      "var srcUrl = unescape('" + escape(info.srcUrl) + "');" +
      "for (var i in imgs) {" + 
      "  var img = imgs[i];" +
      "  if (img.src == srcUrl) {" +
      "    img.parentNode.removeChild(img);" +
      "  }" +
      "}";
  chrome.tabs.executeScript(tab.id, {"allFrames": true, "code": code});
}});

UI Design
-Extension items appear towards the bottom of the context menu, above "Inspect element", sorted by extension name.
-We will show at most one top-level menu item per extension. If an extension adds more than 1 item, we automatically push the items into a submenu, with the extension name as the top-level item.
-The extension's icon will appear to the left of the top-level item to help the user understand which extension added what items, and help to mitigate the spoofing concerns raised above.



Future Improvements

- Provide a mechanism for getting a handle to the precise node in the DOM where the menu was activated. This could mean one of the following ideas:
  • Allow registration of context menus from content scripts, with a callback function that receives a handle to the node.
  • Pass the id of the node in the callback to the background page, and if the node didn't have an id we synthesize one.
  • Provide something like chrome.tabs.executeScript, where you can pass a file or string of code to execute but also specify a function that will be called with the node
- Add an update(int id, object properties) method so you can change your menu items in place.

- Add a removeAll() method so you don't have to keep track of id's if you don't want to.

-Add a way to limit your menu items to specific tabs or frame urls (by a given match pattern, or perhaps automatically limit to only sites you have content script permissions for)

-Some people have asked for a onBeforeShow() event to fire before the menu items are displayed, but this may be infeasible given chrome's multiprocess architecture and desire to keep the UI very responsive.
 
相关文章
|
10月前
|
JSON API 网络安全
通用邮箱邮件获取API教程:支持IMAP/POP3协议
本文介绍如何通过接口盒子的免费API获取邮箱邮件,支持IMAP/POP3协议,适用于QQ邮箱、网易邮箱等主流服务。内容包括接口基本信息、请求参数、返回参数、调用示例及注意事项,帮助开发者快速实现邮件读取功能。
1478 7
|
8月前
|
Web App开发 人工智能 IDE
从痛点到解决方案:为什么我开发了Chrome元素截图插件
传统的截图方式要么截取整个页面然后手动裁剪,要么使用浏览器自带的截图功能,但效果都不理想。特别是当内容包含SVG元素或复杂样式时,截图质量和速度、便捷性往往不尽如人意。
348 4
|
8月前
|
Web App开发 人工智能 前端开发
产品发布策略:如何让Chrome插件在竞争激烈的市场中脱颖而出
Chrome Web Store每天新增很多个插件。插件刚发布,用户只有我自己,如何在这样的红海市场中找到自己的位置,是我一直在思考的问题。
329 0
|
人工智能 JSON API
0代码将存量 API 适配 MCP 协议
本文主要讲述通过 Nacos+Higress 的方案实现0代码改造将 Agent 连接到存量应用,能够显著降低存量应用的改造成本。
1589 44
0代码将存量 API 适配 MCP 协议
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
1007 3
|
网络协议 API 开发者
深入解密 :Postman、Apipost和Apifox API 协议与工具选择
作为全栈开发者,每天与API打交道是常态。本文总结了多年经验,深入解析常见API协议(HTTP(s)、SSE、gRPC、WebSocket、Socket.IO)及其适用场景,并对比三款主流调试工具(Postman、Apipost、ApiFox)。从基础特性到高级应用,帮助开发者根据需求选择最优方案,提升效率,让开发更顺畅!
1206 21
|
Web App开发 存储 开发者
Chrome 插件上架发布全流程指南
浏览器插件开发完以后,要发布到 Chrome Web Store上,也是需要颇费一番周折的,本文就从注册账号开始,一直到最后发布上架的全流程进行指导,希望帮助你提供一些经验,避免踩坑,耗时耗力。
1697 8
|
人工智能 关系型数据库 MySQL
数据魔力,一触即发 —— Dataphin数据服务API,百炼插件新星降临!
本文通过一个利用百炼大模型平台和Dataphin数据服务API构建一个客户360智能应用的案例,介绍如何使用Dataphin数据服务API在百炼平台创建一个自定义插件,用于智能应用的开发,提升企业智能化应用水平。
1104 4
数据魔力,一触即发 —— Dataphin数据服务API,百炼插件新星降临!