Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Side by Side Diff: chrome/browser/extensions/extension_file_browser_private_api.cc

Issue 7108066: CrOS - Fix crash when pressing Enter in file browser dialog (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase, address comments Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/extension_file_browser_private_api.h" 5 #include "chrome/browser/extensions/extension_file_browser_private_api.h"
6 6
7 #include "base/base64.h" 7 #include "base/base64.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/json/json_writer.h" 9 #include "base/json/json_writer.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 if (contents) 902 if (contents)
903 tab_id = ExtensionTabUtil::GetTabId(contents); 903 tab_id = ExtensionTabUtil::GetTabId(contents);
904 } 904 }
905 return tab_id; 905 return tab_id;
906 } 906 }
907 907
908 const FileDialogFunction::Callback& FileDialogFunction::GetCallback() const { 908 const FileDialogFunction::Callback& FileDialogFunction::GetCallback() const {
909 return Callback::Find(GetTabId()); 909 return Callback::Find(GetTabId());
910 } 910 }
911 911
912 void FileDialogFunction::RemoveCallback() {
913 // Listeners expect to be invoked exactly once, so we need to remove our
914 // callback objects afterwards.
915 Callback::Remove(GetTabId());
916 }
917
912 // GetFileSystemRootPathOnFileThread can only be called from the file thread, 918 // GetFileSystemRootPathOnFileThread can only be called from the file thread,
913 // so here we are. This function takes a vector of virtual paths, converts 919 // so here we are. This function takes a vector of virtual paths, converts
914 // them to local paths and calls GetLocalPathsResponseOnUIThread with the 920 // them to local paths and calls GetLocalPathsResponseOnUIThread with the
915 // result vector, on the UI thread. 921 // result vector, on the UI thread.
916 void FileDialogFunction::GetLocalPathsOnFileThread(const UrlList& file_urls, 922 void FileDialogFunction::GetLocalPathsOnFileThread(const UrlList& file_urls,
917 const std::string& task_id) { 923 const std::string& task_id) {
918 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 924 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
919 FilePathList selected_files; 925 FilePathList selected_files;
920 926
921 // FilePath(virtual_path) doesn't work on win, so limit this to ChromeOS. 927 // FilePath(virtual_path) doesn't work on win, so limit this to ChromeOS.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 return; 994 return;
989 } 995 }
990 int index; 996 int index;
991 args_->GetInteger(1, &index); 997 args_->GetInteger(1, &index);
992 const Callback& callback = GetCallback(); 998 const Callback& callback = GetCallback();
993 DCHECK(!callback.IsNull()); 999 DCHECK(!callback.IsNull());
994 if (!callback.IsNull()) { 1000 if (!callback.IsNull()) {
995 callback.listener()->FileSelected(files[0], 1001 callback.listener()->FileSelected(files[0],
996 index, 1002 index,
997 callback.params()); 1003 callback.params());
1004 RemoveCallback(); // Listeners expect to be invoked exactly once.
998 } 1005 }
999 SendResponse(true); 1006 SendResponse(true);
1000 } 1007 }
1001 1008
1002 1009
1003 ViewFilesFunction::ViewFilesFunction() { 1010 ViewFilesFunction::ViewFilesFunction() {
1004 } 1011 }
1005 1012
1006 ViewFilesFunction::~ViewFilesFunction() { 1013 ViewFilesFunction::~ViewFilesFunction() {
1007 } 1014 }
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 } 1089 }
1083 1090
1084 void SelectFilesFunction::GetLocalPathsResponseOnUIThread( 1091 void SelectFilesFunction::GetLocalPathsResponseOnUIThread(
1085 const FilePathList& files, const std::string& internal_task_id) { 1092 const FilePathList& files, const std::string& internal_task_id) {
1086 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1093 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1087 1094
1088 const Callback& callback = GetCallback(); 1095 const Callback& callback = GetCallback();
1089 DCHECK(!callback.IsNull()); 1096 DCHECK(!callback.IsNull());
1090 if (!callback.IsNull()) { 1097 if (!callback.IsNull()) {
1091 callback.listener()->MultiFilesSelected(files, callback.params()); 1098 callback.listener()->MultiFilesSelected(files, callback.params());
1099 RemoveCallback(); // Listeners expect to be invoked exactly once.
1092 } 1100 }
1093 SendResponse(true); 1101 SendResponse(true);
1094 } 1102 }
1095 1103
1096 bool CancelFileDialogFunction::RunImpl() { 1104 bool CancelFileDialogFunction::RunImpl() {
1097 const Callback& callback = GetCallback(); 1105 const Callback& callback = GetCallback();
1098 DCHECK(!callback.IsNull()); 1106 DCHECK(!callback.IsNull());
1099 if (!callback.IsNull()) { 1107 if (!callback.IsNull()) {
1100 callback.listener()->FileSelectionCanceled(callback.params()); 1108 callback.listener()->FileSelectionCanceled(callback.params());
1109 RemoveCallback(); // Listeners expect to be invoked exactly once.
1101 } 1110 }
1102 SendResponse(true); 1111 SendResponse(true);
1103 return true; 1112 return true;
1104 } 1113 }
1105 1114
1106 bool FileDialogStringsFunction::RunImpl() { 1115 bool FileDialogStringsFunction::RunImpl() {
1107 result_.reset(new DictionaryValue()); 1116 result_.reset(new DictionaryValue());
1108 DictionaryValue* dict = reinterpret_cast<DictionaryValue*>(result_.get()); 1117 DictionaryValue* dict = reinterpret_cast<DictionaryValue*>(result_.get());
1109 1118
1110 #define SET_STRING(ns, id) \ 1119 #define SET_STRING(ns, id) \
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1182 #undef SET_STRING 1191 #undef SET_STRING
1183 1192
1184 // TODO(serya): Create a new string in .grd file for this one in M13. 1193 // TODO(serya): Create a new string in .grd file for this one in M13.
1185 dict->SetString("PREVIEW_IMAGE", 1194 dict->SetString("PREVIEW_IMAGE",
1186 l10n_util::GetStringUTF16(IDS_CERT_MANAGER_VIEW_CERT_BUTTON)); 1195 l10n_util::GetStringUTF16(IDS_CERT_MANAGER_VIEW_CERT_BUTTON));
1187 dict->SetString("PLAY_MEDIA", 1196 dict->SetString("PLAY_MEDIA",
1188 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAY)); 1197 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAY));
1189 1198
1190 return true; 1199 return true;
1191 } 1200 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698