Index: trunk/src/content/browser/fileapi/fileapi_message_filter.cc |
=================================================================== |
--- trunk/src/content/browser/fileapi/fileapi_message_filter.cc (revision 233010) |
+++ trunk/src/content/browser/fileapi/fileapi_message_filter.cc (working copy) |
@@ -34,6 +34,7 @@ |
#include "webkit/browser/fileapi/file_permission_policy.h" |
#include "webkit/browser/fileapi/file_system_context.h" |
#include "webkit/browser/fileapi/isolated_context.h" |
+#include "webkit/browser/quota/quota_manager.h" |
#include "webkit/common/blob/blob_data.h" |
#include "webkit/common/blob/shareable_file_reference.h" |
#include "webkit/common/fileapi/directory_entry.h" |
@@ -41,10 +42,17 @@ |
#include "webkit/common/fileapi/file_system_types.h" |
#include "webkit/common/fileapi/file_system_util.h" |
+#if defined(ENABLE_PLUGINS) |
+#include "content/browser/renderer_host/pepper/pepper_security_helper.h" |
+#include "ppapi/shared_impl/file_type_conversion.h" |
+#endif // defined(ENABLE_PLUGINS) |
+ |
using fileapi::FileSystemFileUtil; |
using fileapi::FileSystemBackend; |
using fileapi::FileSystemOperation; |
using fileapi::FileSystemURL; |
+using fileapi::FileUpdateObserver; |
+using fileapi::UpdateObserverList; |
using webkit_blob::BlobData; |
using webkit_blob::BlobStorageContext; |
using webkit_blob::BlobStorageHost; |
@@ -126,6 +134,22 @@ |
in_transit_snapshot_files_.clear(); |
+ // Close all files that are previously OpenFile()'ed in this process. |
+ if (!on_close_callbacks_.IsEmpty()) { |
+ DLOG(INFO) |
+ << "File API: Renderer process shut down before NotifyCloseFile" |
+ << " for " << on_close_callbacks_.size() << " files opened in PPAPI"; |
+ } |
+ |
+ for (OnCloseCallbackMap::iterator itr(&on_close_callbacks_); |
+ !itr.IsAtEnd(); itr.Advance()) { |
+ const base::Closure* callback = itr.GetCurrentValue(); |
+ DCHECK(callback); |
+ if (!callback->is_null()) |
+ callback->Run(); |
+ } |
+ |
+ on_close_callbacks_.Clear(); |
operation_runner_.reset(); |
operations_.clear(); |
} |
@@ -156,10 +180,16 @@ |
IPC_MESSAGE_HANDLER(FileSystemHostMsg_Truncate, OnTruncate) |
IPC_MESSAGE_HANDLER(FileSystemHostMsg_TouchFile, OnTouchFile) |
IPC_MESSAGE_HANDLER(FileSystemHostMsg_CancelWrite, OnCancel) |
+#if defined(ENABLE_PLUGINS) |
+ IPC_MESSAGE_HANDLER(FileSystemHostMsg_OpenPepperFile, OnOpenPepperFile) |
+#endif // defined(ENABLE_PLUGINS) |
+ IPC_MESSAGE_HANDLER(FileSystemHostMsg_NotifyCloseFile, OnNotifyCloseFile) |
IPC_MESSAGE_HANDLER(FileSystemHostMsg_CreateSnapshotFile, |
OnCreateSnapshotFile) |
IPC_MESSAGE_HANDLER(FileSystemHostMsg_DidReceiveSnapshotFile, |
OnDidReceiveSnapshotFile) |
+ IPC_MESSAGE_HANDLER(FileSystemHostMsg_WillUpdate, OnWillUpdate) |
+ IPC_MESSAGE_HANDLER(FileSystemHostMsg_DidUpdate, OnDidUpdate) |
IPC_MESSAGE_HANDLER(FileSystemHostMsg_SyncGetPlatformPath, |
OnSyncGetPlatformPath) |
IPC_MESSAGE_HANDLER(BlobHostMsg_StartBuilding, OnStartBuildingBlob) |
@@ -466,6 +496,84 @@ |
} |
} |
+#if defined(ENABLE_PLUGINS) |
+void FileAPIMessageFilter::OnOpenPepperFile( |
+ int request_id, const GURL& path, int pp_open_flags) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+FileSystemURL url(context_->CrackURL(path)); |
+ if (!ValidateFileSystemURL(request_id, url)) |
+ return; |
+ if (!CanOpenFileSystemURLWithPepperFlags(pp_open_flags, process_id_, url)) { |
+ Send(new FileSystemMsg_DidFail( |
+ request_id, base::PLATFORM_FILE_ERROR_SECURITY)); |
+ return; |
+ } |
+ |
+ quota::QuotaLimitType quota_policy = quota::kQuotaLimitTypeUnknown; |
+ quota::QuotaManagerProxy* quota_manager_proxy = |
+ context_->quota_manager_proxy(); |
+ CHECK(quota_manager_proxy); |
+ CHECK(quota_manager_proxy->quota_manager()); |
+ |
+ if (quota_manager_proxy->quota_manager()->IsStorageUnlimited( |
+ url.origin(), FileSystemTypeToQuotaStorageType(url.type()))) { |
+ quota_policy = quota::kQuotaLimitTypeUnlimited; |
+ } else { |
+ quota_policy = quota::kQuotaLimitTypeLimited; |
+ } |
+ |
+ int platform_file_flags = 0; |
+ if (!ppapi::PepperFileOpenFlagsToPlatformFileFlags(pp_open_flags, |
+ &platform_file_flags)) { |
+ // |pp_open_flags| should have already been checked in PepperFileIOHost. |
+ NOTREACHED() << "Open file request with invalid pp_open_flags ignored."; |
+ } |
+ |
+ operations_[request_id] = operation_runner()->OpenFile( |
+ url, platform_file_flags, PeerHandle(), |
+ base::Bind(&FileAPIMessageFilter::DidOpenFile, this, request_id, |
+ quota_policy)); |
+} |
+#endif // defined(ENABLE_PLUGINS) |
+ |
+void FileAPIMessageFilter::OnNotifyCloseFile(int file_open_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ // Remove |file_open_id| from the map of |on_close_callback|s. |
+ // It must only be called for a ID that is successfully opened and enrolled in |
+ // DidOpenFile. |
+ base::Closure* on_close_callback = on_close_callbacks_.Lookup(file_open_id); |
+ if (on_close_callback && !on_close_callback->is_null()) { |
+ on_close_callback->Run(); |
+ on_close_callbacks_.Remove(file_open_id); |
+ } |
+} |
+ |
+void FileAPIMessageFilter::OnWillUpdate(const GURL& path) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ FileSystemURL url(context_->CrackURL(path)); |
+ if (!url.is_valid()) |
+ return; |
+ const UpdateObserverList* observers = |
+ context_->GetUpdateObservers(url.type()); |
+ if (!observers) |
+ return; |
+ observers->Notify(&FileUpdateObserver::OnStartUpdate, MakeTuple(url)); |
+} |
+ |
+void FileAPIMessageFilter::OnDidUpdate(const GURL& path, int64 delta) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ FileSystemURL url(context_->CrackURL(path)); |
+ if (!url.is_valid()) |
+ return; |
+ const UpdateObserverList* observers = |
+ context_->GetUpdateObservers(url.type()); |
+ if (!observers) |
+ return; |
+ observers->Notify(&FileUpdateObserver::OnUpdate, MakeTuple(url, delta)); |
+ observers->Notify(&FileUpdateObserver::OnEndUpdate, MakeTuple(url)); |
+} |
+ |
void FileAPIMessageFilter::OnSyncGetPlatformPath( |
const GURL& path, base::FilePath* platform_path) { |
SyncGetPlatformPath(context_, process_id_, path, platform_path); |
@@ -707,6 +815,31 @@ |
operations_.erase(request_id); |
} |
+void FileAPIMessageFilter::DidOpenFile(int request_id, |
+ quota::QuotaLimitType quota_policy, |
+ base::PlatformFileError result, |
+ base::PlatformFile file, |
+ const base::Closure& on_close_callback, |
+ base::ProcessHandle peer_handle) { |
+ if (result == base::PLATFORM_FILE_OK) { |
+ IPC::PlatformFileForTransit file_for_transit = |
+ file != base::kInvalidPlatformFileValue ? |
+ IPC::GetFileHandleForProcess(file, peer_handle, true) : |
+ IPC::InvalidPlatformFileForTransit(); |
+ int file_open_id = on_close_callbacks_.Add( |
+ new base::Closure(on_close_callback)); |
+ |
+ Send(new FileSystemMsg_DidOpenFile(request_id, |
+ file_for_transit, |
+ file_open_id, |
+ quota_policy)); |
+ } else { |
+ Send(new FileSystemMsg_DidFail(request_id, |
+ result)); |
+ } |
+ operations_.erase(request_id); |
+} |
+ |
void FileAPIMessageFilter::DidWrite(int request_id, |
base::PlatformFileError result, |
int64 bytes, |