Index: chrome/renderer/resources/extensions/downloads_custom_bindings.js |
diff --git a/chrome/renderer/resources/extensions/downloads_custom_bindings.js b/chrome/renderer/resources/extensions/downloads_custom_bindings.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fd17af2ed7c94269c9ae05e21bd59e21c1ff02bc |
--- /dev/null |
+++ b/chrome/renderer/resources/extensions/downloads_custom_bindings.js |
@@ -0,0 +1,48 @@ |
+// Copyright (c) 2013 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. |
+ |
+// Custom bindings for the downloads API. |
+ |
+var chromeHidden = requireNative('chrome_hidden').GetChromeHidden(); |
+ |
+chromeHidden.Event.registerArgumentMassager( |
+ 'downloads.onDeterminingFilename', |
+ function massage_determining_filename(args, dispatch) { |
+ var downloadItem = args[0]; |
+ // Copy the id so that extensions can't change it. |
+ var downloadId = downloadItem.id; |
+ var suggestable = true; |
+ function suggestCallback(result) { |
+ if (!suggestable) { |
+ console.error('suggestCallback may not be called more than once.'); |
+ return; |
+ } |
+ suggestable = false; |
+ if ((typeof(result) == 'object') && |
+ result.filename && |
+ (typeof(result.filename) == 'string') && |
+ ((result.overwrite === undefined) || |
+ (typeof(result.overwrite) == 'boolean'))) { |
+ chromeHidden.internalAPIs.downloadsInternal.determineFilename( |
+ downloadId, |
+ result.filename, |
+ result.overwrite || false); |
+ } else { |
+ chromeHidden.internalAPIs.downloadsInternal.determineFilename( |
+ downloadId); |
+ } |
+ } |
+ try { |
+ var results = dispatch([downloadItem, suggestCallback]); |
+ var async = (results && |
+ results.results && |
+ (results.results.length != 0) && |
+ (results.results[0] === true)); |
+ if (suggestable && !async) |
+ suggestCallback(); |
+ } catch (e) { |
+ suggestCallback(); |
+ throw e; |
+ } |
+}); |