2 * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
4 * Copyright (C) 2011 Google Inc. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of Apple Inc. ("Apple") nor the names of
16 * its contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include "InspectorAgent.h"
34 #include "InspectorEnvironment.h"
35 #include "InspectorValues.h"
36 #include "ScriptValue.h"
40 InspectorAgent::InspectorAgent(InspectorEnvironment
& environment
)
41 : InspectorAgentBase(ASCIILiteral("Inspector"))
42 , m_environment(environment
)
47 InspectorAgent::~InspectorAgent()
51 void InspectorAgent::didCreateFrontendAndBackend(FrontendChannel
* frontendChannel
, BackendDispatcher
* backendDispatcher
)
53 m_frontendDispatcher
= std::make_unique
<InspectorFrontendDispatcher
>(frontendChannel
);
54 m_backendDispatcher
= InspectorBackendDispatcher::create(backendDispatcher
, this);
57 void InspectorAgent::willDestroyFrontendAndBackend(DisconnectReason
)
59 m_frontendDispatcher
= nullptr;
60 m_backendDispatcher
= nullptr;
62 m_pendingEvaluateTestCommands
.clear();
68 void InspectorAgent::enable(ErrorString
&)
72 if (m_pendingInspectData
.first
)
73 inspect(m_pendingInspectData
.first
.copyRef(), m_pendingInspectData
.second
.copyRef());
75 #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
76 if (m_pendingExtraDomainsData
)
77 m_frontendDispatcher
->activateExtraDomains(m_pendingExtraDomainsData
);
80 for (auto& testCommand
: m_pendingEvaluateTestCommands
) {
81 if (!m_frontendDispatcher
)
84 m_frontendDispatcher
->evaluateForTestInFrontend(testCommand
);
87 m_pendingEvaluateTestCommands
.clear();
90 void InspectorAgent::disable(ErrorString
&)
95 void InspectorAgent::initialized(ErrorString
&)
97 m_environment
.frontendInitialized();
100 void InspectorAgent::inspect(RefPtr
<Protocol::Runtime::RemoteObject
>&& objectToInspect
, RefPtr
<InspectorObject
>&& hints
)
102 if (m_enabled
&& m_frontendDispatcher
) {
103 m_frontendDispatcher
->inspect(objectToInspect
, hints
);
104 m_pendingInspectData
.first
= nullptr;
105 m_pendingInspectData
.second
= nullptr;
109 m_pendingInspectData
.first
= objectToInspect
;
110 m_pendingInspectData
.second
= hints
;
113 void InspectorAgent::evaluateForTestInFrontend(const String
& script
)
115 if (m_enabled
&& m_frontendDispatcher
)
116 m_frontendDispatcher
->evaluateForTestInFrontend(script
);
118 m_pendingEvaluateTestCommands
.append(script
);
121 #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
122 void InspectorAgent::activateExtraDomain(const String
& domainName
)
125 if (!m_pendingExtraDomainsData
)
126 m_pendingExtraDomainsData
= Inspector::Protocol::Array
<String
>::create();
127 m_pendingExtraDomainsData
->addItem(domainName
);
131 Ref
<Inspector::Protocol::Array
<String
>> domainNames
= Inspector::Protocol::Array
<String
>::create();
132 domainNames
->addItem(domainName
);
133 m_frontendDispatcher
->activateExtraDomains(WTF::move(domainNames
));
136 void InspectorAgent::activateExtraDomains(const Vector
<String
>& extraDomains
)
138 if (extraDomains
.isEmpty())
141 RefPtr
<Inspector::Protocol::Array
<String
>> domainNames
= Inspector::Protocol::Array
<String
>::create();
142 for (auto domainName
: extraDomains
)
143 domainNames
->addItem(domainName
);
146 m_pendingExtraDomainsData
= domainNames
.release();
148 m_frontendDispatcher
->activateExtraDomains(domainNames
.release());
152 } // namespace Inspector