summaryrefslogtreecommitdiffstats
path: root/devtools/shared/platform/cache-entry.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--devtools/shared/platform/cache-entry.js118
1 files changed, 118 insertions, 0 deletions
diff --git a/devtools/shared/platform/cache-entry.js b/devtools/shared/platform/cache-entry.js
new file mode 100644
index 0000000000..7efd460ad8
--- /dev/null
+++ b/devtools/shared/platform/cache-entry.js
@@ -0,0 +1,118 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const Services = require("Services");
+const { Ci } = require("chrome");
+loader.lazyRequireGetter(
+ this,
+ "NetworkHelper",
+ "devtools/shared/webconsole/network-helper"
+);
+
+/**
+ * Module to fetch cache objects from CacheStorageService
+ * and return them as an object.
+ */
+exports.CacheEntry = {
+ /**
+ * Flag for cache session being initialized.
+ */
+ isCacheSessionInitialized: false,
+ /**
+ * Cache session object.
+ */
+ cacheSession: null,
+
+ /**
+ * Initializes our cache session / cache storage session.
+ */
+ initializeCacheSession: function(request) {
+ try {
+ const cacheService = Services.cache2;
+ if (cacheService) {
+ let loadContext = NetworkHelper.getRequestLoadContext(request);
+ if (!loadContext) {
+ // Get default load context if we can't fetch.
+ loadContext = Services.loadContextInfo.default;
+ }
+ this.cacheSession = cacheService.diskCacheStorage(loadContext, false);
+ this.isCacheSessionInitialized = true;
+ }
+ } catch (e) {
+ this.isCacheSessionInitialized = false;
+ }
+ },
+
+ /**
+ * Parses a cache descriptor returned from the backend into a
+ * usable object.
+ *
+ * @param Object descriptor The descriptor from the backend.
+ */
+ parseCacheDescriptor: function(descriptor) {
+ const descriptorObj = {};
+ try {
+ if (descriptor.storageDataSize) {
+ descriptorObj.dataSize = descriptor.storageDataSize;
+ }
+ } catch (e) {
+ // We just need to handle this in case it's a js file of 0B.
+ }
+ if (descriptor.expirationTime) {
+ descriptorObj.expires = descriptor.expirationTime;
+ }
+ if (descriptor.fetchCount) {
+ descriptorObj.fetchCount = descriptor.fetchCount;
+ }
+ if (descriptor.lastFetched) {
+ descriptorObj.lastFetched = descriptor.lastFetched;
+ }
+ if (descriptor.lastModified) {
+ descriptorObj.lastModified = descriptor.lastModified;
+ }
+ if (descriptor.deviceID) {
+ descriptorObj.device = descriptor.deviceID;
+ }
+ return descriptorObj;
+ },
+
+ /**
+ * Does the fetch for the cache descriptor from the session.
+ *
+ * @param string request
+ * The request object.
+ * @param Function onCacheDescriptorAvailable
+ * callback function.
+ */
+ getCacheEntry: function(request, onCacheDescriptorAvailable) {
+ if (!this.isCacheSessionInitialized) {
+ this.initializeCacheSession(request);
+ }
+ if (this.cacheSession) {
+ const uri = NetworkHelper.nsIURL(request.URI.spec);
+ this.cacheSession.asyncOpenURI(
+ uri,
+ "",
+ Ci.nsICacheStorage.OPEN_SECRETLY,
+ {
+ onCacheEntryCheck: (entry, appcache) => {
+ return Ci.nsICacheEntryOpenCallback.ENTRY_WANTED;
+ },
+ onCacheEntryAvailable: (descriptor, isnew, appcache, status) => {
+ if (descriptor) {
+ const descriptorObj = this.parseCacheDescriptor(descriptor);
+ onCacheDescriptorAvailable(descriptorObj);
+ } else {
+ onCacheDescriptorAvailable(null);
+ }
+ },
+ }
+ );
+ } else {
+ onCacheDescriptorAvailable(null);
+ }
+ },
+};