summaryrefslogtreecommitdiffstats
path: root/layout/style/test/ccd.sjs
blob: 22a4294d59c18a7581ece2bc66a00ad4147e4a28 (plain)
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
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"
    );
  }
}