Web Inspector: Make closing ContentViews more leak proof
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Views / FrameDOMTreeContentView.js
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WebInspector.FrameDOMTreeContentView = function(domTree)
27 {
28     console.assert(domTree);
29
30     WebInspector.DOMTreeContentView.call(this, domTree);
31
32     this._domTree = domTree;
33     this._domTree.addEventListener(WebInspector.DOMTree.Event.RootDOMNodeInvalidated, this._rootDOMNodeInvalidated, this);
34
35     this._requestRootDOMNode();
36 };
37
38
39 WebInspector.FrameDOMTreeContentView.prototype = {
40     constructor: WebInspector.FrameDOMTreeContentView,
41     __proto__: WebInspector.DOMTreeContentView.prototype,
42
43     // Public
44
45     get allowedNavigationSidebarPanels()
46     {
47         return [WebInspector.resourceSidebarPanel.identifier];
48     },
49
50     get domTree()
51     {
52         return this._domTree;
53     },
54
55     closed: function()
56     {
57         this._domTree.removeEventListener(null, null, this);
58
59         WebInspector.DOMTreeContentView.prototype.closed.call(this);
60     },
61
62     getSearchContextNodes: function(callback)
63     {
64         this._domTree.requestRootDOMNode(function(rootDOMNode) {
65             callback([rootDOMNode.id]);
66         });
67     },
68
69     // Private
70
71     _rootDOMNodeAvailable: function(rootDOMNode)
72     {
73         this.domTreeOutline.rootDOMNode = rootDOMNode;
74
75         if (!rootDOMNode) {
76             this.domTreeOutline.selectDOMNode(null, false);
77             return;
78         }
79
80         this._restoreSelectedNodeAfterUpdate(this._domTree.frame.url, rootDOMNode.body || rootDOMNode.documentElement);
81     },
82
83     _rootDOMNodeInvalidated: function(event)
84     {
85         this._requestRootDOMNode();
86     },
87
88     _requestRootDOMNode: function()
89     {
90         this._domTree.requestRootDOMNode(this._rootDOMNodeAvailable.bind(this));
91     }
92
93 };