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