diff options
Diffstat (limited to 'src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp')
-rw-r--r-- | src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp | 57 |
1 files changed, 45 insertions, 12 deletions
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp b/src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp index 2f4aa53..99a2dba 100644 --- a/src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp +++ b/src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp @@ -35,21 +35,28 @@ #include "InspectorDOMStorageResource.h" #include "Document.h" +#include "DOMWindow.h" +#include "EventNames.h" #include "Frame.h" #include "InspectorFrontend.h" #include "ScriptObject.h" -#include "ScriptObjectQuarantine.h" #include "Storage.h" +#include "StorageEvent.h" using namespace JSC; namespace WebCore { +int InspectorDOMStorageResource::s_nextUnusedId = 1; + InspectorDOMStorageResource::InspectorDOMStorageResource(Storage* domStorage, bool isLocalStorage, Frame* frame) - : m_domStorage(domStorage) + : EventListener(InspectorDOMStorageResourceType) + , m_domStorage(domStorage) , m_isLocalStorage(isLocalStorage) , m_frame(frame) - , m_scriptObjectCreated(false) + , m_frontend(0) + , m_id(s_nextUnusedId++) + , m_reportingChangesToFrontend(false) { } @@ -60,23 +67,49 @@ bool InspectorDOMStorageResource::isSameHostAndType(Frame* frame, bool isLocalSt void InspectorDOMStorageResource::bind(InspectorFrontend* frontend) { - if (m_scriptObjectCreated) - return; + ASSERT(!m_frontend); + m_frontend = frontend; ScriptObject jsonObject = frontend->newScriptObject(); - ScriptObject domStorage; - if (!getQuarantinedScriptObject(m_domStorage.get(), domStorage)) - return; - jsonObject.set("domStorage", domStorage); jsonObject.set("host", m_frame->document()->securityOrigin()->host()); jsonObject.set("isLocalStorage", m_isLocalStorage); - if (frontend->addDOMStorage(jsonObject)) - m_scriptObjectCreated = true; + jsonObject.set("id", m_id); + frontend->addDOMStorage(jsonObject); } void InspectorDOMStorageResource::unbind() { - m_scriptObjectCreated = false; + ASSERT(m_frontend); + if (m_reportingChangesToFrontend) { + m_frame->domWindow()->removeEventListener(eventNames().storageEvent, this, true); + m_reportingChangesToFrontend = false; + } + m_frontend = 0; +} + +void InspectorDOMStorageResource::startReportingChangesToFrontend() +{ + ASSERT(m_frontend); + if (!m_reportingChangesToFrontend) { + m_frame->domWindow()->addEventListener(eventNames().storageEvent, this, true); + m_reportingChangesToFrontend = true; + } +} + +void InspectorDOMStorageResource::handleEvent(Event* event) +{ + ASSERT(m_frontend); + ASSERT(eventNames().storageEvent == event->type()); + StorageEvent* storageEvent = static_cast<StorageEvent*>(event); + Storage* storage = storageEvent->storageArea(); + bool isLocalStorage = storageEvent->source()->localStorage() == storage; + if (isSameHostAndType(storage->frame(), isLocalStorage)) + m_frontend->updateDOMStorage(m_id); +} + +bool InspectorDOMStorageResource::operator==(const EventListener& listener) +{ + return (this == InspectorDOMStorageResource::cast(&listener)); } } // namespace WebCore |