15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sample extension to replace all JPEG images (but no PNG/GIF/... images) with
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lolcat images from http://icanhascheezburger.com/ - except for images on
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Google.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var RequestMatcher = chrome.declarativeWebRequest.RequestMatcher;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var IgnoreRules = chrome.declarativeWebRequest.IgnoreRules;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var RedirectRequest = chrome.declarativeWebRequest.RedirectRequest;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var catImageUrl =
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'https://i.chzbgr.com/completestore/12/8/23/S__rxG9hIUK4sNuMdTIY9w2.jpg';
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Registers redirect rules assuming that currently no rules are registered by
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this extension, yet.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function registerRules() {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var redirectRule = {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    priority: 100,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    conditions: [
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If any of these conditions is fulfilled, the actions are executed.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new RequestMatcher({
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Both, the url and the resourceType must match.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url: {pathSuffix: '.jpg'},
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resourceType: ['image']
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }),
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new RequestMatcher({
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url: {pathSuffix: '.jpeg'},
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resourceType: ['image']
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    actions: [
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new RedirectRequest({redirectUrl: catImageUrl})
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var exceptionRule = {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    priority: 1000,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    conditions: [
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We use hostContains to compensate for various top-level domains.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new RequestMatcher({url: {hostContains: '.google.'}})
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    actions: [
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new IgnoreRules({lowerPriorityThan: 1000})
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var callback = function() {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (chrome.runtime.lastError) {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      console.error('Error adding rules: ' + chrome.runtime.lastError);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      console.info('Rules successfully installed');
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome.declarativeWebRequest.onRequest.getRules(null,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          function(rules) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            console.info('Now the following rules are registered: ' +
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         JSON.stringify(rules, null, 2));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          });
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome.declarativeWebRequest.onRequest.addRules(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [redirectRule, exceptionRule], callback);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function setup() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function is also called when the extension has been updated.  Because
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // registered rules are persisted beyond browser restarts, we remove
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // previously registered rules before registering new ones.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome.declarativeWebRequest.onRequest.removeRules(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    null,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    function() {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (chrome.runtime.lastError) {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        console.error('Error clearing rules: ' + chrome.runtime.lastError);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        registerRules();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is triggered when the extension is installed or updated.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chrome.runtime.onInstalled.addListener(setup);
83