[LFC][Floats] FloatAvoider does not need to keep a pointer to Layout::Box around.
[WebKit-https.git] / Source / WebKit / WebProcess / Inspector / WebInspectorUIExtensionController.cpp
1 /*
2  * Copyright (C) 2020 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 "WebInspectorUIExtensionController.h"
28
29 #if ENABLE(INSPECTOR_EXTENSIONS)
30
31 #include "WebInspectorUI.h"
32 #include "WebInspectorUIExtensionControllerMessages.h"
33 #include "WebInspectorUIExtensionControllerMessagesReplies.h"
34 #include "WebPage.h"
35 #include "WebProcess.h"
36 #include <WebCore/InspectorFrontendAPIDispatcher.h>
37
38 namespace WebKit {
39
40 WebInspectorUIExtensionController::WebInspectorUIExtensionController(WebCore::InspectorFrontendClient& inspectorFrontend)
41     : m_frontendClient(makeWeakPtr(inspectorFrontend))
42 {
43     Page* page = inspectorFrontend.frontendPage();
44     ASSERT(page);
45
46 //    WTFReportBacktrace();
47     WebProcess::singleton().addMessageReceiver(Messages::WebInspectorUIExtensionController::messageReceiverName(), WebPage::fromCorePage(*page).identifier(), *this);
48 }
49
50 WebInspectorUIExtensionController::~WebInspectorUIExtensionController()
51 {
52 //    WTFReportBacktrace();
53     WebProcess::singleton().removeMessageReceiver(*this);
54 }
55
56 Optional<InspectorExtensionError> WebInspectorUIExtensionController::parseInspectorExtensionErrorFromResult(JSC::JSValue result)
57 {
58     ASSERT(m_frontendClient);
59     auto globalObject = m_frontendClient->frontendAPIDispatcher().frontendGlobalObject();
60     if (!globalObject)
61         return InspectorExtensionError::ContextDestroyed;
62
63     // If the evaluation result is a string, the frontend returned an error string.
64     // Anything else (falsy values, objects, arrays, DOM, etc.) is interpreted as success.
65     if (result.isString()) {
66         auto resultString = result.toWTFString(globalObject);
67         if (resultString == "ContextDestroyed"_s)
68             return InspectorExtensionError::ContextDestroyed;
69         if (resultString == "InternalError"_s)
70             return InspectorExtensionError::InternalError;
71         if (resultString == "InvalidRequest"_s)
72             return InspectorExtensionError::InvalidRequest;
73         if (resultString == "RegistrationFailed"_s)
74             return InspectorExtensionError::RegistrationFailed;
75
76         ASSERT_NOT_REACHED();
77         return InspectorExtensionError::InternalError;
78     }
79
80     return WTF::nullopt;
81 }
82
83 // WebInspectorUIExtensionController IPC messages.
84
85 void WebInspectorUIExtensionController::registerExtension(const String& extensionID, const String& displayName, CompletionHandler<void(Expected<bool, InspectorExtensionError>)>&& completionHandler)
86 {
87     if (!m_frontendClient) {
88         completionHandler(makeUnexpected(InspectorExtensionError::InvalidRequest));
89         return;
90     }
91
92     Vector<Ref<JSON::Value>> arguments {
93         JSON::Value::create(extensionID),
94         JSON::Value::create(displayName),
95     };
96     m_frontendClient->frontendAPIDispatcher().dispatchCommandWithResultAsync("registerExtension"_s, WTFMove(arguments), [weakThis = makeWeakPtr(this), completionHandler = WTFMove(completionHandler)](InspectorFrontendAPIDispatcher::EvaluationResult&& result) mutable {
97         if (!weakThis || !result) {
98             completionHandler(makeUnexpected(InspectorExtensionError::ContextDestroyed));
99             return;
100         }
101
102         if (auto parsedError = weakThis->parseInspectorExtensionErrorFromResult(result.value())) {
103             completionHandler(makeUnexpected(parsedError.value()));
104             return;
105         }
106
107         completionHandler(true);
108     });
109 }
110
111 void WebInspectorUIExtensionController::unregisterExtension(const String& extensionID, CompletionHandler<void(Expected<bool, InspectorExtensionError>)>&& completionHandler)
112 {
113     if (!m_frontendClient) {
114         completionHandler(makeUnexpected(InspectorExtensionError::InvalidRequest));
115         return;
116     }
117
118     Vector<Ref<JSON::Value>> arguments { JSON::Value::create(extensionID) };
119     m_frontendClient->frontendAPIDispatcher().dispatchCommandWithResultAsync("unregisterExtension"_s, WTFMove(arguments), [weakThis = makeWeakPtr(this), completionHandler = WTFMove(completionHandler)](InspectorFrontendAPIDispatcher::EvaluationResult&& result) mutable {
120         if (!weakThis || !result) {
121             completionHandler(makeUnexpected(InspectorExtensionError::ContextDestroyed));
122             return;
123         }
124
125         if (auto parsedError = weakThis->parseInspectorExtensionErrorFromResult(result.value())) {
126             completionHandler(makeUnexpected(parsedError.value()));
127             return;
128         }
129
130         completionHandler(true);
131     });
132 }
133
134 } // namespace WebKit
135
136 #endif // ENABLE(INSPECTOR_EXTENSIONS)