Skip to content

Instantly share code, notes, and snippets.

@teramako
Created January 5, 2012 14:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save teramako/1565506 to your computer and use it in GitHub Desktop.
Save teramako/1565506 to your computer and use it in GitHub Desktop.
GM_apiLeakCheck Test

#Greasemonkey GM_apiLeakCheck Test

##case 1. click the area normally

works correct.

  • see: callStack_normaryClickTheArea.json

##case 2. click button1

GM_apiLeakCheck returns false correctly.

  • see: callStack_clickButto1.json

##case 3. click button2

GM_apiLeakCheck returns true unfortunately :(

  • see: callStack_clickButton2.json
{
"language": 2,
"languageName": "JavaScript",
"filename": "file:///C:/Documents%20and%20Settings/teramako/Application%20Data/Mozilla/Firefox/Profiles/78arngn2.nightly/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js",
"name": "GM_apiLeakCheck",
"lineNumber": 53,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "file:///C:/Documents%20and%20Settings/teramako/Application%20Data/Mozilla/Firefox/Profiles/78arngn2.nightly/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js",
"name": "openInTab",
"lineNumber": 165,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "resource://greasemonkey/util/hitch.js",
"name": null,
"lineNumber": 27,
"sourceLine": null,
"caller": {
"language": 1,
"languageName": "C++",
"filename": null,
"name": null,
"lineNumber": 0,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "resource://greasemonkey/runScript.js",
"name": null,
"lineNumber": 9,
"sourceLine": null,
"caller": {
"language": 1,
"languageName": "C++",
"filename": null,
"name": null,
"lineNumber": 0,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "http://local1.example.org/gmSecurity.html",
"name": "sendEvent",
"lineNumber": 23,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "http://local1.example.org/gmSecurity.html",
"name": "onclick",
"lineNumber": 1,
"sourceLine": null,
"caller": {
"language": 1,
"languageName": "C++",
"filename": null,
"name": null,
"lineNumber": 0,
"sourceLine": null,
"caller": null
}
}
}
}
}
}
}
}
}
{
"language": 2,
"languageName": "JavaScript",
"filename": "file:///C:/Documents%20and%20Settings/teramako/Application%20Data/Mozilla/Firefox/Profiles/78arngn2.nightly/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js",
"name": "GM_apiLeakCheck",
"lineNumber": 53,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "file:///C:/Documents%20and%20Settings/teramako/Application%20Data/Mozilla/Firefox/Profiles/78arngn2.nightly/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js",
"name": "openInTab",
"lineNumber": 165,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "resource://greasemonkey/util/hitch.js",
"name": null,
"lineNumber": 27,
"sourceLine": null,
"caller": {
"language": 1,
"languageName": "C++",
"filename": null,
"name": null,
"lineNumber": 0,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "resource://greasemonkey/runScript.js",
"name": null,
"lineNumber": 9,
"sourceLine": null,
"caller": {
"language": 1,
"languageName": "C++",
"filename": null,
"name": null,
"lineNumber": 0,
"sourceLine": null,
"caller": null
}
}
}
}
}
}
{
"language": 2,
"languageName": "JavaScript",
"filename": "file:///C:/Documents%20and%20Settings/teramako/Application%20Data/Mozilla/Firefox/Profiles/78arngn2.nightly/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js",
"name": "GM_apiLeakCheck",
"lineNumber": 53,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "file:///C:/Documents%20and%20Settings/teramako/Application%20Data/Mozilla/Firefox/Profiles/78arngn2.nightly/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js",
"name": "openInTab",
"lineNumber": 165,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "resource://greasemonkey/util/hitch.js",
"name": null,
"lineNumber": 27,
"sourceLine": null,
"caller": {
"language": 1,
"languageName": "C++",
"filename": null,
"name": null,
"lineNumber": 0,
"sourceLine": null,
"caller": {
"language": 2,
"languageName": "JavaScript",
"filename": "resource://greasemonkey/runScript.js",
"name": null,
"lineNumber": 9,
"sourceLine": null,
"caller": {
"language": 1,
"languageName": "C++",
"filename": null,
"name": null,
"lineNumber": 0,
"sourceLine": null,
"caller": null
}
}
}
}
}
}
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Greasemonkey GM_apiLeaKCheck Test</title>
</head>
<body>
<h1>Greasemonkey GM_apiLeakCheck Test</h1>
<p>Click <button onclick="sendEvent();">button 1</button></p>
<p>Click <button onclick="sendEvent2();">button 2</button></p>
<div id="clickarea" style="border:thin solid red; width:200px; height:200px">
<p>click area</p>
</div>
<iframe src="" style="display:none;"></iframe>
<script>
function sendEvent() {
var evt = document.createEvent("UIEvents");
evt.initUIEvent("click", true, true, null, false, false, false, false);
document.getElementById("clickarea").dispatchEvent(evt);
}
function sendEvent2() {
document.getElementsByTagName("iframe")[0].src ="javascript: window.top.sendEvent()";
}
</script>
</body>
</html>
// ==UserScript==
// @name gmSecurity
// @namespace teramako.github.com
// @include http://localhost/gmSecurity.html
// ==/UserScript==
document.getElementById("clickarea").addEventListener("click", function(aEvent) {
GM_openInTab("data:text/html," + encodeURIComponent("<title>clicked</title><h1>clicked</h1>"));
}, false);
diff --git a/components/greasemonkey.js b/components/greasemonkey.js
index 5c0ac1c..2b78d96 100644
--- a/components/greasemonkey.js
+++ b/components/greasemonkey.js
@@ -9,6 +9,7 @@ var Ci = Components.interfaces;
var Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
var gmRunScriptFilename = "resource://greasemonkey/runScript.js";
var gExtensionPath = (function() {
@@ -51,6 +52,7 @@ function alert(msg) {
function GM_apiLeakCheck(apiName) {
var stack = Components.stack;
+ Services.console.logStringMessage(JSON.stringify(stack, null, " "));
do {
// Valid locations for GM API calls are:
// * Greasemonkey modules.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment