| // Copyright 2013 The Chromium Authors |
| // 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 downloadsInternal = getInternalApi('downloadsInternal'); |
| |
| bindingUtil.registerEventArgumentMassager('downloads.onDeterminingFilename', |
| function(args, dispatch) { |
| var downloadItem = args[0]; |
| // Copy the id so that extensions can't change it. |
| var downloadId = downloadItem.id; |
| var suggestable = true; |
| function isValidResult(result) { |
| if (result === undefined) |
| return false; |
| if (typeof result !== 'object') { |
| console.error( |
| 'Error: Invocation of form suggest(' + typeof result + |
| ') doesn\'t match definition suggest({filename: string, ' + |
| 'conflictAction: string})'); |
| return false; |
| } else if ( |
| typeof result.filename !== 'string' || result.filename.length === 0) { |
| console.error('Error: "filename" parameter to suggest() must be a ' + |
| 'non-empty string'); |
| return false; |
| } else if ([ |
| undefined, 'uniquify', 'overwrite', 'prompt' |
| ].indexOf(result.conflictAction) < 0) { |
| console.error('Error: "conflictAction" parameter to suggest() must be ' + |
| 'one of undefined, "uniquify", "overwrite", "prompt"'); |
| return false; |
| } |
| return true; |
| } |
| function suggestCallback(result) { |
| if (!suggestable) { |
| console.error('suggestCallback may not be called more than once.'); |
| return; |
| } |
| suggestable = false; |
| if (isValidResult(result)) { |
| downloadsInternal.determineFilename( |
| downloadId, result.filename, result.conflictAction || ""); |
| } else { |
| 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; |
| } |
| }); |