void CefFileDialogRunnerMac::RunOpenFileDialog()

in libcef/browser/native/file_dialog_runner_mac.mm [254:339]


void CefFileDialogRunnerMac::RunOpenFileDialog(
    base::WeakPtr<CefFileDialogRunnerMac> weak_this,
    const CefFileDialogRunner::FileChooserParams& params,
    NSView* view,
    int filter_index) {
  NSOpenPanel* openPanel = [NSOpenPanel openPanel];

  std::u16string title;
  if (!params.title.empty()) {
    title = params.title;
  } else {
    title = l10n_util::GetStringUTF16(
        params.mode == blink::mojom::FileChooserParams::Mode::kOpen
            ? IDS_OPEN_FILE_DIALOG_TITLE
            : (params.mode ==
                       blink::mojom::FileChooserParams::Mode::kOpenMultiple
                   ? IDS_OPEN_FILES_DIALOG_TITLE
                   : IDS_SELECT_FOLDER_DIALOG_TITLE));
  }
  [openPanel setTitle:base::SysUTF16ToNSString(title)];

  std::string filename, directory;
  if (!params.default_file_name.empty()) {
    if (params.mode == blink::mojom::FileChooserParams::Mode::kUploadFolder ||
        params.default_file_name.EndsWithSeparator()) {
      // The value is only a directory.
      directory = params.default_file_name.value();
    } else {
      // The value is a file name and possibly a directory.
      filename = params.default_file_name.BaseName().value();
      directory = params.default_file_name.DirName().value();
    }
  }
  if (!filename.empty()) {
    [openPanel setNameFieldStringValue:base::SysUTF8ToNSString(filename)];
  }
  if (!directory.empty()) {
    [openPanel setDirectoryURL:[NSURL fileURLWithPath:base::SysUTF8ToNSString(
                                                          directory)]];
  }

  CefFilterDelegate* filter_delegate = nil;
  if (params.mode != blink::mojom::FileChooserParams::Mode::kUploadFolder &&
      !params.accept_types.empty()) {
    // Add the file filter control.
    filter_delegate =
        [[CefFilterDelegate alloc] initWithPanel:openPanel
                                andAcceptFilters:params.accept_types
                                  andFilterIndex:filter_index];
  }

  // Further panel configuration.
  [openPanel setAllowsOtherFileTypes:YES];
  [openPanel setAllowsMultipleSelection:
                 (params.mode ==
                  blink::mojom::FileChooserParams::Mode::kOpenMultiple)];
  [openPanel
      setCanChooseFiles:(params.mode !=
                         blink::mojom::FileChooserParams::Mode::kUploadFolder)];
  [openPanel
      setCanChooseDirectories:(params.mode == blink::mojom::FileChooserParams::
                                                  Mode::kUploadFolder)];
  [openPanel setShowsHiddenFiles:!params.hidereadonly];

  // Show panel.
  [openPanel
      beginSheetModalForWindow:[view window]
             completionHandler:^(NSInteger returnCode) {
               int filter_index_to_use = (filter_delegate != nil)
                                             ? [filter_delegate filter]
                                             : filter_index;
               if (returnCode == NSFileHandlingPanelOKButton) {
                 std::vector<base::FilePath> files;
                 files.reserve(openPanel.URLs.count);
                 for (NSURL* url in openPanel.URLs) {
                   if (url.isFileURL)
                     files.push_back(base::FilePath(url.path.UTF8String));
                 }
                 std::move(weak_this->callback_)
                     .Run(filter_index_to_use, files);
               } else {
                 std::move(weak_this->callback_)
                     .Run(filter_index_to_use, std::vector<base::FilePath>());
               }
             }];
}