| Index: content/renderer/dom_storage/webstoragearea_impl.cc
 | 
| ===================================================================
 | 
| --- content/renderer/dom_storage/webstoragearea_impl.cc	(revision 138129)
 | 
| +++ content/renderer/dom_storage/webstoragearea_impl.cc	(working copy)
 | 
| @@ -9,98 +9,70 @@
 | 
|  #include "base/time.h"
 | 
|  #include "base/utf_string_conversions.h"
 | 
|  #include "content/common/dom_storage_messages.h"
 | 
| +#include "content/renderer/dom_storage/dom_storage_dispatcher.h"
 | 
|  #include "content/renderer/render_thread_impl.h"
 | 
|  #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURL.h"
 | 
| -#include "webkit/dom_storage/dom_storage_types.h"
 | 
| +#include "webkit/dom_storage/dom_storage_cached_area.h"
 | 
|  
 | 
| +using dom_storage::DomStorageCachedArea;
 | 
|  using WebKit::WebString;
 | 
|  using WebKit::WebURL;
 | 
|  
 | 
| +namespace {
 | 
|  typedef IDMap<WebStorageAreaImpl> AreaImplMap;
 | 
| -
 | 
| -static base::LazyInstance<AreaImplMap>::Leaky
 | 
| +base::LazyInstance<AreaImplMap>::Leaky
 | 
|      g_all_areas_map = LAZY_INSTANCE_INITIALIZER;
 | 
|  
 | 
| +DomStorageDispatcher* dispatcher() {
 | 
| +  return RenderThreadImpl::current()->dom_storage_dispatcher();
 | 
| +}
 | 
| +}  // namespace
 | 
| +
 | 
|  // static
 | 
| -WebStorageAreaImpl* WebStorageAreaImpl::FromConnectionId(
 | 
| -    int id) {
 | 
| +WebStorageAreaImpl* WebStorageAreaImpl::FromConnectionId(int id) {
 | 
|    return g_all_areas_map.Pointer()->Lookup(id);
 | 
|  }
 | 
|  
 | 
|  WebStorageAreaImpl::WebStorageAreaImpl(
 | 
|      int64 namespace_id, const GURL& origin)
 | 
|      : ALLOW_THIS_IN_INITIALIZER_LIST(
 | 
| -          connection_id_(g_all_areas_map.Pointer()->Add(this))) {
 | 
| -  DCHECK(connection_id_);
 | 
| -  RenderThreadImpl::current()->Send(
 | 
| -      new DOMStorageHostMsg_OpenStorageArea(
 | 
| -          connection_id_, namespace_id, origin));
 | 
| +          connection_id_(g_all_areas_map.Pointer()->Add(this))),
 | 
| +      cached_area_(dispatcher()->
 | 
| +          OpenCachedArea(connection_id_, namespace_id, origin)) {
 | 
|  }
 | 
|  
 | 
|  WebStorageAreaImpl::~WebStorageAreaImpl() {
 | 
|    g_all_areas_map.Pointer()->Remove(connection_id_);
 | 
| -  RenderThreadImpl::current()->Send(
 | 
| -      new DOMStorageHostMsg_CloseStorageArea(connection_id_));
 | 
| +  if (dispatcher())
 | 
| +    dispatcher()->CloseCachedArea(connection_id_, cached_area_);
 | 
|  }
 | 
|  
 | 
| -// In November 2011 stats were recorded about performance of each of the
 | 
| -// DOMStorage operations. Results of median, 99% quantile, and 99.9% quantile
 | 
| -// are provided in milliseconds. The ratio of number of calls for each operation
 | 
| -// relative to the number of calls to getItem is also provided.
 | 
| -//
 | 
| -// Operation    Freq     50%     99%     99.9%
 | 
| -// -------------------------------------------
 | 
| -// getItem      1.00     0.6     2.0     27.9
 | 
| -// setItem      .029     0.7     13.6    114.9
 | 
| -// removeItem   .003     0.9     11.8    90.7
 | 
| -// length       .017     0.6     2.0     12.0
 | 
| -// key          .591     0.6     2.0     29.9
 | 
| -// clear        1e-6     1.0     32.4    605.2
 | 
| -
 | 
|  unsigned WebStorageAreaImpl::length() {
 | 
| -  unsigned length;
 | 
| -  RenderThreadImpl::current()->Send(
 | 
| -      new DOMStorageHostMsg_Length(connection_id_, &length));
 | 
| -  return length;
 | 
| +  return cached_area_->GetLength(connection_id_);
 | 
|  }
 | 
|  
 | 
|  WebString WebStorageAreaImpl::key(unsigned index) {
 | 
| -  NullableString16 key;
 | 
| -  RenderThreadImpl::current()->Send(
 | 
| -      new DOMStorageHostMsg_Key(connection_id_, index, &key));
 | 
| -  return key;
 | 
| +  return cached_area_->GetKey(connection_id_, index);
 | 
|  }
 | 
|  
 | 
|  WebString WebStorageAreaImpl::getItem(const WebString& key) {
 | 
| -  NullableString16 value;
 | 
| -  RenderThreadImpl::current()->Send(
 | 
| -      new DOMStorageHostMsg_GetItem(connection_id_, key, &value));
 | 
| -  return value;
 | 
| +  return cached_area_->GetItem(connection_id_, key);
 | 
|  }
 | 
|  
 | 
|  void WebStorageAreaImpl::setItem(
 | 
| -    const WebString& key, const WebString& value, const WebURL& url,
 | 
| -    WebStorageArea::Result& result, WebString& old_value_webkit) {
 | 
| -  if (key.length() + value.length() > dom_storage::kPerAreaQuota) {
 | 
| +    const WebString& key, const WebString& value, const WebURL& page_url,
 | 
| +    WebStorageArea::Result& result) {
 | 
| +  if (!cached_area_->SetItem(connection_id_, key, value, page_url))
 | 
|      result = ResultBlockedByQuota;
 | 
| -    return;
 | 
| -  }
 | 
| -  NullableString16 old_value;
 | 
| -  RenderThreadImpl::current()->Send(new DOMStorageHostMsg_SetItem(
 | 
| -      connection_id_, key, value, url, &result, &old_value));
 | 
| -  old_value_webkit = old_value;
 | 
| +  else
 | 
| +    result = ResultOK;
 | 
|  }
 | 
|  
 | 
|  void WebStorageAreaImpl::removeItem(
 | 
| -    const WebString& key, const WebURL& url, WebString& old_value_webkit) {
 | 
| -  NullableString16 old_value;
 | 
| -  RenderThreadImpl::current()->Send(
 | 
| -      new DOMStorageHostMsg_RemoveItem(connection_id_, key, url, &old_value));
 | 
| -  old_value_webkit = old_value;
 | 
| +    const WebString& key, const WebURL& page_url) {
 | 
| +  cached_area_->RemoveItem(connection_id_, key, page_url);
 | 
|  }
 | 
|  
 | 
| -void WebStorageAreaImpl::clear(
 | 
| -    const WebURL& url, bool& cleared_something) {
 | 
| -  RenderThreadImpl::current()->Send(
 | 
| -      new DOMStorageHostMsg_Clear(connection_id_, url, &cleared_something));
 | 
| +void WebStorageAreaImpl::clear(const WebURL& page_url) {
 | 
| +  cached_area_->Clear(connection_id_, page_url);
 | 
|  }
 | 
| 
 |