aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.hgignore1
-rw-r--r--lib/clipboard.js129
-rw-r--r--lib/rhbzpage.js5
-rw-r--r--tests/test-clipboard.js42
4 files changed, 175 insertions, 2 deletions
diff --git a/.hgignore b/.hgignore
new file mode 100644
index 0000000..b6261c9
--- /dev/null
+++ b/.hgignore
@@ -0,0 +1 @@
+.*~
diff --git a/lib/clipboard.js b/lib/clipboard.js
new file mode 100644
index 0000000..b87c477
--- /dev/null
+++ b/lib/clipboard.js
@@ -0,0 +1,129 @@
+// Released under the MIT/X11 license
+// http://www.opensource.org/licenses/mit-license.php
+
+/**
+ * returns content of the system clipboard
+ * @return string with the content of the clipboard or "" if empty.
+ * originally from
+ * https://developer.mozilla.org/en/Using_the_Clipboard
+ *
+ */
+// TODO to-be-replaced by
+// var contents = jetpack.clipboard.get();
+// http://hsivonen.iki.fi/kesakoodi/clipboard/
+// https://wiki.mozilla.org/Labs/Jetpack/JEP/10
+
+function getClipboard() {
+ var clip = Cc["@mozilla.org/widget/clipboard;1"].
+ getService(Ci.nsIClipboard);
+ if (!clip) {
+ throw new Error("No access to the clipboard!");
+ }
+ return clip;
+}
+
+function createTransferable() {
+ var trans = Cc["@mozilla.org/widget/transferable;1"].
+ createInstance(Ci.nsITransferable);
+ if (!trans) {
+ throw new Error("No access to the transfer object during the set of clipboard!");
+ }
+ return trans;
+}
+
+var getMethod = exports.get = function getMethod( flavor ) {
+ var pastetext = "", mimeType = "", stuff = {};
+ var len = 0, clipId = 0, clip = {}, trans = {};
+
+ // flavor argument is optional
+ if (flavor === undefined) {
+ flavor = "plain";
+ }
+
+ if (flavor === "plain") {
+ mimeType = "text/unicode";
+ } else if (favor === "html") {
+ mimeType = "text/html";
+ } else {
+ throw new Error("Unsupported flavor '" + flavor + "'!");
+ }
+
+ clip = getClipboard();
+
+ trans = createTransferable();
+
+ trans.addDataFlavor(mimeType);
+ clip.getData(trans, clip.kGlobalClipboard);
+
+ var str = {};
+ var strLength = {};
+
+ trans.getTransferData(mimeType, str, strLength);
+
+ if (str) {
+ str = str.value.QueryInterface(Ci.nsISupportsString);
+ pastetext = str.data.substring(0, strLength.value / 2);
+ }
+ return pastetext;
+};
+
+var setMethod = exports.set = function setMethod(content, flavor) {
+ var mimeType = "", stuff = {};
+ var len = 0, clipId = 0, clip = {}, trans = {};
+
+ // flavor argument is optional
+ if (flavor === undefined) {
+ flavor = "plain";
+ }
+
+ if (flavor === "plain") {
+ mimeType = "text/unicode";
+ } else if (favor === "html") {
+ mimeType = "text/html";
+ } else {
+ throw new Error("Unsupported flavor '" + flavor + "'!");
+ }
+
+ stuff = Cc["@mozilla.org/supports-string;1"].
+ createInstance(Ci.nsISupportsString);
+ if (!stuff) {
+ return false;
+ }
+ stuff.data = content;
+ len = content.length * 2;
+
+ clip = getClipboard();
+
+ trans = createTransferable();
+
+ trans.addDataFlavor(mimeType);
+ trans.setTransferData(mimeType, stuff, content.length * 2);
+
+ clip.setData(trans, null, clip.kGlobalClipboard);
+ return true;
+};
+
+function createSupportsWString() {
+ return Cc["@mozilla.org/supports-wstring;1"].
+ createInstance(Ci.nsISupportsWString);
+}
+
+var flavorsMethod = exports.getCurrentFlavors = function flavorsMethod() {
+ // currently the only possible flavors in Jetpack-prototype are "plain" and
+ // "html", i.e., "text/plain" (or text/unicode?) and "text/html" (or
+ // application/xml+xhtml?)
+ var possibleTypes = {
+ "text/unicode": "plain",
+ "text/plain": "plain",
+ "text/html": "html"
+ };
+ var flavourArray = [];
+
+ for (mime in possibleTypes) {
+ var kSuppString = createSupportsWString();
+ kSuppString.data = mime;
+ // FIXME Missing some kind of if (mime in flavors) ...
+ flavourArray.add(possibleTypes[mime]);
+ }
+ return flavourArray;
+};
diff --git a/lib/rhbzpage.js b/lib/rhbzpage.js
index c885699..c9d9b9f 100644
--- a/lib/rhbzpage.js
+++ b/lib/rhbzpage.js
@@ -6,6 +6,7 @@
var util = require("util");
var xrpc = require("xmlrpc");
var xhr = require("xhr");
+var clip = require("clipboard");
// var TriagedDistro = 13;
// var NumberOfFrames = 7;
// var XMLRPCurl = "https://bugzilla.redhat.com/xmlrpc.cgi";
@@ -589,7 +590,7 @@ RHBugzillaPage.prototype.queryForSelection = function() {
let text = jetpack.selection.text;
console.log("selection = " + text);
if (!text) {
- text = jetpack.clipboard.get();
+ text = clip.get();
console.log("clipboard = " + text);
}
console.log("text = " + text);
@@ -604,7 +605,7 @@ RHBugzillaPage.prototype.queryForSelection = function() {
RHBugzillaPage.prototype.queryUpstream = function() {
let text = jetpack.selection.text;
if (!text) {
- text = jetpack.clipboard.get();
+ text = clip.get();
}
if (text) {
let text = encodeURIComponent(text.trim());
diff --git a/tests/test-clipboard.js b/tests/test-clipboard.js
new file mode 100644
index 0000000..56cfeb8
--- /dev/null
+++ b/tests/test-clipboard.js
@@ -0,0 +1,42 @@
+/*global exports: false, require: false */
+/*jslint plusplus: false */
+// Released under the MIT/X11 license
+// http://www.opensource.org/licenses/mit-license.php
+
+// TODO: add some failing tests as well
+"use strict";
+var clip = require("clipboard");
+
+var testString = "When in the Course of human events it becomes necessary for one people to dissolve the political bands which have connected them with another and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation.\n";
+var pushkinTestString = "Byl pozdní večer první máj!\n\nАРИОН.\n\nНас было много на челне;\nИные парус напрягали,\nДругие дружно упирали\nВ глубь мощны веслы. В тишине\nНа руль склонясь, наш кормщик умный\nВ молчаньи правил грузный чолн;\nА я — беспечной веры полн —\nПловцам я пел … Вдруг лоно волн\nИзмял с налету вихорь шумный …\nПогиб и кормщик и пловец! –\nЛишь я, таинственный певец,\nНа берег выброшен грозою,\nЯ гимны прежние пою\nИ ризу влажную мою\nСушу на солнце под скалою.\n"
+
+// TODO: VERY insufficient test, needs to be extended
+exports.ensureClipboardASCII = function ensureClipboard(test) {
+ var text = "";
+ var req = clip.set(testString);
+ if (req) {
+ text = clip.get();
+ if (!text) {
+ throw "Cannot read a string from the clipboard";
+ }
+ } else {
+ throw "Cannot copy string to the clipboard;"
+ }
+ test.assertEqual(text, testString,
+ "checking set and get clipboard methods (ASCII)");
+};
+
+exports.ensureClipboardUnicode = function ensureClipboard(test) {
+ var text = "";
+ var req = clip.set(pushkinTestString);
+ if (req) {
+ text = clip.get();
+ if (!text) {
+ throw "Cannot read a string from the clipboard";
+ }
+ } else {
+ throw "Cannot copy string to the clipboard;"
+ }
+ test.assertEqual(text, pushkinTestString,
+ "checking set and get clipboard methods (Unicode)");
+};