1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "config.h"
6#include "core/inspector/InspectorNodeIds.h"
7
8#if ENABLE(OILPAN)
9#include "core/dom/Node.h"
10#else
11#include "core/dom/WeakNodeMap.h"
12#endif
13#include "platform/heap/Handle.h"
14
15namespace blink {
16
17#if ENABLE(OILPAN)
18typedef HeapHashMap<WeakMember<Node>, int> NodeToIdMap;
19typedef HeapHashMap<int, WeakMember<Node> > IdToNodeMap;
20
21static NodeToIdMap& nodeToIdMap()
22{
23    DEFINE_STATIC_LOCAL(Persistent<NodeToIdMap>, nodeToIdMap, (new NodeToIdMap()));
24    return *nodeToIdMap;
25}
26
27static IdToNodeMap& idToNodeMap()
28{
29    DEFINE_STATIC_LOCAL(Persistent<IdToNodeMap>, idToNodeMap, (new IdToNodeMap()));
30    return *idToNodeMap;
31}
32
33int InspectorNodeIds::idForNode(Node* node)
34{
35    static int s_nextNodeId = 1;
36    NodeToIdMap::iterator it = nodeToIdMap().find(node);
37    if (it != nodeToIdMap().end())
38        return it->value;
39    int id = s_nextNodeId++;
40    nodeToIdMap().set(node, id);
41    ASSERT(idToNodeMap().find(id) == idToNodeMap().end());
42    idToNodeMap().set(id, node);
43    return id;
44}
45
46Node* InspectorNodeIds::nodeForId(int id)
47{
48    return idToNodeMap().get(id);
49}
50#else
51static WeakNodeMap& nodeIds()
52{
53    DEFINE_STATIC_LOCAL(WeakNodeMap, self, ());
54    return self;
55}
56
57int InspectorNodeIds::idForNode(Node* node)
58{
59    static int s_nextNodeId = 1;
60    WeakNodeMap& ids = nodeIds();
61    int result = ids.value(node);
62    if (!result) {
63        result = s_nextNodeId++;
64        ids.put(node, result);
65    }
66    return result;
67}
68
69Node* InspectorNodeIds::nodeForId(int id)
70{
71    return nodeIds().node(id);
72}
73#endif
74
75}
76