910e62b5创建于 1月15日历史提交
// 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.

const downloadsInternal = getInternalApi('downloadsInternal');

bindingUtil.registerEventArgumentMassager(
    'downloads.onDeterminingFilename', function(args, dispatch) {
      const downloadItem = args[0];
      // Copy the id so that extensions can't change it.
      const downloadId = downloadItem.id;
      let 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 {
        const results = dispatch([downloadItem, suggestCallback]);
        const async =
            (results && results.results && (results.results.length !== 0) &&
             (results.results[0] === true));
        if (suggestable && !async) {
          suggestCallback();
        }
      } catch (e) {
        suggestCallback();
        throw e;
      }
    });