Title: [273365] trunk/Source
Revision
273365
Author
[email protected]
Date
2021-02-23 17:11:03 -0800 (Tue, 23 Feb 2021)

Log Message

[Cocoa] Web Inspector: Add support for reloading the inspected page via _WKInspectorExtension
https://bugs.webkit.org/show_bug.cgi?id=222296

Reviewed by BJ Burg.

Source/WebInspectorUI:

Added support for reloading the inspected page, including ignoring the cache if desired, via
_WKInspectorExtension.

* UserInterface/Controllers/WebInspectorExtensionController.js:
(WI.WebInspectorExtensionController.prototype.evaluateScriptForExtension):
(WI.WebInspectorExtensionController.prototype.reloadForExtension):
(WI.WebInspectorExtensionController):
* UserInterface/Protocol/InspectorFrontendAPI.js:
(InspectorFrontendAPI.evaluateScriptForExtension):
(InspectorFrontendAPI.reloadForExtension):

Source/WebKit:

Added a new method to _WKInspectorExtension which is used to implement `browser.devtools.inspectedWindow.reload`
in the Web Extensions API.

* UIProcess/API/APIInspectorExtension.cpp:
(API::InspectorExtension::reloadIgnoringCache):
* UIProcess/API/APIInspectorExtension.h:
* UIProcess/API/Cocoa/_WKInspectorExtension.h:
* UIProcess/API/Cocoa/_WKInspectorExtension.mm:
(-[_WKInspectorExtension reloadIgnoringCache:userAgent:injectedScript:completionHandler:]):
* UIProcess/Inspector/WebInspectorUIExtensionControllerProxy.cpp:
(WebKit::WebInspectorUIExtensionControllerProxy::reloadForExtension):
* UIProcess/Inspector/WebInspectorUIExtensionControllerProxy.h:
* WebProcess/Inspector/WebInspectorUIExtensionController.cpp:
(WebKit::WebInspectorUIExtensionController::reloadForExtension):
* WebProcess/Inspector/WebInspectorUIExtensionController.h:
* WebProcess/Inspector/WebInspectorUIExtensionController.messages.in:

Modified Paths

Diff

Modified: trunk/Source/WebInspectorUI/ChangeLog (273364 => 273365)


--- trunk/Source/WebInspectorUI/ChangeLog	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebInspectorUI/ChangeLog	2021-02-24 01:11:03 UTC (rev 273365)
@@ -1,3 +1,21 @@
+2021-02-23  Patrick Angle  <[email protected]>
+
+        [Cocoa] Web Inspector: Add support for reloading the inspected page via _WKInspectorExtension
+        https://bugs.webkit.org/show_bug.cgi?id=222296
+
+        Reviewed by BJ Burg.
+
+        Added support for reloading the inspected page, including ignoring the cache if desired, via
+        _WKInspectorExtension.
+
+        * UserInterface/Controllers/WebInspectorExtensionController.js:
+        (WI.WebInspectorExtensionController.prototype.evaluateScriptForExtension):
+        (WI.WebInspectorExtensionController.prototype.reloadForExtension):
+        (WI.WebInspectorExtensionController):
+        * UserInterface/Protocol/InspectorFrontendAPI.js:
+        (InspectorFrontendAPI.evaluateScriptForExtension):
+        (InspectorFrontendAPI.reloadForExtension):
+
 2021-02-19  Nikita Vasilyev  <[email protected]>
 
         Web Inspector: CSS Grid Inspector: use a color palette for default grid overlay colors

Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js (273364 => 273365)


--- trunk/Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js	2021-02-24 01:11:03 UTC (rev 273365)
@@ -125,7 +125,35 @@
             let {type, value} = resultOrError;
             return wasThrown ? {"error": resultOrError.description} : {"result": value};
         }).catch((error) => error.description);
-     }
+    }
+    
+    reloadForExtension(extensionID, {ignoreCache, userAgent, injectedScript} = {})
+    {
+        let extension = this._extensionForExtensionIDMap.get(extensionID);
+        if (!extension) {
+            WI.reportInternalError("Unable to evaluate script for extension with unknown ID: " + extensionID);
+            return WI.WebInspectorExtension.ErrorCode.InvalidRequest;
+        }
+
+        // FIXME: <webkit.org/b/222328> Implement `userAgent` and `injectedScript` options for `devtools.inspectedWindow.reload` command
+        if (userAgent) {
+            WI.reportInternalError("reloadForExtension: the 'userAgent' option is not yet implemented.");
+            return WI.WebInspectorExtension.ErrorCode.NotImplemented;
+        }
+
+        if (injectedScript) {
+            WI.reportInternalError("reloadForExtension: the 'injectedScript' option is not yet implemented.");
+            return WI.WebInspectorExtension.ErrorCode.NotImplemented;
+        }
+        
+        let target = WI.assumingMainTarget();
+        if (!target.hasCommand("Page.reload"))
+            return WI.WebInspectorExtension.ErrorCode.InvalidRequest;
+        
+        return target.PageAgent.reload.invoke({ignoreCache});
+        
+        
+    }
 };
 
 WI.WebInspectorExtensionController.Event = {

Modified: trunk/Source/WebInspectorUI/UserInterface/Protocol/InspectorFrontendAPI.js (273364 => 273365)


--- trunk/Source/WebInspectorUI/UserInterface/Protocol/InspectorFrontendAPI.js	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebInspectorUI/UserInterface/Protocol/InspectorFrontendAPI.js	2021-02-24 01:11:03 UTC (rev 273365)
@@ -223,5 +223,11 @@
     evaluateScriptForExtension(extensionID, scriptSource, {frameURL, contextSecurityOrigin, useContentScriptContext} = {})
     {
         return WI.sharedApp.extensionController.evaluateScriptForExtension(extensionID, scriptSource, {frameURL, contextSecurityOrigin, useContentScriptContext});
-    }
+    },
+    
+    // Returns a string (WI.WebInspectorExtension.ErrorCode) if an error occurred that prevented reloading.
+    reloadForExtension(extensionID, {ignoreCache, userAgent, injectedScript} = {})
+    {
+        return WI.sharedApp.extensionController.reloadForExtension(extensionID, {ignoreCache, userAgent, injectedScript});
+    },
 };

Modified: trunk/Source/WebKit/ChangeLog (273364 => 273365)


--- trunk/Source/WebKit/ChangeLog	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebKit/ChangeLog	2021-02-24 01:11:03 UTC (rev 273365)
@@ -1,3 +1,27 @@
+2021-02-23  Patrick Angle  <[email protected]>
+
+        [Cocoa] Web Inspector: Add support for reloading the inspected page via _WKInspectorExtension
+        https://bugs.webkit.org/show_bug.cgi?id=222296
+
+        Reviewed by BJ Burg.
+
+        Added a new method to _WKInspectorExtension which is used to implement `browser.devtools.inspectedWindow.reload`
+        in the Web Extensions API.
+
+        * UIProcess/API/APIInspectorExtension.cpp:
+        (API::InspectorExtension::reloadIgnoringCache):
+        * UIProcess/API/APIInspectorExtension.h:
+        * UIProcess/API/Cocoa/_WKInspectorExtension.h:
+        * UIProcess/API/Cocoa/_WKInspectorExtension.mm:
+        (-[_WKInspectorExtension reloadIgnoringCache:userAgent:injectedScript:completionHandler:]):
+        * UIProcess/Inspector/WebInspectorUIExtensionControllerProxy.cpp:
+        (WebKit::WebInspectorUIExtensionControllerProxy::reloadForExtension):
+        * UIProcess/Inspector/WebInspectorUIExtensionControllerProxy.h:
+        * WebProcess/Inspector/WebInspectorUIExtensionController.cpp:
+        (WebKit::WebInspectorUIExtensionController::reloadForExtension):
+        * WebProcess/Inspector/WebInspectorUIExtensionController.h:
+        * WebProcess/Inspector/WebInspectorUIExtensionController.messages.in:
+
 2021-02-23  Brent Fulgham  <[email protected]>
 
         [macOS] Allow additional syscall support in the sandbox 

Modified: trunk/Source/WebKit/UIProcess/API/APIInspectorExtension.cpp (273364 => 273365)


--- trunk/Source/WebKit/UIProcess/API/APIInspectorExtension.cpp	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebKit/UIProcess/API/APIInspectorExtension.cpp	2021-02-24 01:11:03 UTC (rev 273365)
@@ -65,6 +65,16 @@
     m_extensionControllerProxy->evaluateScriptForExtension(m_identifier, scriptSource, frameURL, contextSecurityOrigin, useContentScriptContext, WTFMove(completionHandler));
 }
 
+void InspectorExtension::reloadIgnoringCache(const Optional<bool>& ignoreCache, const Optional<WTF::String>& userAgent, const Optional<WTF::String>& injectedScript,  WTF::CompletionHandler<void(WebKit::InspectorExtensionEvaluationResult)>&& completionHandler)
+{
+    if (!m_extensionControllerProxy) {
+        completionHandler(makeUnexpected(WebKit::InspectorExtensionError::ContextDestroyed));
+        return;
+    }
+
+    m_extensionControllerProxy->reloadForExtension(m_identifier, ignoreCache, userAgent, injectedScript, WTFMove(completionHandler));
+}
+
 } // namespace API
 
 #endif // ENABLE(INSPECTOR_EXTENSIONS)

Modified: trunk/Source/WebKit/UIProcess/API/APIInspectorExtension.h (273364 => 273365)


--- trunk/Source/WebKit/UIProcess/API/APIInspectorExtension.h	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebKit/UIProcess/API/APIInspectorExtension.h	2021-02-24 01:11:03 UTC (rev 273365)
@@ -48,6 +48,7 @@
 
     void createTab(const WTF::String& tabName, const WTF::URL& tabIconURL, const WTF::URL& sourceURL, WTF::CompletionHandler<void(Expected<WebKit::InspectorExtensionTabID, WebKit::InspectorExtensionError>)>&&);
     void evaluateScript(const WTF::String& scriptSource, const Optional<WTF::URL>& frameURL, const Optional<WTF::URL>& contextSecurityOrigin, const Optional<bool>& useContentScriptContext, WTF::CompletionHandler<void(WebKit::InspectorExtensionEvaluationResult)>&&);
+    void reloadIgnoringCache(const Optional<bool>& ignoreCache, const Optional<WTF::String>& userAgent, const Optional<WTF::String>& injectedScript,  WTF::CompletionHandler<void(WebKit::InspectorExtensionEvaluationResult)>&&);
 
 private:
     InspectorExtension(const WTF::String& identifier, WebKit::WebInspectorUIExtensionControllerProxy&);

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKInspectorExtension.h (273364 => 273365)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKInspectorExtension.h	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKInspectorExtension.h	2021-02-24 01:11:03 UTC (rev 273365)
@@ -61,6 +61,15 @@
  */
 - (void)evaluateScript:(NSString *)scriptSource frameURL:(NSURL *)frameURL contextSecurityOrigin:(NSURL *)contextSecurityOrigin useContentScriptContext:(BOOL)useContentScriptContext completionHandler:(void(^)(NSError * _Nullable, NSDictionary * _Nullable result))completionHandler;
 
+/**
+ * @abstract Reloads the inspected page on behalf of the _WKInspectorExtension.
+ * @param ignoreCache If YES, reloads the page while ignoring the cache.
+ * @param userAgent If specified, overrides the user agent to be sent in the `User-Agent` header and returned by calls to `navigator.userAgent` made by scripts running in the page. This only affects the next navigation.
+ * @param injectedScript If specified, injects the given _javascript_ _expression_ into all frames on the page before any other scripts.
+ * @param completionHandler A block to invoke when the operation completes or fails.
+ */
+- (void)reloadIgnoringCache:(BOOL)ignoreCache userAgent:(NSString *)userAgent injectedScript:(NSString *)injectedScript completionHandler:(void(^)(NSError * _Nullable))completionHandler;
+
 @property (readonly, nonatomic) NSString *extensionID;
 
 @end

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKInspectorExtension.mm (273364 => 273365)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKInspectorExtension.mm	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKInspectorExtension.mm	2021-02-24 01:11:03 UTC (rev 273365)
@@ -84,6 +84,26 @@
     });
 }
 
+- (void)reloadIgnoringCache:(BOOL)ignoreCache userAgent:(NSString *)userAgent injectedScript:(NSString *)injectedScript completionHandler:(void(^)(NSError *))completionHandler
+{
+    Optional<String> optionalUserAgent = userAgent ? makeOptional(String(userAgent)) : WTF::nullopt;
+    Optional<String> optionalInjectedScript = injectedScript ? makeOptional(String(injectedScript)) : WTF::nullopt;
+    _extension->reloadIgnoringCache(ignoreCache, optionalUserAgent, optionalInjectedScript, [protectedSelf = retainPtr(self), capturedBlock = makeBlockPtr(WTFMove(completionHandler))] (WebKit::InspectorExtensionEvaluationResult&& result) mutable {
+        if (!result) {
+            capturedBlock([NSError errorWithDomain:WKErrorDomain code:WKErrorUnknown userInfo:@{ NSLocalizedFailureReasonErrorKey: WebKit::inspectorExtensionErrorToString(result.error()) }]);
+            return;
+        }
+        
+        auto valueOrException = result.value();
+        if (!valueOrException) {
+            capturedBlock(nsErrorFromExceptionDetails(valueOrException.error()).get());
+            return;
+        }
+
+        capturedBlock(nil);
+    });
+}
+
 // MARK: Properties.
 
 - (NSString *)extensionID

Modified: trunk/Source/WebKit/UIProcess/Inspector/WebInspectorUIExtensionControllerProxy.cpp (273364 => 273365)


--- trunk/Source/WebKit/UIProcess/Inspector/WebInspectorUIExtensionControllerProxy.cpp	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebKit/UIProcess/Inspector/WebInspectorUIExtensionControllerProxy.cpp	2021-02-24 01:11:03 UTC (rev 273365)
@@ -137,6 +137,25 @@
     });
 }
 
+void WebInspectorUIExtensionControllerProxy::reloadForExtension(const InspectorExtensionID& extensionID, const Optional<bool>& ignoreCache, const Optional<String>& userAgent, const Optional<String>& injectedScript, WTF::CompletionHandler<void(InspectorExtensionEvaluationResult)>&& completionHandler)
+{
+    whenFrontendHasLoaded([weakThis = makeWeakPtr(this), extensionID, ignoreCache, userAgent, injectedScript, completionHandler = WTFMove(completionHandler)] () mutable {
+        if (!weakThis || !weakThis->m_inspectorPage) {
+            completionHandler(makeUnexpected(InspectorExtensionError::ContextDestroyed));
+            return;
+        }
+
+        weakThis->m_inspectorPage->sendWithAsyncReply(Messages::WebInspectorUIExtensionController::ReloadForExtension {extensionID, ignoreCache, userAgent, injectedScript}, [completionHandler = WTFMove(completionHandler)](const Optional<InspectorExtensionError> error) mutable {
+            if (error) {
+                completionHandler(makeUnexpected(error.value()));
+                return;
+            }
+
+            completionHandler({ });
+        });
+    });
+}
+
 } // namespace WebKit
 
 #endif // ENABLE(INSPECTOR_EXTENSIONS)

Modified: trunk/Source/WebKit/UIProcess/Inspector/WebInspectorUIExtensionControllerProxy.h (273364 => 273365)


--- trunk/Source/WebKit/UIProcess/Inspector/WebInspectorUIExtensionControllerProxy.h	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebKit/UIProcess/Inspector/WebInspectorUIExtensionControllerProxy.h	2021-02-24 01:11:03 UTC (rev 273365)
@@ -52,6 +52,7 @@
     void unregisterExtension(const InspectorExtensionID&, WTF::CompletionHandler<void(Expected<bool, InspectorExtensionError>)>&&);
     void createTabForExtension(const InspectorExtensionID&, const String& tabName, const URL& tabIconURL, const URL& sourceURL, WTF::CompletionHandler<void(Expected<InspectorExtensionTabID, InspectorExtensionError>)>&&);
     void evaluateScriptForExtension(const InspectorExtensionID&, const String& scriptSource, const Optional<URL>& frameURL, const Optional<URL>& contextSecurityOrigin, const Optional<bool>& useContentScriptContext, WTF::CompletionHandler<void(InspectorExtensionEvaluationResult)>&&);
+    void reloadForExtension(const InspectorExtensionID&, const Optional<bool>& ignoreCache, const Optional<String>& userAgent, const Optional<String>& injectedScript, WTF::CompletionHandler<void(InspectorExtensionEvaluationResult)>&&);
 
     // Notifications.
     void inspectorFrontendLoaded();

Modified: trunk/Source/WebKit/WebProcess/Inspector/WebInspectorUIExtensionController.cpp (273364 => 273365)


--- trunk/Source/WebKit/WebProcess/Inspector/WebInspectorUIExtensionController.cpp	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebKit/WebProcess/Inspector/WebInspectorUIExtensionController.cpp	2021-02-24 01:11:03 UTC (rev 273365)
@@ -281,6 +281,48 @@
     });
 }
 
+void WebInspectorUIExtensionController::reloadForExtension(const InspectorExtensionID& extensionID, const Optional<bool>& ignoreCache, const Optional<String>& userAgent, const Optional<String>& injectedScript, CompletionHandler<void(const Optional<InspectorExtensionError>&)>&& completionHandler)
+{
+    if (!m_frontendClient) {
+        completionHandler(InspectorExtensionError::InvalidRequest);
+        return;
+    }
+
+    Ref<JSON::Object> optionalArguments = JSON::Object::create();
+    if (ignoreCache)
+        optionalArguments->setBoolean("ignoreCache"_s, *ignoreCache);
+    if (userAgent)
+        optionalArguments->setString("userAgent"_s, *userAgent);
+    if (injectedScript)
+        optionalArguments->setString("injectedScript"_s, *injectedScript);
+
+    Vector<Ref<JSON::Value>> arguments {
+        JSON::Value::create(extensionID),
+        WTFMove(optionalArguments)
+    };
+
+    m_frontendClient->frontendAPIDispatcher().dispatchCommandWithResultAsync("reloadForExtension"_s, WTFMove(arguments), [weakThis = makeWeakPtr(this), completionHandler = WTFMove(completionHandler)](InspectorFrontendAPIDispatcher::EvaluationResult&& result) mutable {
+        if (!weakThis) {
+            completionHandler(InspectorExtensionError::ContextDestroyed);
+            return;
+        }
+
+        auto* frontendGlobalObject = weakThis->m_frontendClient->frontendAPIDispatcher().frontendGlobalObject();
+        if (!frontendGlobalObject) {
+            completionHandler(InspectorExtensionError::ContextDestroyed);
+            return;
+        }
+
+        if (auto parsedError = weakThis->parseInspectorExtensionErrorFromEvaluationResult(result)) {
+            LOG(Inspector, "Internal error encountered while evaluating upon the frontend: %s", inspectorExtensionErrorToString(*parsedError).utf8().data());
+            completionHandler(parsedError);
+            return;
+        }
+
+        completionHandler(WTF::nullopt);
+    });
+}
+
 } // namespace WebKit
 
 #endif // ENABLE(INSPECTOR_EXTENSIONS)

Modified: trunk/Source/WebKit/WebProcess/Inspector/WebInspectorUIExtensionController.h (273364 => 273365)


--- trunk/Source/WebKit/WebProcess/Inspector/WebInspectorUIExtensionController.h	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebKit/WebProcess/Inspector/WebInspectorUIExtensionController.h	2021-02-24 01:11:03 UTC (rev 273365)
@@ -67,6 +67,7 @@
     void unregisterExtension(const InspectorExtensionID&, CompletionHandler<void(Expected<bool, InspectorExtensionError>)>&&);
     void createTabForExtension(const InspectorExtensionID&, const String& tabName, const URL& tabIconURL, const URL& sourceURL, CompletionHandler<void(Expected<InspectorExtensionTabID, InspectorExtensionError>)>&&);
     void evaluateScriptForExtension(const InspectorExtensionID&, const String& scriptSource, const Optional<URL>& frameURL, const Optional<URL>& contextSecurityOrigin, const Optional<bool>& useContentScriptContext, CompletionHandler<void(const IPC::DataReference&, const Optional<WebCore::ExceptionDetails>&, const Optional<InspectorExtensionError>&)>&&);
+    void reloadForExtension(const InspectorExtensionID&, const Optional<bool>& ignoreCache, const Optional<String>& userAgent, const Optional<String>& injectedScript, CompletionHandler<void(const Optional<InspectorExtensionError>&)>&&);
 
 private:
     JSC::JSObject* unwrapEvaluationResultAsObject(WebCore::InspectorFrontendAPIDispatcher::EvaluationResult);

Modified: trunk/Source/WebKit/WebProcess/Inspector/WebInspectorUIExtensionController.messages.in (273364 => 273365)


--- trunk/Source/WebKit/WebProcess/Inspector/WebInspectorUIExtensionController.messages.in	2021-02-24 01:05:36 UTC (rev 273364)
+++ trunk/Source/WebKit/WebProcess/Inspector/WebInspectorUIExtensionController.messages.in	2021-02-24 01:11:03 UTC (rev 273365)
@@ -28,6 +28,7 @@
 
     CreateTabForExtension(String extensionID, String tabName, URL tabIconURL, URL sourceURL) -> (Expected<String, WebKit::InspectorExtensionError> result) Async
     EvaluateScriptForExtension(String extensionID, String scriptSource, Optional<URL> frameURL, Optional<URL> contextSecurityOrigin, Optional<bool> useContentScriptContext) -> (IPC::DataReference resultData, Optional<WebCore::ExceptionDetails> details, Optional<WebKit::InspectorExtensionError> error) Async
+    ReloadForExtension(String extensionID, Optional<bool> ignoreCache, Optional<String> userAgent, Optional<String> injectedScript) -> (Optional<WebKit::InspectorExtensionError> error) Async
 }
 
 #endif // ENABLE(INSPECTOR_EXTENSIONS)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to