146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 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)// -----------------------------------------------------------------------------
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: If you change this file you need to touch renderer_resources.grd to
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have your change take effect.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -----------------------------------------------------------------------------
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Partial implementation of the Greasemonkey API, see:
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://wiki.greasespot.net/Greasemonkey_Manual:APIs
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function GM_addStyle(css) {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var parent = document.getElementsByTagName("head")[0];
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!parent) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent = document.documentElement;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var style = document.createElement("style");
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  style.type = "text/css";
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var textNode = document.createTextNode(css);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  style.appendChild(textNode);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parent.appendChild(style);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function GM_xmlhttpRequest(details) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function setupEvent(xhr, url, eventName, callback) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xhr[eventName] = function () {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var isComplete = xhr.readyState == 4;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var responseState = {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        responseText: xhr.responseText,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        readyState: xhr.readyState,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        responseHeaders: isComplete ? xhr.getAllResponseHeaders() : "",
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status: isComplete ? xhr.status : 0,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        statusText: isComplete ? xhr.statusText : "",
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        finalUrl: isComplete ? url : ""
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      };
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback(responseState);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var xhr = new XMLHttpRequest();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var eventNames = ["onload", "onerror", "onreadystatechange"];
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < eventNames.length; i++ ) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var eventName = eventNames[i];
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (eventName in details) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setupEvent(xhr, details.url, eventName, details[eventName]);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  xhr.open(details.method, details.url);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details.overrideMimeType) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xhr.overrideMimeType(details.overrideMimeType);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details.headers) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var header in details.headers) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xhr.setRequestHeader(header, details.headers[header]);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  xhr.send(details.data ? details.data : null);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function GM_openInTab(url) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window.open(url, "");
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function GM_log(message) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window.console.log(message);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function generateGreasemonkeyStub(name) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return function() {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      console.log("%s is not supported.", name);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var apis = ["GM_getValue", "GM_setValue", "GM_registerMenuCommand"];
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0, api; api = apis[i]; i++) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window[api] = generateGreasemonkeyStub(api);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
83