15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Samsung Electronics. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     its contributors may be used to endorse or promote products derived
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     from this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorDOMStorageAgent.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/InspectorFrontend.h"
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/dom/DOMException.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorPageAgent.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorState.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InstrumentingAgents.h"
4176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/frame/LocalDOMWindow.h"
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/storage/Storage.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/storage/StorageNamespace.h"
461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/JSONValues.h"
4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityOrigin.h"
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace DOMStorageAgentState {
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char domStorageAgentEnabled[] = "domStorageAgentEnabled";
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)static bool hadException(ExceptionState& exceptionState, ErrorString* errorString)
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
5751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!exceptionState.hadException())
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
591fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch
6051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    switch (exceptionState.code()) {
61e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case SecurityError:
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *errorString = "Security error";
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    default:
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *errorString = "Unknown DOM storage error";
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)InspectorDOMStorageAgent::InspectorDOMStorageAgent(InspectorPageAgent* pageAgent)
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    : InspectorBaseAgent<InspectorDOMStorageAgent>("DOMStorage")
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_pageAgent(pageAgent)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_frontend(0)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorDOMStorageAgent::~InspectorDOMStorageAgent()
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
81c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void InspectorDOMStorageAgent::trace(Visitor* visitor)
82c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
83c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_pageAgent);
84c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    InspectorBaseAgent::trace(visitor);
85c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
86c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorDOMStorageAgent::setFrontend(InspectorFrontend* frontend)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
899e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_frontend = frontend->domstorage();
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorDOMStorageAgent::clearFrontend()
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frontend = 0;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    disable(0);
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void InspectorDOMStorageAgent::restore()
99f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
100f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (isEnabled())
101f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        enable(0);
102f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
103f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool InspectorDOMStorageAgent::isEnabled() const
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_state->getBoolean(DOMStorageAgentState::domStorageAgentEnabled);
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorDOMStorageAgent::enable(ErrorString*)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_state->setBoolean(DOMStorageAgentState::domStorageAgentEnabled, true);
112591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_instrumentingAgents->setInspectorDOMStorageAgent(this);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorDOMStorageAgent::disable(ErrorString*)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
117591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_instrumentingAgents->setInspectorDOMStorageAgent(0);
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_state->setBoolean(DOMStorageAgentState::domStorageAgentEnabled, false);
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
121591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorDOMStorageAgent::getDOMStorageItems(ErrorString* errorString, const RefPtr<JSONObject>& storageId, RefPtr<TypeBuilder::Array<TypeBuilder::Array<String> > >& items)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame;
12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    OwnPtrWillBeRawPtr<StorageArea> storageArea = findStorageArea(errorString, storageId, frame);
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!storageArea)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<TypeBuilder::Array<TypeBuilder::Array<String> > > storageItems = TypeBuilder::Array<TypeBuilder::Array<String> >::create();
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
13051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
13151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    for (unsigned i = 0; i < storageArea->length(exceptionState, frame); ++i) {
13251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        String name(storageArea->key(i, exceptionState, frame));
13351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (hadException(exceptionState, errorString))
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
13551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        String value(storageArea->getItem(name, exceptionState, frame));
13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (hadException(exceptionState, errorString))
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<TypeBuilder::Array<String> > entry = TypeBuilder::Array<String>::create();
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        entry->addItem(name);
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        entry->addItem(value);
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        storageItems->addItem(entry);
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    items = storageItems.release();
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)static String toErrorString(ExceptionState& exceptionState)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (exceptionState.hadException())
14951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return DOMException::getErrorName(exceptionState.code());
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return "";
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
153591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorDOMStorageAgent::setDOMStorageItem(ErrorString* errorString, const RefPtr<JSONObject>& storageId, const String& key, const String& value)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame;
15609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    OwnPtrWillBeRawPtr<StorageArea> storageArea = findStorageArea(0, storageId, frame);
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!storageArea) {
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *errorString = "Storage not found";
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
16351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    storageArea->setItem(key, value, exceptionState, frame);
16451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    *errorString = toErrorString(exceptionState);
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
167591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorDOMStorageAgent::removeDOMStorageItem(ErrorString* errorString, const RefPtr<JSONObject>& storageId, const String& key)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame;
17009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    OwnPtrWillBeRawPtr<StorageArea> storageArea = findStorageArea(0, storageId, frame);
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!storageArea) {
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *errorString = "Storage not found";
173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
17651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
17751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    storageArea->removeItem(key, exceptionState, frame);
17851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    *errorString = toErrorString(exceptionState);
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<TypeBuilder::DOMStorage::StorageId> InspectorDOMStorageAgent::storageId(SecurityOrigin* securityOrigin, bool isLocalStorage)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return TypeBuilder::DOMStorage::StorageId::create()
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        .setSecurityOrigin(securityOrigin->toRawString())
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        .setIsLocalStorage(isLocalStorage).release();
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void InspectorDOMStorageAgent::didDispatchDOMStorageEvent(const String& key, const String& oldValue, const String& newValue, StorageType storageType, SecurityOrigin* securityOrigin)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_frontend || !isEnabled())
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<TypeBuilder::DOMStorage::StorageId> id = storageId(securityOrigin, storageType == LocalStorage);
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (key.isNull())
1969e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_frontend->domStorageItemsCleared(id);
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (newValue.isNull())
1989e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_frontend->domStorageItemRemoved(id, key);
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (oldValue.isNull())
2009e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_frontend->domStorageItemAdded(id, key, newValue);
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
2029e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_frontend->domStorageItemUpdated(id, key, oldValue, newValue);
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
205d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassOwnPtrWillBeRawPtr<StorageArea> InspectorDOMStorageAgent::findStorageArea(ErrorString* errorString, const RefPtr<JSONObject>& storageId, LocalFrame*& targetFrame)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String securityOrigin;
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isLocalStorage = false;
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool success = storageId->getString("securityOrigin", &securityOrigin);
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (success)
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        success = storageId->getBoolean("isLocalStorage", &isLocalStorage);
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!success) {
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (errorString)
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *errorString = "Invalid storageId format";
215591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return nullptr;
216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = m_pageAgent->findFrameWithSecurityOrigin(securityOrigin);
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!frame) {
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (errorString)
221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            *errorString = "LocalFrame not found for the given security origin";
222591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return nullptr;
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    targetFrame = frame;
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isLocalStorage)
227591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return StorageNamespace::localStorageArea(frame->document()->securityOrigin());
228591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return m_pageAgent->page()->sessionStorage()->storageArea(frame->document()->securityOrigin());
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
231c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
233