Skip to content

Instantly share code, notes, and snippets.

@tranquility-yuki
Created November 3, 2015 22:39
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 tranquility-yuki/2567764b5136c0d1aecb to your computer and use it in GitHub Desktop.
Save tranquility-yuki/2567764b5136c0d1aecb to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name CrosDomainUploadTest
// @namespace http://use.i.E.your.homepage/
// @version 0.1
// @description enter something useful
// @match http://dobrochan.com/*
// @copyright 2012+, You
// @grant GM_xmlhttpRequest
// ==/UserScript==
var stringToByteArray = function(str) {
"use strict";
var array = new Uint8Array(str.length),
i, il;
for (i = 0, il = str.length; i < il; ++i) {
array[i] = str.charCodeAt(i) & 0xff;
}
return array;
};
var arrayBufferDataUri = function(raw) {
"use strict";
var base64 = '',
encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
bytes = new Uint8Array(raw),
byteLength = bytes.byteLength,
byteRemainder = byteLength % 3,
mainLength = byteLength - byteRemainder,
a, b, c, d,
chunk;
// Main loop deals with bytes in chunks of 3
for (var i = 0; i < mainLength; i = i + 3) {
// Combine the three bytes into a single integer
chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
// Use bitmasks to extract 6-bit segments from the triplet
a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18
b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12
c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6
d = chunk & 63; // 63 = 2^6 - 1
// Convert the raw binary segments to the appropriate ASCII encoding
base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];
}
// Deal with the remaining bytes and padding
if (byteRemainder == 1) {
chunk = bytes[mainLength];
a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2
// Set the 4 least significant bits to zero
b = (chunk & 3) << 4; // 3 = 2^2 - 1
base64 += encodings[a] + encodings[b] + '==';
} else if (byteRemainder == 2) {
chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];
a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10
b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4
// Set the 2 least significant bits to zero
c = (chunk & 15) << 2; // 15 = 2^4 - 1
base64 += encodings[a] + encodings[b] + encodings[c] + '=';
}
return base64;
};
var getURLasAB = function(url, cb) {
"use strict";
if (navigator.userAgent.match(/Chrome\/([\d.]+)/)) {
GM_xmlhttpRequest({
method: "GET",
url: url,
responseType: "arraybuffer",
onload: function(oEvent) {
console.log(oEvent);
cb(oEvent.response);
},
onerror: function(oEvent) {
console.log('url get error');
}
});
} else {
GM_xmlhttpRequest({
method: "GET",
url: url,
overrideMimeType: "text/plain; charset=x-user-defined",
onload: function(oEvent) {
var ff_buffer = stringToByteArray(oEvent.responseText || oEvent.response);
cb(ff_buffer.buffer);
},
onerror: function(oEvent) {
console.log('url get error');
}
});
}
};
var btn = document.createElement("input");
btn.type = 'button';
btn.value = 'Get URL';
btn.name = 'GetURL';
btn.onclick = function() {
var url = prompt("URL");
getURLasAB(url, function(AB) {
var src = 'data:application/octet-stream;base64,' + arrayBufferDataUri(AB),
img = document.createElement("img");
img.src = src;
document.body.appendChild(img);
});
};
document.body.appendChild(btn);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment