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)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "InspectorFrontend.h"
341fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch#include "bindings/v8/ExceptionState.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"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/DOMWindow.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Frame.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PageGroup.h"
45591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/platform/JSONValues.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/storage/Storage.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/storage/StorageArea.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/storage/StorageNamespace.h"
49e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "weborigin/SecurityOrigin.h"
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace DOMStorageAgentState {
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char domStorageAgentEnabled[] = "domStorageAgentEnabled";
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
571fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdochstatic bool hadException(ExceptionState& es, ErrorString* errorString)
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
591fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    if (!es.hadException())
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
611fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch
621fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    switch (es.code()) {
63e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case SecurityError:
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *errorString = "Security error";
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    default:
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *errorString = "Unknown DOM storage error";
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)InspectorDOMStorageAgent::InspectorDOMStorageAgent(InstrumentingAgents* instrumentingAgents, InspectorPageAgent* pageAgent, InspectorCompositeState* state)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : InspectorBaseAgent<InspectorDOMStorageAgent>("DOMStorage", instrumentingAgents, state)
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_pageAgent(pageAgent)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_frontend(0)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorDOMStorageAgent::~InspectorDOMStorageAgent()
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorDOMStorageAgent::setFrontend(InspectorFrontend* frontend)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frontend = frontend;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorDOMStorageAgent::clearFrontend()
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frontend = 0;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    disable(0);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool InspectorDOMStorageAgent::isEnabled() const
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_state->getBoolean(DOMStorageAgentState::domStorageAgentEnabled);
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorDOMStorageAgent::enable(ErrorString*)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_state->setBoolean(DOMStorageAgentState::domStorageAgentEnabled, true);
102591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_instrumentingAgents->setInspectorDOMStorageAgent(this);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorDOMStorageAgent::disable(ErrorString*)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
107591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_instrumentingAgents->setInspectorDOMStorageAgent(0);
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_state->setBoolean(DOMStorageAgentState::domStorageAgentEnabled, false);
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1111fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdochvoid InspectorDOMStorageAgent::getValue(ErrorString* errorString, const RefPtr<JSONObject>& storageId, const String& key, TypeBuilder::OptOutput<WTF::String>* value)
1121fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch{
1131fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    Frame* frame;
1141fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    OwnPtr<StorageArea> storageArea = findStorageArea(errorString, storageId, frame);
1151fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    if (!storageArea)
1161fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        return;
1171fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch
1181fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    TrackExceptionState es;
1191fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    bool keyPresent = storageArea->contains(key, es, frame);
1201fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    if (hadException(es, errorString) || !keyPresent)
1211fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        return;
1221fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch
1231fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    *value = storageArea->getItem(key, es, frame);
1241fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    hadException(es, errorString);
1251fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch}
1261fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch
127591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorDOMStorageAgent::getDOMStorageItems(ErrorString* errorString, const RefPtr<JSONObject>& storageId, RefPtr<TypeBuilder::Array<TypeBuilder::Array<String> > >& items)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Frame* frame;
130591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    OwnPtr<StorageArea> storageArea = findStorageArea(errorString, storageId, frame);
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!storageArea)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<TypeBuilder::Array<TypeBuilder::Array<String> > > storageItems = TypeBuilder::Array<TypeBuilder::Array<String> >::create();
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
136df95704c49daea886ddad70775bda23618d6274dBen Murdoch    TrackExceptionState es;
137df95704c49daea886ddad70775bda23618d6274dBen Murdoch    for (unsigned i = 0; i < storageArea->length(es, frame); ++i) {
138df95704c49daea886ddad70775bda23618d6274dBen Murdoch        String name(storageArea->key(i, es, frame));
139df95704c49daea886ddad70775bda23618d6274dBen Murdoch        if (hadException(es, errorString))
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
141df95704c49daea886ddad70775bda23618d6274dBen Murdoch        String value(storageArea->getItem(name, es, frame));
142df95704c49daea886ddad70775bda23618d6274dBen Murdoch        if (hadException(es, errorString))
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<TypeBuilder::Array<String> > entry = TypeBuilder::Array<String>::create();
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        entry->addItem(name);
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        entry->addItem(value);
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        storageItems->addItem(entry);
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    items = storageItems.release();
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
152df95704c49daea886ddad70775bda23618d6274dBen Murdochstatic String toErrorString(ExceptionState& es)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
154df95704c49daea886ddad70775bda23618d6274dBen Murdoch    if (es.hadException())
1551fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        return DOMException::getErrorName(es.code());
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return "";
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
159591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorDOMStorageAgent::setDOMStorageItem(ErrorString* errorString, const RefPtr<JSONObject>& storageId, const String& key, const String& value)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Frame* frame;
162591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    OwnPtr<StorageArea> storageArea = findStorageArea(0, storageId, frame);
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!storageArea) {
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *errorString = "Storage not found";
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
168df95704c49daea886ddad70775bda23618d6274dBen Murdoch    TrackExceptionState es;
169df95704c49daea886ddad70775bda23618d6274dBen Murdoch    storageArea->setItem(key, value, es, frame);
170df95704c49daea886ddad70775bda23618d6274dBen Murdoch    *errorString = toErrorString(es);
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
173591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorDOMStorageAgent::removeDOMStorageItem(ErrorString* errorString, const RefPtr<JSONObject>& storageId, const String& key)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Frame* frame;
176591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    OwnPtr<StorageArea> storageArea = findStorageArea(0, storageId, frame);
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!storageArea) {
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *errorString = "Storage not found";
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
182df95704c49daea886ddad70775bda23618d6274dBen Murdoch    TrackExceptionState es;
183df95704c49daea886ddad70775bda23618d6274dBen Murdoch    storageArea->removeItem(key, es, frame);
184df95704c49daea886ddad70775bda23618d6274dBen Murdoch    *errorString = toErrorString(es);
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)String InspectorDOMStorageAgent::storageId(Storage* storage)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(storage);
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Document* document = storage->frame()->document();
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(document);
192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DOMWindow* window = document->domWindow();
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(window);
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<SecurityOrigin> securityOrigin = document->securityOrigin();
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isLocalStorage = window->optionalLocalStorage() == storage;
196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return storageId(securityOrigin.get(), isLocalStorage)->toJSONString();
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<TypeBuilder::DOMStorage::StorageId> InspectorDOMStorageAgent::storageId(SecurityOrigin* securityOrigin, bool isLocalStorage)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return TypeBuilder::DOMStorage::StorageId::create()
202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        .setSecurityOrigin(securityOrigin->toRawString())
203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        .setIsLocalStorage(isLocalStorage).release();
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void InspectorDOMStorageAgent::didDispatchDOMStorageEvent(const String& key, const String& oldValue, const String& newValue, StorageType storageType, SecurityOrigin* securityOrigin)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_frontend || !isEnabled())
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<TypeBuilder::DOMStorage::StorageId> id = storageId(securityOrigin, storageType == LocalStorage);
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (key.isNull())
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_frontend->domstorage()->domStorageItemsCleared(id);
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (newValue.isNull())
216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_frontend->domstorage()->domStorageItemRemoved(id, key);
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (oldValue.isNull())
218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_frontend->domstorage()->domStorageItemAdded(id, key, newValue);
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_frontend->domstorage()->domStorageItemUpdated(id, key, oldValue, newValue);
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
223591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochPassOwnPtr<StorageArea> InspectorDOMStorageAgent::findStorageArea(ErrorString* errorString, const RefPtr<JSONObject>& storageId, Frame*& targetFrame)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String securityOrigin;
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isLocalStorage = false;
227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool success = storageId->getString("securityOrigin", &securityOrigin);
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (success)
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        success = storageId->getBoolean("isLocalStorage", &isLocalStorage);
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!success) {
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (errorString)
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *errorString = "Invalid storageId format";
233591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return nullptr;
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Frame* frame = m_pageAgent->findFrameWithSecurityOrigin(securityOrigin);
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!frame) {
238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (errorString)
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *errorString = "Frame not found for the given security origin";
240591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return nullptr;
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    targetFrame = frame;
243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isLocalStorage)
245591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return StorageNamespace::localStorageArea(frame->document()->securityOrigin());
246591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return m_pageAgent->page()->sessionStorage()->storageArea(frame->document()->securityOrigin());
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
251