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

Unified Diff: trunk/src/content/browser/fileapi/fileapi_message_filter.cc

Issue 60323002: Revert 232547 "Pepper: Move FileIO host from renderer to browser." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 1 month 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 side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698