summaryrefslogtreecommitdiffstats
path: root/layout/style/test/ccd.sjs
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/test/ccd.sjs')
-rw-r--r--layout/style/test/ccd.sjs73
1 files changed, 73 insertions, 0 deletions
diff --git a/layout/style/test/ccd.sjs b/layout/style/test/ccd.sjs
new file mode 100644
index 0000000000..058393e82e
--- /dev/null
+++ b/layout/style/test/ccd.sjs
@@ -0,0 +1,73 @@
+const DEBUG_all_valid = false;
+const DEBUG_all_stub = false;
+
+function handleRequest(request, response)
+{
+ // Decode the query string to know what test we're doing.
+
+ // character 1: 'I' = text/css response, 'J' = text/html response
+ let responseCSS = (request.queryString[0] == 'I');
+
+ // character 2: redirection type - we only care about whether we're
+ // ultimately same-origin with the requesting document ('A', 'D') or
+ // not ('B', 'C').
+ let sameOrigin = (request.queryString[1] == 'A' ||
+ request.queryString[1] == 'D');
+
+ // character 3: '1' = syntactically valid, '2' = invalid, '3' = http error
+ let malformed = (request.queryString[2] == '2');
+ let httpError = (request.queryString[2] == '3');
+
+ // character 4: loaded with <link> or @import (no action required)
+
+ // character 5: loading document mode: 'q' = quirks, 's' = standards
+ let quirksMode = (request.queryString[4] == 'q');
+
+ // Our response contains a CSS rule that selects an element whose
+ // ID is the first four characters of the query string.
+ let selector = '#' + request.queryString.substring(0,4);
+
+ // "Malformed" responses wrap the CSS rule in the construct
+ // <html>{} ... </html>
+ // This mimics what the CSS parser might see if an actual HTML
+ // document were fed to it. Because CSS parsers recover from
+ // errors by skipping tokens until they find something
+ // recognizable, a style rule appearing where I wrote '...' above
+ // will be honored!
+ let leader = (malformed ? '<html>{}' : '');
+ let trailer = (malformed ? '</html>' : '');
+
+ // Standards mode documents will ignore the style sheet if it is being
+ // served as text/html (regardless of its contents). Quirks mode
+ // documents will ignore the style sheet if it is being served as
+ // text/html _and_ it is not same-origin. Regardless, style sheets
+ // are ignored if they come as the body of an HTTP error response.
+ //
+ // Style sheets that should be ignored paint the element red; those
+ // that should be honored paint it lime.
+ let color = ((responseCSS || (quirksMode && sameOrigin)) && !httpError
+ ? 'lime' : 'red');
+
+ // For debugging the test itself, we have the capacity to make every style
+ // sheet well-formed, or every style sheet do nothing.
+ if (DEBUG_all_valid) {
+ // In this mode, every test chip should turn blue.
+ response.setHeader('Content-Type', 'text/css');
+ response.write(selector + '{background-color:blue}\n');
+ } else if (DEBUG_all_stub) {
+ // In this mode, every test chip for a case where the true test
+ // sheet would be honored, should turn red.
+ response.setHeader('Content-Type', 'text/css');
+ response.write(selector + '{}\n');
+ } else {
+ // Normal operation.
+ if (httpError)
+ response.setStatusLine(request.httpVersion, 500,
+ "Internal Server Error");
+ response.setHeader('Content-Type',
+ responseCSS ? 'text/css' : 'text/html');
+ response.write(leader + selector +
+ '{background-color:' + color + '}' +
+ trailer + '\n');
+ }
+}