Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(578)

Unified Diff: extensions/renderer/resources/file_entry_binding_util.js

Issue 2895493004: [Extensions Bindings] Move directory util out of runtime_custom_bindings (Closed)
Patch Set: . Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: extensions/renderer/resources/file_entry_binding_util.js
diff --git a/chrome/renderer/resources/extensions/file_entry_binding_util.js b/extensions/renderer/resources/file_entry_binding_util.js
similarity index 70%
rename from chrome/renderer/resources/extensions/file_entry_binding_util.js
rename to extensions/renderer/resources/file_entry_binding_util.js
index e6c477235598a6360473e68024b3f517b9b07f9b..6ae219cfca387a29609fafc86fd9ccda8888608b 100644
--- a/chrome/renderer/resources/extensions/file_entry_binding_util.js
+++ b/extensions/renderer/resources/file_entry_binding_util.js
@@ -10,6 +10,16 @@ var GetModuleSystem = requireNative('v8_context').GetModuleSystem;
var GetExtensionViews = requireNative('runtime').GetExtensionViews;
var safeCallbackApply = require('uncaught_exception_handler').safeCallbackApply;
+var WINDOW = {};
+try {
+ WINDOW = window;
+} catch (e) {
+ // Running in SW context.
+ // TODO(lazyboy): Synchronous access to background page is not possible from
+ // service worker context. Decide what we should do in this case for the class
+ // of APIs that require access to background page or window object
+}
+
// For a given |apiName|, generates object with two elements that are used
// in file system relayed APIs:
// * 'bindFileEntryCallback' function that provides mapping between JS objects
@@ -18,14 +28,14 @@ var safeCallbackApply = require('uncaught_exception_handler').safeCallbackApply;
// previously saved file entries.
function getFileBindingsForApi(apiName) {
// Fallback to using the current window if no background page is running.
- var backgroundPage = GetExtensionViews(-1, -1, 'BACKGROUND')[0] || window;
+ var backgroundPage = GetExtensionViews(-1, -1, 'BACKGROUND')[0] || WINDOW;
var backgroundPageModuleSystem = GetModuleSystem(backgroundPage);
// All windows use the bindFileEntryCallback from the background page so their
// FileEntry objects have the background page's context as their own. This
// allows them to be used from other windows (including the background page)
// after the original window is closed.
- if (window == backgroundPage) {
+ if (WINDOW == backgroundPage) {
var bindFileEntryCallback = function(functionName, apiFunctions) {
apiFunctions.setCustomCallback(functionName,
function(name, request, callback, response) {
@@ -118,4 +128,51 @@ function getFileBindingsForApi(apiName) {
entryIdManager: entryIdManager};
}
+function getBindDirectoryEntryCallback() {
+ // Get the background page if one exists. Otherwise, default to the current
+ // window.
+ var backgroundPage = GetExtensionViews(-1, -1, 'BACKGROUND')[0] || WINDOW;
+
+ // For packaged apps, all windows use the bindFileEntryCallback from the
+ // background page so their FileEntry objects have the background page's
+ // context as their own. This allows them to be used from other windows
+ // (including the background page) after the original window is closed.
+ if (WINDOW == backgroundPage) {
+ return function(name, request, callback, response) {
+ if (callback) {
+ if (!response) {
+ callback();
+ return;
+ }
+ var fileSystemId = response.fileSystemId;
+ var baseName = response.baseName;
+ var fs = GetIsolatedFileSystem(fileSystemId);
+
+ try {
+ fs.root.getDirectory(baseName, {}, callback, function(fileError) {
+ lastError.run('runtime.' + functionName,
+ 'Error getting Entry, code: ' + fileError.code,
+ request.stack,
+ callback);
+ });
+ } catch (e) {
+ lastError.run('runtime.' + functionName,
+ 'Error: ' + e.stack,
+ request.stack,
+ callback);
+ }
+ }
+ }
+ } else {
+ var backgroundPageModuleSystem = GetModuleSystem(backgroundPage);
+ // Force the runtime API to be loaded in the background page. Using
+ // backgroundPageModuleSystem.require('runtime') is insufficient as
+ // requireNative is only allowed while lazily loading an API.
+ backgroundPage.chrome.runtime;
+ return backgroundPageModuleSystem.require('fileEntryBindingUtil')
+ .getBindDirectoryEntryCallback();
+ }
+}
+
exports.$set('getFileBindingsForApi', getFileBindingsForApi);
+exports.$set('getBindDirectoryEntryCallback', getBindDirectoryEntryCallback);

Powered by Google App Engine
This is Rietveld 408576698