<!DOCTYPE html>
<meta charset=utf-8>
<title>Cache Storage: Verify credentials are respected by Cache operations</title>
<link rel="help" href="https://w3c.github.io/ServiceWorker/#cache-storage">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./../service-worker/resources/test-helpers.sub.js"></script>
<style>iframe { display: none; }</style>
<script>

var worker = "./resources/credentials-worker.js";
var scope = "./resources/credentials-iframe.html";
promise_test(function(t) {
  return self.caches.delete('credentials')
    .then(function() {
      return service_worker_unregister_and_register(t, worker, scope)
    })
    .then(function(reg) {
      return wait_for_state(t, reg.installing, 'activated');
    })
    .then(function() {
      return with_iframe(scope);
    })
    .then(function(frame) {
      frame.contentWindow.postMessage([
        {name: 'file.txt', username: 'aa', password: 'bb'},
        {name: 'file.txt', username: 'cc', password: 'dd'},
        {name: 'file.txt'}
      ], '*');
      return new Promise(function(resolve, reject) {
        window.onmessage = t.step_func(function(e) {
          resolve(e.data);
        });
      });
    })
    .then(function(data) {
      assert_equals(data.length, 3, 'three entries should be present');
      assert_equals(data.filter(function(url) { return /@/.test(url); }).length, 2,
        'two entries should contain credentials');
      assert_true(data.some(function(url) { return /aa:bb@/.test(url); }),
        'entry with credentials aa:bb should be present');
      assert_true(data.some(function(url) { return /cc:dd@/.test(url); }),
        'entry with credentials cc:dd should be present');
    });
}, "Cache API matching includes credentials");
</script>
