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.sjs71
1 files changed, 71 insertions, 0 deletions
diff --git a/layout/style/test/ccd.sjs b/layout/style/test/ccd.sjs
new file mode 100644
index 0000000000..22a4294d59
--- /dev/null
+++ b/layout/style/test/ccd.sjs
@@ -0,0 +1,71 @@
+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"
+ );
+ }
+}