aboutsummaryrefslogtreecommitdiffstats
path: root/lib/clipboard.js
diff options
context:
space:
mode:
authorMatěj Cepl <mcepl@redhat.com>2010-06-07 15:04:02 +0200
committerMatěj Cepl <mcepl@redhat.com>2010-06-07 15:04:02 +0200
commit67bdce8805063717bfdbc449e5d8974f32f288a2 (patch)
tree594170cb6721f053d14d18634dc290b212c5ef8e /lib/clipboard.js
parent2b95e7ae6cb53f987931de8f567870b9e69cdf9a (diff)
downloadbugzilla-triage-67bdce8805063717bfdbc449e5d8974f32f288a2.tar.gz
The first attempt to make JEP-10/Clipboard working.
Diffstat (limited to 'lib/clipboard.js')
-rw-r--r--lib/clipboard.js129
1 files changed, 129 insertions, 0 deletions
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;
+};