summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-14 00:21:47 +0000
committerjianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-14 00:21:47 +0000
commit564551a2ece790b22fd2a70aeb8591805fe943be (patch)
tree4a488ae255344ea3c84e34976816508a23d228e0
parentfa6797241c533cc2c2ce0504f68decdea990c59f (diff)
downloadchromium_src-564551a2ece790b22fd2a70aeb8591805fe943be.zip
chromium_src-564551a2ece790b22fd2a70aeb8591805fe943be.tar.gz
chromium_src-564551a2ece790b22fd2a70aeb8591805fe943be.tar.bz2
Fix the problem that FileReader does not work on Mac/Linux. The fix
is to pass the file handle with magic FileDescriptor over IPC for POSIX. BUG=none TEST=none Review URL: http://codereview.chromium.org/2123001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47227 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/renderer_host/resource_message_filter.cc20
-rw-r--r--chrome/common/render_messages_internal.h2
-rw-r--r--chrome/renderer/renderer_webkitclient_impl.cc10
3 files changed, 23 insertions, 9 deletions
diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc
index 791cd5b..f27ee9b 100644
--- a/chrome/browser/renderer_host/resource_message_filter.cc
+++ b/chrome/browser/renderer_host/resource_message_filter.cc
@@ -7,6 +7,9 @@
#include "app/clipboard/clipboard.h"
#include "base/callback.h"
#include "base/command_line.h"
+#if defined(OS_POSIX)
+#include "base/file_descriptor_posix.h"
+#endif
#include "base/file_util.h"
#include "base/histogram.h"
#include "base/process_util.h"
@@ -1385,7 +1388,13 @@ void ResourceMessageFilter::OnOpenFile(const FilePath& path,
// TODO(jianli): Do we need separate permission to control opening the file?
if (!ChildProcessSecurityPolicy::GetInstance()->CanUploadFile(id(), path)) {
ViewHostMsg_OpenFile::WriteReplyParams(
- reply_msg, base::kInvalidPlatformFileValue);
+ reply_msg,
+#if defined(OS_WIN)
+ base::kInvalidPlatformFileValue
+#elif defined(OS_POSIX)
+ base::FileDescriptor(base::kInvalidPlatformFileValue, true)
+#endif
+ );
Send(reply_msg);
return;
}
@@ -1424,7 +1433,14 @@ void ResourceMessageFilter::OnOpenFileOnFileThread(const FilePath& path,
target_file_handle = file_handle;
#endif
- ViewHostMsg_OpenFile::WriteReplyParams(reply_msg, target_file_handle);
+ ViewHostMsg_OpenFile::WriteReplyParams(
+ reply_msg,
+#if defined(OS_WIN)
+ target_file_handle
+#elif defined(OS_POSIX)
+ base::FileDescriptor(target_file_handle, true)
+#endif
+ );
ChromeThread::PostTask(
ChromeThread::IO, FROM_HERE,
diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h
index 109c8b7..a4646ae 100644
--- a/chrome/common/render_messages_internal.h
+++ b/chrome/common/render_messages_internal.h
@@ -2148,7 +2148,7 @@ IPC_BEGIN_MESSAGES(ViewHost)
IPC_SYNC_MESSAGE_CONTROL2_1(ViewHostMsg_OpenFile,
FilePath /* path */,
int /* mode */,
- base::PlatformFile /* result */)
+ IPC::PlatformFileForTransit /* result */)
// Sent by the renderer process to acknowledge receipt of a
// ViewMsg_CSSInsertRequest message and css has been inserted into the frame.
diff --git a/chrome/renderer/renderer_webkitclient_impl.cc b/chrome/renderer/renderer_webkitclient_impl.cc
index a1e8a30..0846df1 100644
--- a/chrome/renderer/renderer_webkitclient_impl.cc
+++ b/chrome/renderer/renderer_webkitclient_impl.cc
@@ -244,12 +244,10 @@ bool RendererWebKitClientImpl::FileSystem::getFileModificationTime(
base::PlatformFile RendererWebKitClientImpl::FileSystem::openFile(
const WebString& path,
int mode) {
- base::PlatformFile handle;
- if (!SendSyncMessageFromAnyThread(new ViewHostMsg_OpenFile(
- webkit_glue::WebStringToFilePath(path), mode, &handle))) {
- handle = base::kInvalidPlatformFileValue;
- }
- return handle;
+ IPC::PlatformFileForTransit handle = IPC::InvalidPlatformFileForTransit();
+ SendSyncMessageFromAnyThread(new ViewHostMsg_OpenFile(
+ webkit_glue::WebStringToFilePath(path), mode, &handle));
+ return IPC::PlatformFileForTransitToPlatformFile(handle);
}
//------------------------------------------------------------------------------