Web Inspector: Keep Web Inspector window alive across process swaps (PSON) (Local...
[WebKit-https.git] / Source / WebKit / WebProcess / WebPage / WebPageInspectorTargetController.cpp
1 /*
2  * Copyright (C) 2018 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 #include "config.h"
27 #include "WebPageInspectorTargetController.h"
28
29 #include "WebPage.h"
30 #include "WebPageProxyMessages.h"
31
32 namespace WebKit {
33
34 WebPageInspectorTargetController::WebPageInspectorTargetController(WebPage& page)
35     : m_page(page)
36     , m_pageTarget(page)
37 {
38     // Do not send the page target to the UIProcess, the WebPageProxy will manager this for us.
39     m_targets.set(m_pageTarget.identifier(), &m_pageTarget);
40 }
41
42 WebPageInspectorTargetController::~WebPageInspectorTargetController()
43 {
44 }
45
46 void WebPageInspectorTargetController::addTarget(Inspector::InspectorTarget& target)
47 {
48     auto addResult = m_targets.set(target.identifier(), &target);
49     ASSERT_UNUSED(addResult, addResult.isNewEntry);
50
51     m_page.send(Messages::WebPageProxy::CreateInspectorTarget(target.identifier(), target.type()));
52 }
53
54 void WebPageInspectorTargetController::removeTarget(Inspector::InspectorTarget& target)
55 {
56     ASSERT_WITH_MESSAGE(target.identifier() != m_pageTarget.identifier(), "Should never remove the main target.");
57
58     m_page.send(Messages::WebPageProxy::DestroyInspectorTarget(target.identifier()));
59
60     m_targets.remove(target.identifier());
61     m_targetFrontendChannels.remove(target.identifier());
62 }
63
64 void WebPageInspectorTargetController::connectInspector(const String& targetId, Inspector::FrontendChannel::ConnectionType connectionType)
65 {
66     InspectorTarget* target = m_targets.get(targetId);
67     if (!target)
68         return;
69
70     RefPtr<WebPageInspectorTargetFrontendChannel> channel = m_targetFrontendChannels.get(targetId);
71     if (!channel) {
72         channel = WebPageInspectorTargetFrontendChannel::create(*this, targetId, connectionType);
73         m_targetFrontendChannels.set(target->identifier(), channel);
74     }
75
76     target->connect(*channel.get());
77 }
78
79 void WebPageInspectorTargetController::disconnectInspector(const String& targetId)
80 {
81     InspectorTarget* target = m_targets.get(targetId);
82     if (!target)
83         return;
84
85     RefPtr<WebPageInspectorTargetFrontendChannel> channel = m_targetFrontendChannels.take(targetId);
86     if (!channel)
87         return;
88
89     target->disconnect(*channel.get());
90 }
91
92 void WebPageInspectorTargetController::sendMessageToTargetBackend(const String& targetId, const String& message)
93 {
94     InspectorTarget* target = m_targets.get(targetId);
95     if (!target)
96         return;
97
98     target->sendMessageToTargetBackend(message);
99 }
100
101 void WebPageInspectorTargetController::sendMessageToTargetFrontend(const String& targetId, const String& message)
102 {
103     m_page.send(Messages::WebPageProxy::SendMessageToInspectorFrontend(targetId, message));
104 }
105
106 } // namespace WebKit