<html>
<head>
  <title>job-sk demo</title>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
  <script src="/res/common/js/common.js"></script>
  <script src="/res/imp/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  <script type="text/javascript" charset="utf-8">
    // job1 represents real task data.
    var job1 = {
      "buildbucketBuildId": 8921090193851453000,
      "buildbucketLeaseKey": 0,
      "created": "2019-02-19T13:20:52.277737Z",
      "dbModified": "2019-02-19T13:33:14.64704Z",
      "dependencies": {
        "Build-Debian9-EMCC-wasm-Release-CanvasKit": [
          "Housekeeper-PerCommit-BundleRecipes"
        ],
        "Housekeeper-PerCommit-BundleRecipes": [],
        "Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit": [
          "Housekeeper-PerCommit-BundleRecipes",
          "Build-Debian9-EMCC-wasm-Release-CanvasKit"
        ],
        "Upload-Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit": [
          "Housekeeper-PerCommit-BundleRecipes",
          "Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit"
        ]
      },
      "finished": "2019-02-19T13:32:46.274182Z",
      "id": "aYwjrLWysQRUW2lGFQvR",
      "isForce": false,
      "name": "Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit",
      "priority": 0,
      "issue": "193176",
      "patch_repo": "https://skia.googlesource.com/skia.git",
      "patchset": "2",
      "server": "https://skia-review.googlesource.com",
      "repo": "https://skia.googlesource.com/skia.git",
      "revision": "9883def4f8661f8eec4ccbae2e34d7fcb14bf65d",
      "status": "SUCCESS",
      "taskDimensions": {
        "Build-Debian9-EMCC-wasm-Release-CanvasKit": [
          "cpu:x86-64-Haswell_GCE",
          "gpu:none",
          "machine_type:n1-standard-16",
          "os:Debian-9.8",
          "pool:Skia",
          "docker_installed:true"
        ],
        "Housekeeper-PerCommit-BundleRecipes": [
          "cpu:x86-64-Haswell_GCE",
          "gpu:none",
          "machine_type:n1-highmem-2",
          "os:Debian-9.8",
          "pool:Skia"
        ],
        "Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit": [
          "cpu:x86-64-Haswell_GCE",
          "gpu:none",
          "machine_type:n1-standard-16",
          "os:Debian-9.8",
          "pool:Skia",
          "docker_installed:true"
        ],
        "Upload-Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit": [
          "cpu:x86-64-Haswell_GCE",
          "gpu:none",
          "machine_type:n1-highmem-2",
          "os:Debian-9.8",
          "pool:Skia"
        ]
      },
      "tasks": {
        "Build-Debian9-EMCC-wasm-Release-CanvasKit": [
          {
            "attempt": 0,
            "id": "J1iwABakhHfGNzGc0n0G",
            "max_attempts": 2,
            "status": "SUCCESS",
            "swarmingTaskId": "431ebd696ac4fe10"
          }
        ],
        "Housekeeper-PerCommit-BundleRecipes": [
          {
            "attempt": 0,
            "id": "db0BuaY14LAtgqirQr0h",
            "max_attempts": 2,
            "status": "SUCCESS",
            "swarmingTaskId": "431ebc8bdc182810"
          }
        ],
        "Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit": [
          {
            "attempt": 0,
            "id": "QT5J8rNsgnumXH67JwTr",
            "max_attempts": 2,
            "status": "FAILURE",
            "swarmingTaskId": "431ec237d09f5410"
          },
          {
            "attempt": 1,
            "id": "fmHFVsREalHNMozGW7Pg",
            "max_attempts": 2,
            "status": "SUCCESS",
            "swarmingTaskId": "431ec43eb083e010"
          }
        ],
        "Upload-Test-Debian9-EMCC-GCE-GPU-AVX2-wasm-Release-All-CanvasKit": [
          {
            "attempt": 0,
            "id": "6qz24baK8BCl8ubhKo5K",
            "max_attempts": 2,
            "status": "SUCCESS",
            "swarmingTaskId": "431ec69823433510"
          }
        ]
      },
    };

    // job2 is fake data but is more visually interesting.
    var job2 = {
        "created": (new Date(new Date().getTime() - 5000000)).toUTCString(),
        "dbModified": "2016-10-10T19:56:44.572122663Z",
        "dependencies": {
          "F": ["E"],
          "E": ["B"],
          "D": ["B"],
          "C": ["A"],
          "B": ["A"],
          "A": [],
        },
        "finished": "",
        "id": "20161010T195613.393516175Z_0000000000000048",
        "isForce": false,
        "name": "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-GN",
        "priority": 0.8,
        "issue": "2410843002",
        "patchset": "1",
        "server": "https://codereview.chromium.org",
        "repo": "https://skia.googlesource.com/skia.git",
        "revision": "6ca48820407244bbdeb8f9e0ed7d76dd94270460",
        "status": "",
        "taskDimensions": {
          "A": ["pool:Skia"],
          "B": ["pool:Skia"],
          "C": ["pool:Skia"],
          "D": ["pool:Skia"],
          "E": ["pool:Skia"],
          "F": ["pool:Skia"]
        },
        "tasks": {
          "A": [{
            "id": "A1",
            "status": "SUCCESS",
            "swarmingTaskId": "31cd28b854e04d10",
          }],
          "B": [{
            "id": "B1",
            "status": "FAILURE",
            "swarmingTaskId": "31cd28b854e04d10",
          }, {
            "id": "B2",
            "status": "SUCCESS",
            "swarmingTaskId": "31cd28b854e04d10",
          }],
          "C": [{
            "id": "C1",
            "status": "SUCCESS",
            "swarmingTaskId": "31cd28b854e04d10",
          }],
          "D": [{
            "id": "D1",
            "status": "",
            "swarmingTaskId": "31cd28b854e04d10",
          }],
          "E": [{
            "id": "E1",
            "status": "RUNNING",
            "swarmingTaskId": "31cd28b854e04d10",
          }],
        },
    };

    // Mock out sk.get and so we can fake a response from the server.
    sk.get = function(url) {
      return new Promise(function (resolve, reject) {
        if (url.indexOf("/json/job/") != -1) {
          if (url.indexOf("job1") != -1) {
            resolve(JSON.stringify(job1));
          } else {
            resolve(JSON.stringify(job2));
          }
        } else if (url == "/loginstatus/") {
          resolve('{"Email":"user@google.com","LoginURL":"https://accounts.google.com/"}');
        } else {
          reject("Unknown url " + url);
        }
      });
    };
    sk.post = function(url) {
      return new Promise(function (resolve, reject) {
        var j = job1;
        if (url.indexOf("job1") == -1) {
          j = job2;
        }
        j.status = "CANCELED";
        j.finished = (new Date()).toISOString();
        resolve(JSON.stringify(j));
      });
    };

  </script>
  <link rel="import" href="job-sk.html">
  <link rel="import" href="/res/common/imp/error-toast-sk.html">
  <link rel="import" href="/res/common/imp/login.html">
  <link rel="import" href="/res/imp/bower_components/paper-toggle-button/paper-toggle-button.html" />
</head>
<body>
<dom-module id="job-sk-demo">
  <template>
    Alternate tasks set
    <paper-toggle-button checked="{{alternate}}"></paper-toggle-button>
    <job-sk id="job_sk" swarming-server="chromium-swarm.appspot.com"></job-sk>
  </template>
  <script>
  Polymer({
    is: 'job-sk-demo',

    properties: {
      alternate: {
        type: Boolean,
        value: false,
        observer: "_alternateChanged",
      },
    },

    ready: function() {
      if (this.alternate) {
        this.$.job_sk.jobId = "job1";
      } else {
        this.$.job_sk.jobId = "job2";
      }
    },

    _alternateChanged: function() {
      if (this.alternate) {
        this.$.job_sk.jobId = "job1";
      } else {
        this.$.job_sk.jobId = "job2";
      }
    },
  });
  </script>
</dom-module>
  <login-sk style="display:none"></login-sk>
  <h1>job-sk demo</h1>
  <job-sk-demo></job-sk-demo>
  <error-toast-sk></error-toast-sk>
</body>
</html>
