-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathcsshttprequest.js
110 lines (94 loc) · 3.74 KB
/
csshttprequest.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
CSSHttpRequest
Copyright 2008 nb.io - http://nb.io/
Licensed under Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.html
*/
(function(){
var chr = window.CSSHttpRequest = {};
chr.id = 0;
chr.requests = {};
chr.MATCH_ORDINAL = /#c(\d+)/;
chr.MATCH_URL = /url\("?data\:[^,]*,([^")]+)"?\)/;
chr.get = function(url, callback) {
var id = ++chr.id;
var iframe = document.createElement( "iframe" );
iframe.style.position = "absolute";
iframe.style.left = iframe.style.top = "-1000px";
iframe.style.width = iframe.style.height = 0;
document.documentElement.appendChild(iframe);
var r = chr.requests[id] = {
id: id,
iframe: iframe,
document: iframe.contentDocument || iframe.contentWindow.document,
callback: callback
};
r.document.open("text/html", false);
r.document.write("<html><head>");
r.document.write("<link rel='stylesheet' type='text/css' media='print, csshttprequest' href='" + chr.escapeHTML(url) + "' />");
r.document.write("</head><body>");
r.document.write("<script type='text/javascript'>");
r.document.write("(function(){var w = window; var p = w.parent; p.CSSHttpRequest.sandbox(w); w.onload = function(){p.CSSHttpRequest.callback('" + id + "');};})();");
r.document.write("</script>");
r.document.write("</body></html>");
r.document.close();
};
chr.sandbox = function(w) {
};
chr.callback = function(id) {
var r = chr.requests[id];
var data = chr.parse(r);
r.callback(data);
window.setTimeout(function() {
var r = chr.requests[id];
try { r.iframe.parentElement.removeChild(r.iframe); } catch(e) {};
delete chr.requests[id];
}, 0);
};
chr.parse = function(r) {
var data = [];
// Safari, IE and same-domain Firefox
try {
var rules = r.document.styleSheets[0].cssRules || r.document.styleSheets[0].rules;
for(var i = 0; i < rules.length; i++) {
try {
var r = rules.item ? rules.item(i) : rules[i];
var ord = r.selectorText.match(chr.MATCH_ORDINAL)[1];
var val = r.style.backgroundImage.match(chr.MATCH_URL)[1];
data[ord] = val;
} catch(e) {}
}
}
// catch same-domain exception
catch(e) {
r.document.getElementsByTagName("link")[0].setAttribute("media", "screen");
var x = r.document.createElement("div");
x.innerHTML = "foo";
r.document.body.appendChild(x);
var ord = 0;
try {
while(1) {
x.id = "c" + ord;
var style = r.document.defaultView.getComputedStyle(x, null);
var bg = style["background-image"] || style.backgroundImage || style.getPropertyValue("background-image");
var val = bg.match(chr.MATCH_URL)[1];
data[ord] = val;
ord++;
}
} catch(e) {}
}
return decodeURIComponent(data.join(""));
};
chr.escapeHTML = function(s) {
return s.replace(/([<>&""''])/g,
function(m, c) {
switch(c) {
case "<": return "<";
case ">": return ">";
case "&": return "&";
case '"': return """;
case "'": return "'";
}
return c;
});
};
})();