chrome.declarativeContent

Description: Use the chrome.declarativeContent API to take actions depending on the content of a page, without requiring permission to read the page's content.
Availability: Stable since Chrome 33.
Permissions: "declarativeContent"
Learn More: Declarative Events
activeTab

Usage

The Declarative Content API allows you to show your extension's page action depending on the URL of a web page and the CSS selectors its content matches, without needing to take a host permission or inject a content script. Use the activeTab permission in order to be able to interact with a page after the user clicks on your page action.

If you need more precise control over when your page action appears or you need to change its appearance to match the current tab before the user clicks on it, you'll have to keep using the pageAction API.

Rules

As a declarative API, this API lets you register rules on the onPageChanged event object which take an action (currently just ShowPageAction) when a set of conditions, represented as a PageStateMatcher, are met.

The PageStateMatcher matches web pages if and only if all listed criteria are met. The following rule would show a page action for pages on https://www.google.com/ when a password field is present on it:

      var rule1 = {
        conditions: [
          new chrome.declarativeContent.PageStateMatcher({
            pageUrl: { hostEquals: 'www.google.com', schemes: ['https'] },
            css: ["input[type='password']"]
          })
        ],
        actions: [ new chrome.declarativeContent.ShowPageAction() ]
      };
      

Note: All conditions and actions are created via a constructor as shown in the example above.

In order to also show a page action for sites with a video, you can add a second condition, as each condition is sufficient to trigger all specified actions:

      var rule2 = {
        conditions: [
          new chrome.declarativeContent.PageStateMatcher({
            pageUrl: { hostEquals: 'www.google.com', schemes: ['https'] },
            css: ["input[type='password']"]
          }),
          new chrome.declarativeContent.PageStateMatcher({
            css: ["video"]
          })
        ],
        actions: [ new chrome.declarativeContent.ShowPageAction() ]
      };
      

Added rules are saved across browser restarts, so register them as follows:

      chrome.runtime.onInstalled.addListener(function(details) {
        chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
          chrome.declarativeContent.onPageChanged.addRules([rule2]);
        });
      });
      

Note: You should always register or unregister rules in bulk rather than individually because each of these operations recreates internal data structures. This re-creation is computationally expensive but facilitates a faster matching algorithm.

Combine the above rule with the activeTab permission to create an extension that doesn't need any install-time permissions but can invite the user to click its page action on relevant pages and can run on those pages when the user clicks the page action.

CSS Matching

PageStateMatcher.css conditions must be compound selectors, meaning that you can't include combinators like whitespace or ">" in your selectors. This helps Chrome match the selectors more efficiently.

Compound Selectors (OK)Complex Selectors (Not OK)
adiv p
iframe.special[src^='http']p>span.highlight
ns|*p + ol
#abcd:checkedp::first-line

CSS conditions only match displayed elements: if an element that matches your selector is display:none or one of its parent elements is display:none, it doesn't cause the condition to match. Elements styled with visibility:hidden, positioned off-screen, or hidden by other elements can still make your condition match.

Summary

Types
PageStateMatcher
ShowPageAction
Events
onPageChanged

Types

PageStateMatcher

Matches the state of a web page by various criteria.
properties
events.UrlFilter (optional) pageUrl Matches if the condition of the UrlFilter are fulfilled for the top-level URL of the page.
array of string (optional) css Matches if all of the CSS selectors in the array match displayed elements in a frame with the same origin as the page's main frame. All selectors in this array must be compound selectors to speed up matching. Note that listing hundreds of CSS selectors or CSS selectors that match hundreds of times per page can still slow down web sites.

ShowPageAction

Declarative event action that shows the extension's page action while the corresponding conditions are met. This action can be used without host permissions, but the extension must have a page action. If the extension takes the activeTab permission, a click on the page action will grant access to the active tab.

Events

onPageChanged

Provides the Declarative Event API consisting of addRules, removeRules, and getRules.

chrome.declarativeContent.onPageChanged.addRules(array of Rule rules, function callback) chrome.declarativeContent.onPageChanged.removeRules(array of string ruleIdentifiers, function callback) chrome.declarativeContent.onPageChanged.getRules(array of string ruleIdentifiers, function callback)

Supported conditions

Supported actions