blob: 22da79eb9d519a4100e2e4a9de258e909534349a [file] [log] [blame]
// Copyright 2022 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
const interceptedBody = 'window.activeServiceWorker.postMessage("script-intercepted");';
let shouldIntercept = false;
const postMessage = message => {
const options = {
includeUncontrolled: false, type: 'window'
};
self.clients.matchAll(options).then(clients => {
clients.forEach(c => {
c.postMessage(message);
});
});
};
self.addEventListener("install", event => {
self.skipWaiting();
});
self.addEventListener('activate', event => {
self.clients.claim();
});
let fetchEventCount = 0;
let exceptScriptIntercepted = false;
self.addEventListener('message', event => {
if (event.data === 'start-test') {
shouldIntercept = true;
postMessage({test: 'check-fetch-intercepted'});
return;
}
if (event.data.test === 'check-fetch-intercepted') {
if (interceptedBody !== event.data.result) {
postMessage({test: 'check-fetch-intercepted', result: 'failed'});
return;
}
shouldIntercept = false;
postMessage({test: 'check-fetch-not-intercepted'});
return;
}
if (event.data.test === 'check-fetch-not-intercepted') {
if (interceptedBody === event.data.result) {
postMessage({test: 'check-fetch-not-intercepted', result: 'failed'});
return;
}
shouldIntercept = true;
exceptScriptIntercepted = true;
postMessage({test: 'check-script-intercepted'});
return;
}
if (event.data === 'script-intercepted') {
if (!exceptScriptIntercepted) {
postMessage('script-intercepted-unexpected');
}
shouldIntercept = false;
exceptScriptIntercepted = false;
postMessage({test: 'check-script-not-intercepted'})
return;
}
if (event.data === 'script-not-intercepted') {
if (exceptScriptIntercepted) {
postMessage('script-not-intercepted-unexpected');
return;
}
if (fetchEventCount !== 4) {
postMessage('fetch-event-count-incorrect');
return;
}
postMessage('end-test');
return;
}
postMessage(`${JSON.stringify(event.data)}-unexpected-message`);
});
self.addEventListener('fetch', event => {
fetchEventCount++;
if (shouldIntercept) {
event.respondWith(Promise.resolve(new Response(interceptedBody)));
}
});