1// Copyright (c) 2014 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
5function injectContentScripts() {
6  chrome.windows.getAll({'populate': true}, function(windows) {
7    for (var i = 0; i < windows.length; i++) {
8      var tabs = windows[i].tabs;
9      for (var j = 0; j < tabs.length; j++) {
10        var url = tabs[j].url;
11        if (url.indexOf('chrome') == 0 || url.indexOf('about') == 0) {
12          continue;
13        }
14        chrome.tabs.insertCSS(
15            tabs[j].id,
16            {file: 'highcontrast.css', allFrames: true});
17        chrome.tabs.executeScript(
18            tabs[j].id,
19            {file: 'highcontrast.js', allFrames: true});
20      }
21    }
22  });
23}
24
25function updateTabs() {
26  var msg = {
27    'enabled': getEnabled()
28  };
29  chrome.windows.getAll({'populate': true}, function(windows) {
30    for (var i = 0; i < windows.length; i++) {
31      var tabs = windows[i].tabs;
32      for (var j = 0; j < tabs.length; j++) {
33        var url = tabs[j].url;
34        if (isDisallowedUrl(url)) {
35          continue;
36        }
37        var msg = {
38          'enabled': getEnabled(),
39          'scheme': getSiteScheme(siteFromUrl(url))
40        };
41        chrome.tabs.sendRequest(tabs[j].id, msg);
42      }
43    }
44  });
45}
46
47function toggleEnabled() {
48  setEnabled(!getEnabled());
49  updateTabs();
50}
51
52function toggleSite(url) {
53  var site = siteFromUrl(url);
54  var scheme = getSiteScheme(site);
55  if (scheme > 0) {
56    scheme = 0;
57  } else if (getDefaultScheme() > 0) {
58    scheme = getDefaultScheme();
59  } else {
60    scheme = DEFAULT_SCHEME;
61  }
62  setSiteScheme(site, scheme);
63  updateTabs();
64}
65
66function init() {
67  injectContentScripts();
68  updateTabs();
69
70  chrome.extension.onRequest.addListener(
71      function(request, sender, sendResponse) {
72        if (request['toggle_global']) {
73          toggleEnabled();
74        }
75        if (request['toggle_site']) {
76          toggleSite(sender.tab ? sender.tab.url : 'www.example.com');
77        }
78        if (request['init']) {
79          var scheme = getDefaultScheme();
80          if (sender.tab) {
81            scheme = getSiteScheme(siteFromUrl(sender.tab.url));
82          }
83          var msg = {
84            'enabled': getEnabled(),
85            'scheme': scheme
86          };
87          sendResponse(msg);
88        }
89      });
90
91  document.addEventListener('storage', function(evt) {
92    updateTabs();
93  }, false);
94
95  if (navigator.appVersion.indexOf('Mac') != -1) {
96    chrome.browserAction.setTitle({'title': 'High Contrast (Cmd+Shift+F11)'});
97  }
98}
99
100init();
101