Unreviewed, rolling out r224863.
[WebKit-https.git] / Source / WebCore / inspector / CommandLineAPIHost.cpp
index f404a52..7a8f95c 100644 (file)
@@ -12,7 +12,7 @@
  * 2.  Redistributions in binary form must reproduce the above copyright
  *     notice, this list of conditions and the following disclaimer in the
  *     documentation and/or other materials provided with the distribution.
  * 2.  Redistributions in binary form must reproduce the above copyright
  *     notice, this list of conditions and the following disclaimer in the
  *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
  *     its contributors may be used to endorse or promote products derived
  *     from this software without specific prior written permission.
  *
  *     its contributors may be used to endorse or promote products derived
  *     from this software without specific prior written permission.
  *
 #include "config.h"
 #include "CommandLineAPIHost.h"
 
 #include "config.h"
 #include "CommandLineAPIHost.h"
 
-#if ENABLE(INSPECTOR)
-
-#include "Element.h"
-#include "Frame.h"
-#include "FrameLoader.h"
-#include "HTMLFrameOwnerElement.h"
-#include "InspectorClient.h"
+#include "Database.h"
+#include "Document.h"
 #include "InspectorDOMAgent.h"
 #include "InspectorDOMStorageAgent.h"
 #include "InspectorDatabaseAgent.h"
 #include "InspectorDOMAgent.h"
 #include "InspectorDOMStorageAgent.h"
 #include "InspectorDatabaseAgent.h"
-#include "InspectorWebFrontendDispatchers.h"
+#include "JSCommandLineAPIHost.h"
+#include "JSDOMGlobalObject.h"
+#include "JSEventListener.h"
 #include "Pasteboard.h"
 #include "Storage.h"
 #include "Pasteboard.h"
 #include "Storage.h"
-#include "markup.h"
 #include <bindings/ScriptValue.h>
 #include <inspector/InspectorValues.h>
 #include <inspector/agents/InspectorAgent.h>
 #include <inspector/agents/InspectorConsoleAgent.h>
 #include <bindings/ScriptValue.h>
 #include <inspector/InspectorValues.h>
 #include <inspector/agents/InspectorAgent.h>
 #include <inspector/agents/InspectorConsoleAgent.h>
+#include <runtime/JSCInlines.h>
+#include <runtime/JSLock.h>
 #include <wtf/RefPtr.h>
 #include <wtf/StdLibExtras.h>
 
 #include <wtf/RefPtr.h>
 #include <wtf/StdLibExtras.h>
 
-#if ENABLE(SQL_DATABASE)
-#include "Database.h"
-#endif
+namespace WebCore {
 
 
+using namespace JSC;
 using namespace Inspector;
 
 using namespace Inspector;
 
-namespace WebCore {
-
-PassRefPtr<CommandLineAPIHost> CommandLineAPIHost::create()
+Ref<CommandLineAPIHost> CommandLineAPIHost::create()
 {
 {
-    return adoptRef(new CommandLineAPIHost);
+    return adoptRef(*new CommandLineAPIHost);
 }
 
 CommandLineAPIHost::CommandLineAPIHost()
 }
 
 CommandLineAPIHost::CommandLineAPIHost()
-    : m_inspectorAgent(nullptr)
-    , m_consoleAgent(nullptr)
-    , m_domAgent(nullptr)
-    , m_domStorageAgent(nullptr)
-#if ENABLE(SQL_DATABASE)
-    , m_databaseAgent(nullptr)
-#endif
+    : m_inspectedObject(std::make_unique<InspectableObject>())
 {
 {
-    m_defaultInspectableObject = adoptPtr(new InspectableObject);
 }
 
 }
 
-CommandLineAPIHost::~CommandLineAPIHost()
-{
-}
+CommandLineAPIHost::~CommandLineAPIHost() = default;
 
 void CommandLineAPIHost::disconnect()
 {
 
 void CommandLineAPIHost::disconnect()
 {
@@ -87,30 +73,76 @@ void CommandLineAPIHost::disconnect()
     m_consoleAgent = nullptr;
     m_domAgent = nullptr;
     m_domStorageAgent = nullptr;
     m_consoleAgent = nullptr;
     m_domAgent = nullptr;
     m_domStorageAgent = nullptr;
-#if ENABLE(SQL_DATABASE)
     m_databaseAgent = nullptr;
     m_databaseAgent = nullptr;
-#endif
 }
 
 }
 
-void CommandLineAPIHost::inspectImpl(PassRefPtr<InspectorValue> object, PassRefPtr<InspectorValue> hints)
+void CommandLineAPIHost::inspect(JSC::ExecState& state, JSC::JSValue valueToInspect, JSC::JSValue hintsValue)
+{
+    if (!m_inspectorAgent)
+        return;
+
+    RefPtr<InspectorObject> hintsObject;
+    if (!Inspector::toInspectorValue(state, hintsValue)->asObject(hintsObject))
+        return;
+
+    auto remoteObject = BindingTraits<Inspector::Protocol::Runtime::RemoteObject>::runtimeCast(Inspector::toInspectorValue(state, valueToInspect));
+    m_inspectorAgent->inspect(WTFMove(remoteObject), WTFMove(hintsObject));
+}
+
+static Vector<CommandLineAPIHost::ListenerEntry> listenerEntriesFromListenerInfo(ExecState& state, Document& document, const EventListenerInfo& listenerInfo)
 {
 {
-    if (m_inspectorAgent) {
-        RefPtr<Inspector::TypeBuilder::Runtime::RemoteObject> remoteObject = Inspector::TypeBuilder::Runtime::RemoteObject::runtimeCast(object);
-        m_inspectorAgent->inspect(remoteObject, hints->asObject());
+    VM& vm = state.vm();
+
+    Vector<CommandLineAPIHost::ListenerEntry> entries;
+    for (auto& eventListener : listenerInfo.eventListenerVector) {
+        auto jsListener = JSEventListener::cast(&eventListener->callback());
+        if (!jsListener) {
+            ASSERT_NOT_REACHED();
+            continue;
+        }
+
+        // Hide listeners from other contexts.
+        if (&jsListener->isolatedWorld() != &currentWorld(&state))
+            continue;
+
+        auto function = jsListener->jsFunction(document);
+        if (!function)
+            continue;
+
+        entries.append({ JSC::Strong<JSC::JSObject>(vm, function), eventListener->useCapture(), eventListener->isPassive(), eventListener->isOnce() });
     }
     }
+
+    return entries;
 }
 
 }
 
-void CommandLineAPIHost::getEventListenersImpl(Node* node, Vector<EventListenerInfo>& listenersArray)
+auto CommandLineAPIHost::getEventListeners(JSC::ExecState& state, Node* node) -> EventListenersRecord
 {
 {
-    if (m_domAgent)
-        m_domAgent->getEventListeners(node, listenersArray, false);
+    if (!m_domAgent)
+        return { };
+
+    if (!node)
+        return { };
+
+    Vector<EventListenerInfo> listenerInfoArray;
+    m_domAgent->getEventListeners(node, listenerInfoArray, false);
+
+    EventListenersRecord result;
+
+    for (auto& listenerInfo : listenerInfoArray) {
+        auto entries = listenerEntriesFromListenerInfo(state, node->document(), listenerInfo);
+        if (entries.isEmpty())
+            continue;
+        result.append({ listenerInfo.eventType, WTFMove(entries) });
+    }
+
+    return result;
 }
 
 void CommandLineAPIHost::clearConsoleMessages()
 {
     if (m_consoleAgent) {
 }
 
 void CommandLineAPIHost::clearConsoleMessages()
 {
     if (m_consoleAgent) {
-        ErrorString error;
-        m_consoleAgent->clearMessages(&error);
+        ErrorString unused;
+        m_consoleAgent->clearMessages(unused);
     }
 }
 
     }
 }
 
@@ -119,47 +151,58 @@ void CommandLineAPIHost::copyText(const String& text)
     Pasteboard::createForCopyAndPaste()->writePlainText(text, Pasteboard::CannotSmartReplace);
 }
 
     Pasteboard::createForCopyAndPaste()->writePlainText(text, Pasteboard::CannotSmartReplace);
 }
 
-Deprecated::ScriptValue CommandLineAPIHost::InspectableObject::get(JSC::ExecState*)
-{
-    return Deprecated::ScriptValue();
-};
-
-void CommandLineAPIHost::addInspectedObject(PassOwnPtr<CommandLineAPIHost::InspectableObject> object)
+JSC::JSValue CommandLineAPIHost::InspectableObject::get(JSC::ExecState&)
 {
 {
-    m_inspectedObjects.insert(0, object);
-    while (m_inspectedObjects.size() > 5)
-        m_inspectedObjects.removeLast();
+    return { };
 }
 
 }
 
-void CommandLineAPIHost::clearInspectedObjects()
+void CommandLineAPIHost::addInspectedObject(std::unique_ptr<CommandLineAPIHost::InspectableObject> object)
 {
 {
-    m_inspectedObjects.clear();
+    m_inspectedObject = WTFMove(object);
 }
 
 }
 
-CommandLineAPIHost::InspectableObject* CommandLineAPIHost::inspectedObject(unsigned index)
+JSC::JSValue CommandLineAPIHost::inspectedObject(JSC::ExecState& state)
 {
 {
-    if (index >= m_inspectedObjects.size())
-        return m_defaultInspectableObject.get();
+    if (!m_inspectedObject)
+        return jsUndefined();
 
 
-    return m_inspectedObjects[index].get();
+    JSC::JSLockHolder lock(&state);
+    auto scriptValue = m_inspectedObject->get(state);
+    return scriptValue ? scriptValue : jsUndefined();
 }
 
 }
 
-#if ENABLE(SQL_DATABASE)
-String CommandLineAPIHost::databaseIdImpl(Database* database)
+String CommandLineAPIHost::databaseId(Database& database)
 {
     if (m_databaseAgent)
         return m_databaseAgent->databaseId(database);
 {
     if (m_databaseAgent)
         return m_databaseAgent->databaseId(database);
-    return String();
+    return { };
 }
 }
-#endif
 
 
-String CommandLineAPIHost::storageIdImpl(Storage* storage)
+String CommandLineAPIHost::storageId(Storage& storage)
 {
     if (m_domStorageAgent)
         return m_domStorageAgent->storageId(storage);
 {
     if (m_domStorageAgent)
         return m_domStorageAgent->storageId(storage);
-    return String();
+    return { };
 }
 
 }
 
-} // namespace WebCore
+JSValue CommandLineAPIHost::wrapper(ExecState* exec, JSDOMGlobalObject* globalObject)
+{
+    JSValue value = m_wrappers.getWrapper(globalObject);
+    if (value)
+        return value;
+
+    JSObject* prototype = JSCommandLineAPIHost::createPrototype(exec->vm(), *globalObject);
+    Structure* structure = JSCommandLineAPIHost::createStructure(exec->vm(), globalObject, prototype);
+    JSCommandLineAPIHost* commandLineAPIHost = JSCommandLineAPIHost::create(structure, globalObject, makeRef(*this));
+    m_wrappers.addWrapper(globalObject, commandLineAPIHost);
+
+    return commandLineAPIHost;
+}
 
 
-#endif // ENABLE(INSPECTOR)
+void CommandLineAPIHost::clearAllWrappers()
+{
+    m_wrappers.clearAllWrappers();
+    m_inspectedObject = std::make_unique<InspectableObject>();
+}
+
+} // namespace WebCore