10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/* 20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Apple Inc. All rights reserved. 30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Google Inc. All rights reserved. 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without 60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions 70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * are met: 80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 1. Redistributions of source code must retain the above copyright 100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer. 110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer in the 130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * documentation and/or other materials provided with the distribution. 140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * its contributors may be used to endorse or promote products derived 160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * from this software without specific prior written permission. 170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */ 290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef InspectorDOMAgent_h 310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define InspectorDOMAgent_h 320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "AtomicString.h" 340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "EventListener.h" 35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "EventTarget.h" 360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ScriptArray.h" 370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ScriptObject.h" 380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ScriptState.h" 390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/ListHashSet.h> 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/HashMap.h> 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/HashSet.h> 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/PassRefPtr.h> 440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/RefPtr.h> 450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore { 47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block class ContainerNode; 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class Element; 490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class Event; 500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class Document; 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class InspectorFrontend; 520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class NameNodeMap; 530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class Node; 540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class Page; 550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block struct EventListenerInfo { 57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block EventListenerInfo(Node* node, const AtomicString& eventType, const EventListenerVector& eventListenerVector) 58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block : node(node) 59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , eventType(eventType) 60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , eventListenerVector(eventListenerVector) 61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block { 62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Node* node; 65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block const AtomicString eventType; 66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block const EventListenerVector eventListenerVector; 67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block }; 68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class InspectorDOMAgent : public EventListener { 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch public: 71cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static PassRefPtr<InspectorDOMAgent> create(InspectorFrontend* frontend) 72cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block { 73cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return adoptRef(new InspectorDOMAgent(frontend)); 74cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 75cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const InspectorDOMAgent* cast(const EventListener* listener) 77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block { 78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return listener->type() == InspectorDOMAgentType 79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ? static_cast<const InspectorDOMAgent*>(listener) 80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block : 0; 81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch InspectorDOMAgent(InspectorFrontend* frontend); 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ~InspectorDOMAgent(); 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void reset(); 87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual bool operator==(const EventListener& other); 89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Methods called from the frontend. 91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void getChildNodes(long callId, long nodeId); 920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void setAttribute(long callId, long elementId, const String& name, const String& value); 930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void removeAttribute(long callId, long elementId, const String& name); 94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void setTextNodeValue(long callId, long nodeId, const String& value); 95231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void getEventListenersForNode(long callId, long nodeId); 960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Methods called from the InspectorController. 98058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu void setDocument(Document* document); 99231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void releaseDanglingNodes(); 1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 101d0825bca7fe65beaee391d30da42e937db621564Steve Block void didInsertDOMNode(Node*); 102d0825bca7fe65beaee391d30da42e937db621564Steve Block void didRemoveDOMNode(Node*); 103d0825bca7fe65beaee391d30da42e937db621564Steve Block void didModifyDOMAttr(Element*); 104d0825bca7fe65beaee391d30da42e937db621564Steve Block 1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Node* nodeForId(long nodeId); 106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Node* nodeForPath(const String& path); 1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch long pushNodePathToFrontend(Node* node); 108d0825bca7fe65beaee391d30da42e937db621564Steve Block void pushChildNodesToFrontend(long nodeId); 1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch private: 1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void startListening(Document* document); 1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void stopListening(Document* document); 1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 114231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void handleEvent(ScriptExecutionContext*, Event* event); 115231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 116231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block typedef HashMap<RefPtr<Node>, long> NodeToIdMap; 117231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block long bind(Node* node, NodeToIdMap* nodesMap); 118231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void unbind(Node* node, NodeToIdMap* nodesMap); 1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool pushDocumentToFrontend(); 1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ScriptObject buildObjectForNode(Node* node, int depth, NodeToIdMap* nodesMap); 123231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ScriptArray buildArrayForElementAttributes(Element* element); 124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ScriptArray buildArrayForContainerChildren(Node* container, int depth, NodeToIdMap* nodesMap); 1250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ScriptObject buildObjectForEventListener(const RegisteredEventListener& registeredEventListener, const AtomicString& eventType, Node* node); 1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // We represent embedded doms as a part of the same hierarchy. Hence we treat children of frame owners differently. 1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // We also skip whitespace text nodes conditionally. Following methods encapsulate these specifics. 1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Node* innerFirstChild(Node* node); 1310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Node* innerNextSibling(Node* node); 1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Node* innerPreviousSibling(Node* node); 133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block unsigned innerChildNodeCount(Node* node); 134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Node* innerParentNode(Node* node); 1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool isWhitespace(Node* node); 1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Document* mainFrameDocument() const; 138d0825bca7fe65beaee391d30da42e937db621564Steve Block String documentURLString(Document* document) const; 1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void discardBindings(); 1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch InspectorFrontend* m_frontend; 142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block NodeToIdMap m_documentNodeToIdMap; 143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Owns node mappings for dangling nodes. 144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Vector<NodeToIdMap*> m_danglingNodeToIdMaps; 1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch HashMap<long, Node*> m_idToNode; 146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block HashMap<long, NodeToIdMap*> m_idToNodesMap; 1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch HashSet<long> m_childrenRequested; 1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch long m_lastNodeId; 1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ListHashSet<RefPtr<Document> > m_documents; 1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch }; 1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore 1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif // !defined(InspectorDOMAgent_h) 156