Index: content/browser/resources/service_worker/serviceworker_internals.js |
diff --git a/content/browser/resources/service_worker/serviceworker_internals.js b/content/browser/resources/service_worker/serviceworker_internals.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f79b7fe10808de0d867b8c13218cd2b9a9117c56 |
--- /dev/null |
+++ b/content/browser/resources/service_worker/serviceworker_internals.js |
@@ -0,0 +1,88 @@ |
+// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+cr.define('serviceworker', function() { |
+ 'use strict'; |
+ |
+ function update() { |
+ chrome.send('getAllRegistrations'); |
+ } |
+ |
+ function progressNodeFor(link) { |
+ return link.parentNode.querySelector('.operation-status'); |
+ } |
+ |
+ // All commands are sent with the partition_path and scope, and |
+ // are all completed with 'onOperationComplete'. |
+ var COMMANDS = ['unregister', 'start', 'stop']; |
+ function commandHandler(command) { |
+ return function(event) { |
+ var link = event.target; |
+ progressNodeFor(link).style.display = 'inline'; |
+ chrome.send(command, [link.partition_path, |
+ link.scope]); |
+ return false; |
+ }; |
+ }; |
+ |
+ function withNode(selector, partition_path, scope, callback) { |
+ var links = document.querySelectorAll(selector); |
+ for (var i = 0; i < links.length; ++i) { |
+ var link = links[i]; |
+ if (partition_path == link.partition_path && |
+ scope == link.scope) { |
+ callback(link); |
+ } |
+ } |
+ } |
+ |
+ // Fired from the backend after the start call has completed |
+ function onOperationComplete(status, path, scope) { |
+ // refreshes the ui, displaying any relevant buttons |
+ withNode('button', path, scope, function(link) { |
+ progressNodeFor(link).style.display = 'none'; |
+ }); |
+ update(); |
+ } |
+ |
+ // Fired once per partition from the backend. |
+ function onPartitionData(registrations, partition_path) { |
+ var template; |
+ var container = $('serviceworker-list'); |
+ |
+ // Existing templates are keyed by partition_path. This allows |
+ // the UI to be updated in-place rather than refreshing the |
+ // whole page. |
+ for (var i = 0; i < container.childNodes.length; ++i) { |
+ if (container.childNodes[i].partition_path == partition_path) { |
+ template = container.childNodes[i]; |
+ } |
+ } |
+ |
+ // This is probably the first time we're loading. |
+ if (!template) { |
+ template = jstGetTemplate('serviceworker-list-template'); |
+ container.appendChild(template); |
+ } |
+ |
+ jstProcess(new JsEvalContext({ registrations: registrations, |
+ partition_path: partition_path}), |
+ template); |
+ for (var i = 0; i < COMMANDS.length; ++i) { |
+ var handler = commandHandler(COMMANDS[i]); |
+ var links = container.querySelectorAll('button.' + COMMANDS[i]); |
+ for (var j = 0; j < links.length; ++j) { |
+ links[j].addEventListener('click', handler, false); |
+ } |
+ } |
+ } |
+ |
+ return { |
+ update: update, |
+ onOperationComplete: onOperationComplete, |
+ onPartitionData: onPartitionData, |
+ }; |
+}); |
+ |
+document.addEventListener('DOMContentLoaded', serviceworker.update); |