Creating Tampermonkey User Script in Chrome


Scenario
In some cases, we want to change our frequently-visited website a bit: such as add some shortcut key: click >(right arrow) to go to next page, click <(left arrow) to go previous page in current web site.

We can create chrome extension, but it's overkill in this case. 

Tampermonkey
Chrome partially supports Greasemonkey, but doesn't support @require, @resource, unsafeWindow, GM_registerMenuCommand, GM_setValue, or GM_getValue.

Luckily, Tampermonkey fixes this issue: it is fully compatible to Greasemonkey, including GM_registerMenuCommand, GM_xmlhttpRequest with cross domain support and access to the unsafeWindow object. 

We can install tampermonkey from webstore. Then use its dashboard to create(add) new user scripts locally.

We can create one simple Greasemonkey user script to do it, or install exsiting user scripts from 
https://greasyfork.org/
http://userscripts-mirror.org/
https://openuserjs.org/

Examples
EDX helper
When watch open source courses in EDX, I would like to add the following shortcut keys:
>(right arrow): go to next page, <(left arrow) to go to previous page, t to play/pause the video, m to toggle full screen.
Also I want to auto play the video.
// ==UserScript==
// @name       edx helper
// @namespace  lifelongprogrammer.blogspot.com
// @require     https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js
// @version    1.0
// @description  some keybindings for edx: next, previous, play/pause
// @match      https://courses.edx.org/courses/*
// @copyright  2014+, Jeffery Yuan original author: Andrea Bisognin
// ==/UserScript==

this.$ = this.jQuery = jQuery.noConflict(true);
$(document).ready(function () {
 // auto play
 console.log("edx helper");
 setTimeout(function () {
  console.log("edx helper auto player");
  unsafeWindow.$("section.video-controls a[class='video_control play']").click();
 }, 2000);
 jQuery(document).keydown(function (e) {
  console.log("edx helper; key: " + e.keyCode);
  if (e.keyCode == 39) { //->
   unsafeWindow.$("div.sequence-nav > button.sequence-nav-button.button-next").click();
  }
  if (e.keyCode == 37) { // <-
   unsafeWindow.$("div.sequence-nav > button.sequence-nav-button.button-previous").click();
  }
  if (e.keyCode == 84 || e.keyCode == 116) { //t
   unsafeWindow.$("section.video-controls > div:nth-child(2) > ul > li:nth-child(1) > a").click();
  }
  if (e.keyCode == 67 || e.keyCode == 99) { //c
   unsafeWindow.$("div.lang.menu-container > a").click();
  }
  if (e.keyCode == 77 || e.keyCode == 109) { //m
   unsafeWindow.$("a.add-fullscreen").click();
  }

 });
});


Safaribooksonline Helper
Similarly, when watch videos on Safaribooksonline, I want to add >(right arrow): go to next page, <(left arrow) to go to previous page, f to open in full mode where we can still use left, right arrow keys.
// ==UserScript==
// @name       safaribooksonline helper
// @namespace  lifelongprogrammer.blogspot.com
// @require     https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js
// @version    1.0
// @description  some keybindings for safaribooksonline: next, previous
// @match      http://techbus.safaribooksonline.com/*
// @copyright  2015+, Jeffery Yuan, https://github.com/private-face/jquery.fullscreen
// ==/UserScript==

function d(b){var c,a;if(!this.length)return this;c=this[0];c.ownerDocument?a=c.ownerDocument:(a=c,c=a.documentElement);if(null==b){if(!a.cancelFullScreen&&!a.webkitCancelFullScreen&&!a.mozCancelFullScreen)return null;b=!!a.fullScreen||!!a.webkitIsFullScreen||!!a.mozFullScreen;return!b?b:a.fullScreenElement||a.webkitCurrentFullScreenElement||a.mozFullScreenElement||b}b?(b=c.requestFullScreen||c.webkitRequestFullScreen||c.mozRequestFullScreen)&&b.call(c,Element.ALLOW_KEYBOARD_INPUT):(b=a.cancelFullScreen||
a.webkitCancelFullScreen||a.mozCancelFullScreen)&&b.call(a);return this}jQuery.fn.fullScreen=d;jQuery.fn.toggleFullScreen=function(){return d.call(this,!d.call(this))};var e,f,g;e=document;e.webkitCancelFullScreen?(f="webkitfullscreenchange",g="webkitfullscreenerror"):e.mozCancelFullScreen?(f="mozfullscreenchange",g="mozfullscreenerror"):(f="fullscreenchange",g="fullscreenerror");jQuery(document).bind(f,function(){jQuery(document).trigger(new jQuery.Event("fullscreenchange"))});
jQuery(document).bind(g,function(){jQuery(document).trigger(new jQuery.Event("fullscreenerror"))});
this.$ = this.jQuery = jQuery.noConflict(true);
// https://github.com/private-face/jquery.fullscreen
$(document).ready(function () {
 // auto play
 console.log("safaribooksonline helper");
 jQuery(document).keydown(function (e) {
  console.log("safaribooksonline helper; key: " + e.keyCode);
  if (e.keyCode == 39) { //->
   unsafeWindow.$("#bcv_next").click();
   //$('#nana').fullScreen(true)   
  }
  if (e.keyCode == 37) { // <-
  console.log("i am called 26"); 
   unsafeWindow.$("#bcv_previous").click();
  }
  else if (e.keyCode == 70 || e.keyCode == 102) { //f
   $('div.brightcove_video').fullScreen(true)
  }
 });
});

Resources
Userscripts.org down for good? Here are alternatives

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)