Always fall back to OpenFolderViaShell when trying to reveal a file

We should always fallback to OpenFolderViaShell when revealing a file fails,
since this API seems to be highly subject to Random Bad Things happening to
you.
This commit is contained in:
Paul Betts 2016-01-13 12:26:57 -08:00 committed by Cheng Zhao
parent d195cc3796
commit 05aeceeb52

View file

@ -238,7 +238,7 @@ void ShowItemInFolder(const base::FilePath& full_path) {
(GetProcAddress(shell32_base, "SHOpenFolderAndSelectItems")); (GetProcAddress(shell32_base, "SHOpenFolderAndSelectItems"));
} }
if (!open_folder_and_select_itemsPtr) { if (!open_folder_and_select_itemsPtr) {
ShellExecute(NULL, L"open", dir.value().c_str(), NULL, NULL, SW_SHOW); ui::win::OpenFolderViaShell(dir);
return; return;
} }
@ -251,15 +251,19 @@ void ShowItemInFolder(const base::FilePath& full_path) {
hr = desktop->ParseDisplayName(NULL, NULL, hr = desktop->ParseDisplayName(NULL, NULL,
const_cast<wchar_t *>(dir.value().c_str()), const_cast<wchar_t *>(dir.value().c_str()),
NULL, &dir_item, NULL); NULL, &dir_item, NULL);
if (FAILED(hr)) if (FAILED(hr)) {
ui::win::OpenFolderViaShell(dir);
return; return;
}
base::win::ScopedCoMem<ITEMIDLIST> file_item; base::win::ScopedCoMem<ITEMIDLIST> file_item;
hr = desktop->ParseDisplayName(NULL, NULL, hr = desktop->ParseDisplayName(NULL, NULL,
const_cast<wchar_t *>(full_path.value().c_str()), const_cast<wchar_t *>(full_path.value().c_str()),
NULL, &file_item, NULL); NULL, &file_item, NULL);
if (FAILED(hr)) if (FAILED(hr)) {
ui::win::OpenFolderViaShell(dir);
return; return;
}
const ITEMIDLIST* highlight[] = { file_item }; const ITEMIDLIST* highlight[] = { file_item };
@ -271,7 +275,7 @@ void ShowItemInFolder(const base::FilePath& full_path) {
// found" even though the file is there. In these cases, ShellExecute() // found" even though the file is there. In these cases, ShellExecute()
// seems to work as a fallback (although it won't select the file). // seems to work as a fallback (although it won't select the file).
if (hr == ERROR_FILE_NOT_FOUND) { if (hr == ERROR_FILE_NOT_FOUND) {
ShellExecute(NULL, L"open", dir.value().c_str(), NULL, NULL, SW_SHOW); ui::win::OpenFolderViaShell(dir);
} else { } else {
LPTSTR message = NULL; LPTSTR message = NULL;
DWORD message_length = FormatMessage( DWORD message_length = FormatMessage(
@ -284,6 +288,8 @@ void ShowItemInFolder(const base::FilePath& full_path) {
<< " " << reinterpret_cast<LPTSTR>(&message); << " " << reinterpret_cast<LPTSTR>(&message);
if (message) if (message)
LocalFree(message); LocalFree(message);
ui::win::OpenFolderViaShell(dir);
} }
} }
} }