15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * its contributors may be used to endorse or promote products derived 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * from this software without specific prior written permission. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY GOOGLE AND ITS CONTRIBUTORS "AS IS" AND ANY 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorState.h" 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorStateClient.h" 33591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/inspector/JSONParser.h" 34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassOwnPtr.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochInspectorState::InspectorState(InspectorStateUpdateListener* listener, PassRefPtr<JSONObject> properties) 39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : m_listener(listener) 40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_properties(properties) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorState::updateCookie() 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_listener) 47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_listener->inspectorStateUpdated(); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 50591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorState::setFromCookie(PassRefPtr<JSONObject> properties) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_properties = properties; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorState::setValue(const String& propertyName, PassRefPtr<JSONValue> value) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_properties->setValue(propertyName, value); 58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) updateCookie(); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorState::remove(const String& propertyName) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_properties->remove(propertyName); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateCookie(); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool InspectorState::getBoolean(const String& propertyName) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 69591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch JSONObject::iterator it = m_properties->find(propertyName); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool value = false; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it != m_properties->end()) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) it->value->asBoolean(&value); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String InspectorState::getString(const String& propertyName) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 78591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch JSONObject::iterator it = m_properties->find(propertyName); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String value; 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it != m_properties->end()) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) it->value->asString(&value); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value; 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)long InspectorState::getLong(const String& propertyName) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 87e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return getLong(propertyName, 0); 88e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 89e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 90e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 91e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)long InspectorState::getLong(const String& propertyName, long defaultValue) 92e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 93591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch JSONObject::iterator it = m_properties->find(propertyName); 94e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) long value = defaultValue; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it != m_properties->end()) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) it->value->asNumber(&value); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double InspectorState::getDouble(const String& propertyName) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 102e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return getDouble(propertyName, 0); 103e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 104e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 105e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)double InspectorState::getDouble(const String& propertyName, double defaultValue) 106e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 107591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch JSONObject::iterator it = m_properties->find(propertyName); 108e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) double value = defaultValue; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it != m_properties->end()) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) it->value->asNumber(&value); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 114591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochPassRefPtr<JSONObject> InspectorState::getObject(const String& propertyName) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 116591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch JSONObject::iterator it = m_properties->find(propertyName); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_properties->end()) { 118591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_properties->setObject(propertyName, JSONObject::create()); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) it = m_properties->find(propertyName); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return it->value->asObject(); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)InspectorState* InspectorCompositeState::createAgentState(const String& agentName) 125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_stateObject->find(agentName) == m_stateObject->end()); 127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_inspectorStateMap.find(agentName) == m_inspectorStateMap.end()); 128591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RefPtr<JSONObject> stateProperties = JSONObject::create(); 129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_stateObject->setObject(agentName, stateProperties); 130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) OwnPtr<InspectorState> statePtr = adoptPtr(new InspectorState(this, stateProperties)); 131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InspectorState* state = statePtr.get(); 132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_inspectorStateMap.add(agentName, statePtr.release()); 133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return state; 134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCompositeState::loadFromCookie(const String& inspectorCompositeStateCookie) 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 138591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RefPtr<JSONValue> cookie = parseJSON(inspectorCompositeStateCookie); 139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (cookie) 140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_stateObject = cookie->asObject(); 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_stateObject) 142591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_stateObject = JSONObject::create(); 143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InspectorStateMap::iterator end = m_inspectorStateMap.end(); 145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (InspectorStateMap::iterator it = m_inspectorStateMap.begin(); it != end; ++it) { 146591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RefPtr<JSONObject> agentStateObject = m_stateObject->getObject(it->key); 147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!agentStateObject) { 148591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch agentStateObject = JSONObject::create(); 149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_stateObject->setObject(it->key, agentStateObject); 150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) it->value->setFromCookie(agentStateObject); 152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCompositeState::mute() 156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_isMuted = true; 158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCompositeState::unmute() 161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_isMuted = false; 163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCompositeState::inspectorStateUpdated() 166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 16753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_client && !m_isMuted) 168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->updateInspectorStateCookie(m_stateObject->toJSONString()); 169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 173