| Index: content/browser/dom_storage/dom_storage_message_filter.cc
|
| diff --git a/content/browser/dom_storage/dom_storage_message_filter.cc b/content/browser/dom_storage/dom_storage_message_filter.cc
|
| index 15d19b308ec41271a4bd5d5279917adc26d94818..5828984e605f5da3307c89856850454f73da2bdc 100644
|
| --- a/content/browser/dom_storage/dom_storage_message_filter.cc
|
| +++ b/content/browser/dom_storage/dom_storage_message_filter.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/auto_reset.h"
|
| #include "base/bind.h"
|
| #include "base/nullable_string16.h"
|
| +#include "base/process_util.h"
|
| #include "base/threading/sequenced_worker_pool.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "content/public/browser/user_metrics.h"
|
| @@ -16,6 +17,8 @@
|
| #include "webkit/dom_storage/dom_storage_area.h"
|
| #include "webkit/dom_storage/dom_storage_host.h"
|
| #include "webkit/dom_storage/dom_storage_task_runner.h"
|
| +#include "webkit/dom_storage/dom_storage_types.h"
|
| +
|
|
|
| using content::BrowserThread;
|
| using content::UserMetricsAction;
|
| @@ -91,6 +94,7 @@ bool DOMStorageMessageFilter::OnMessageReceived(const IPC::Message& message,
|
| IPC_MESSAGE_HANDLER(DOMStorageHostMsg_Key, OnKey)
|
| IPC_MESSAGE_HANDLER(DOMStorageHostMsg_GetItem, OnGetItem)
|
| IPC_MESSAGE_HANDLER(DOMStorageHostMsg_SetItem, OnSetItem)
|
| + IPC_MESSAGE_HANDLER(DOMStorageHostMsg_SetItemOpt, OnSetItemOpt)
|
| IPC_MESSAGE_HANDLER(DOMStorageHostMsg_SetItemAsync, OnSetItemAsync)
|
| IPC_MESSAGE_HANDLER(DOMStorageHostMsg_RemoveItem, OnRemoveItem)
|
| IPC_MESSAGE_HANDLER(DOMStorageHostMsg_RemoveItemAsync, OnRemoveItemAsync)
|
| @@ -139,9 +143,39 @@ void DOMStorageMessageFilter::OnKey(int connection_id, unsigned index,
|
|
|
| void DOMStorageMessageFilter::OnGetItem(int connection_id,
|
| const string16& key,
|
| + int* ipc_flag,
|
| + base::SharedMemoryHandle* shm_handle,
|
| + unsigned* shm_size,
|
| NullableString16* value) {
|
| DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| *value = host_->GetAreaItem(connection_id, key);
|
| + int value_len = value->string().length()*sizeof(WebKit::WebUChar);
|
| + // small size data, go through channel
|
| + if (value->is_null() || value_len * sizeof(char16)
|
| + < dom_storage::kShmEnableThreshold) {
|
| + *ipc_flag = dom_storage::Channel;
|
| + *shm_size = 0;
|
| + return;
|
| + }
|
| +
|
| + base::SharedMemory shared_buf;
|
| + // try shm for big size data,
|
| + // if fail, go through channel
|
| + if (!shared_buf.CreateAndMapAnonymous(value_len)) {
|
| + *ipc_flag = dom_storage::Channel;
|
| + *shm_size = 0;
|
| + return;
|
| + }
|
| + // go through shm
|
| + shared_buf.Lock();
|
| + memcpy(shared_buf.memory(), value->string().data(), value_len);
|
| + shared_buf.Unlock();
|
| + shared_buf.GiveToProcess(peer_handle(), shm_handle);
|
| + shared_buf.Close();
|
| + *ipc_flag = dom_storage::SharedMemory;
|
| + *shm_size = value->string().length();
|
| + string16 tmp;
|
| + *value = NullableString16(tmp, true);
|
| }
|
|
|
| void DOMStorageMessageFilter::OnSetItem(
|
| @@ -156,6 +190,36 @@ void DOMStorageMessageFilter::OnSetItem(
|
| *result = WebKit::WebStorageArea::ResultBlockedByQuota;
|
| }
|
|
|
| +void DOMStorageMessageFilter::OnSetItemOpt(
|
| + int connection_id, const string16& key,
|
| + const int value_len,
|
| + base::SharedMemoryHandle renderer_handle,
|
| + const GURL& page_url,
|
| + WebKit::WebStorageArea::Result* result,
|
| + NullableString16* old_value) {
|
| + DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + string16 value;
|
| + *old_value = NullableString16(true);
|
| + // get value from shared memory
|
| + if (!base::SharedMemory::IsHandleValid(renderer_handle)) {
|
| + NOTREACHED() << "We got an invalid shared buffer handle!\n";
|
| + return;
|
| + }
|
| +
|
| + base::SharedMemory shared_buf(renderer_handle, true, peer_handle());
|
| + shared_buf.Map(value_len*sizeof(char16));
|
| +
|
| + shared_buf.Lock();
|
| + value.append(static_cast<char16*>(shared_buf.memory()), value_len);
|
| + shared_buf.Unlock();
|
| + shared_buf.Close();
|
| + //
|
| + if (host_->SetAreaItem(connection_id, key, value, page_url, old_value))
|
| + *result = WebKit::WebStorageArea::ResultOK;
|
| + else
|
| + *result = WebKit::WebStorageArea::ResultBlockedByQuota;
|
| +}
|
| +
|
| void DOMStorageMessageFilter::OnSetItemAsync(
|
| int connection_id, int operation_id, const string16& key,
|
| const string16& value, const GURL& page_url) {
|
|
|