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