1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Sample extension to replace all JPEG images (but no PNG/GIF/... images) with
6// lolcat images from http://icanhascheezburger.com/ - except for images on
7// Google.
8
9var RequestMatcher = chrome.declarativeWebRequest.RequestMatcher;
10var IgnoreRules = chrome.declarativeWebRequest.IgnoreRules;
11var RedirectRequest = chrome.declarativeWebRequest.RedirectRequest;
12
13var catImageUrl =
14    'https://i.chzbgr.com/completestore/12/8/23/S__rxG9hIUK4sNuMdTIY9w2.jpg';
15
16// Registers redirect rules assuming that currently no rules are registered by
17// this extension, yet.
18function registerRules() {
19  var redirectRule = {
20    priority: 100,
21    conditions: [
22      // If any of these conditions is fulfilled, the actions are executed.
23      new RequestMatcher({
24        // Both, the url and the resourceType must match.
25        url: {pathSuffix: '.jpg'},
26        resourceType: ['image']
27      }),
28      new RequestMatcher({
29        url: {pathSuffix: '.jpeg'},
30        resourceType: ['image']
31      }),
32    ],
33    actions: [
34      new RedirectRequest({redirectUrl: catImageUrl})
35    ]
36  };
37
38  var exceptionRule = {
39    priority: 1000,
40    conditions: [
41      // We use hostContains to compensate for various top-level domains.
42      new RequestMatcher({url: {hostContains: '.google.'}})
43    ],
44    actions: [
45      new IgnoreRules({lowerPriorityThan: 1000})
46    ]
47  };
48
49  var callback = function() {
50    if (chrome.runtime.lastError) {
51      console.error('Error adding rules: ' + chrome.runtime.lastError);
52    } else {
53      console.info('Rules successfully installed');
54      chrome.declarativeWebRequest.onRequest.getRules(null,
55          function(rules) {
56            console.info('Now the following rules are registered: ' +
57                         JSON.stringify(rules, null, 2));
58          });
59    }
60  };
61
62  chrome.declarativeWebRequest.onRequest.addRules(
63      [redirectRule, exceptionRule], callback);
64}
65
66function setup() {
67  // This function is also called when the extension has been updated.  Because
68  // registered rules are persisted beyond browser restarts, we remove
69  // previously registered rules before registering new ones.
70  chrome.declarativeWebRequest.onRequest.removeRules(
71    null,
72    function() {
73      if (chrome.runtime.lastError) {
74        console.error('Error clearing rules: ' + chrome.runtime.lastError);
75      } else {
76        registerRules();
77      }
78    });
79}
80
81// This is triggered when the extension is installed or updated.
82chrome.runtime.onInstalled.addListener(setup);
83