Web Inspector: inspector settings should not be shared between different inspection...
authorbburg@apple.com <bburg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Nov 2015 02:49:51 +0000 (02:49 +0000)
committerbburg@apple.com <bburg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Nov 2015 02:49:51 +0000 (02:49 +0000)
https://bugs.webkit.org/show_bug.cgi?id=151151

Reviewed by Timothy Hatcher.

Source/WebCore:

InspectorController and InspectorFrontendClient should know how to compute their
inspection levels, so that this level can be exposed to the Inspector frontend for
preference disambiguation by inspection level.

 - A Page with normal web content has an inspection level of 0.
 - The first Web Inspector has an inspection level of 1.
 - The second Web Inspector that inspects the Inspector has an inspection level of 2.
 - And so forth...

For local frontend clients (WK1 and the ProtocolTestStub), the inspection level of
a Page computed as follows:

- If the page's inspector controller has no frontend client, then the Page
is normal web content (level 0).
- If the page's inspector controller has a frontend client, ask for its inspection level.
A frontend client looks at the inspection level reported by inspected page's inspector
controller and increments by one to account for the crossed inspection boundary.

No new tests, this is blocked by test infrastructure fixes (https://webkit.org/b/151573).

* inspector/InspectorController.cpp:
(WebCore::InspectorController::inspectionLevel): Added.
(WebCore::InspectorController::hasInspectorFrontendClient): Deleted.
* inspector/InspectorController.h:
* inspector/InspectorFrontendClient.h:
* inspector/InspectorFrontendClientLocal.cpp:
(WebCore::InspectorFrontendClientLocal::canAttachWindow): Check inspectionLevel().
(WebCore::InspectorFrontendClientLocal::inspectionLevel): Added.
* inspector/InspectorFrontendClientLocal.h:
* inspector/InspectorFrontendHost.cpp:
(WebCore::InspectorFrontendHost::inspectionLevel): Added.
* inspector/InspectorFrontendHost.h:
* inspector/InspectorFrontendHost.idl:
* page/ContextMenuController.cpp:
(WebCore::ContextMenuController::populate): Check inspectionLevel().

Source/WebInspectorUI:

It's really annoying to have shared settings between Inspector^1 and Inspector^2, because
they are not designed to respond to external changes to local storage keys. As a result,
the two inspectors seemingly have different settings while both are open, but the settings
clobber each other depending on which inspector is closed first. On the next inspector
being opened, it has settings that reflect whichever inspector closed last.

To fix this, alter the local storage key prefix to incude the inspection level when it is
greater than 1 (i.e., inspecting the inspector). The storage prefix becomes
"com.apple.WebInspector-${inspectionLevel}." in this case.
This is backwards-compatible for normal Inspector, who keeps the same storage prefix.

Alternate approaches that were considered and abandoned:

 - Use separate WKWebSiteDataStores for each inspection level. This API (as it currently is)
does not support multiple on-disk storage locations. We don't want to add an entirely new
Library directory for each inspector level, and sharing a single location doesn't fix the
shared-settings bug. Changing storage location would lose all existing Inspector settings.

 - Sync settings between multiple open Inspectors. This would be catastrophic, as changing
the active tab on one inspector would immediately propagate to the other open inspectors.

* UserInterface/Models/Setting.js:
(WebInspector.Setting):
* UserInterface/Protocol/InspectorFrontendHostStub.js:
(window.InspectorFrontendHost.WebInspector.InspectorFrontendHostStub.prototype.inspectionLevel):

Source/WebKit2:

In WebKit2, we already track the inspection level of WebPages in order to give inspectors
different page groups. Send the inspection level to WebInspectorUI WebProcess when
establishing a connection from the UIProcess. Use this number in the FrontendClient.

* UIProcess/WebInspectorProxy.cpp:
(WebKit::WebInspectorProxy::inspectionLevel): Renamed from inspectorLevel to be consistent.
(WebKit::WebInspectorProxy::inspectorPageGroupIdentifier):
(WebKit::WebInspectorProxy::didRelaunchInspectorPageProcess):
(WebKit::WebInspectorProxy::eagerlyCreateInspectorPage):
(WebKit::WebInspectorProxy::createInspectorPage):
(WebKit::WebInspectorProxy::inspectorLevel): Deleted.
* UIProcess/WebInspectorProxy.h:
* UIProcess/mac/WebInspectorProxyMac.mm:
(WebKit::WebInspectorProxy::updateInspectorWindowTitle):
* WebProcess/WebPage/WebInspectorUI.cpp:
(WebKit::WebInspectorUI::establishConnection):
* WebProcess/WebPage/WebInspectorUI.h:
* WebProcess/WebPage/WebInspectorUI.messages.in:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@192756 268f45cc-cd09-0410-ab3c-d52691b4dbfc

20 files changed:
Source/WebCore/ChangeLog
Source/WebCore/inspector/InspectorController.cpp
Source/WebCore/inspector/InspectorController.h
Source/WebCore/inspector/InspectorFrontendClient.h
Source/WebCore/inspector/InspectorFrontendClientLocal.cpp
Source/WebCore/inspector/InspectorFrontendClientLocal.h
Source/WebCore/inspector/InspectorFrontendHost.cpp
Source/WebCore/inspector/InspectorFrontendHost.h
Source/WebCore/inspector/InspectorFrontendHost.idl
Source/WebCore/page/ContextMenuController.cpp
Source/WebInspectorUI/ChangeLog
Source/WebInspectorUI/UserInterface/Models/Setting.js
Source/WebInspectorUI/UserInterface/Protocol/InspectorFrontendHostStub.js
Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/WebInspectorProxy.cpp
Source/WebKit2/UIProcess/WebInspectorProxy.h
Source/WebKit2/UIProcess/mac/WebInspectorProxyMac.mm
Source/WebKit2/WebProcess/WebPage/WebInspectorUI.cpp
Source/WebKit2/WebProcess/WebPage/WebInspectorUI.h
Source/WebKit2/WebProcess/WebPage/WebInspectorUI.messages.in

index d065a0f..b2056e4 100644 (file)
@@ -1,3 +1,46 @@
+2015-11-23  Brian Burg  <bburg@apple.com>
+
+        Web Inspector: inspector settings should not be shared between different inspection levels
+        https://bugs.webkit.org/show_bug.cgi?id=151151
+
+        Reviewed by Timothy Hatcher.
+
+        InspectorController and InspectorFrontendClient should know how to compute their
+        inspection levels, so that this level can be exposed to the Inspector frontend for
+        preference disambiguation by inspection level.
+
+         - A Page with normal web content has an inspection level of 0.
+         - The first Web Inspector has an inspection level of 1.
+         - The second Web Inspector that inspects the Inspector has an inspection level of 2.
+         - And so forth...
+
+        For local frontend clients (WK1 and the ProtocolTestStub), the inspection level of
+        a Page computed as follows:
+
+        - If the page's inspector controller has no frontend client, then the Page
+        is normal web content (level 0).
+        - If the page's inspector controller has a frontend client, ask for its inspection level.
+        A frontend client looks at the inspection level reported by inspected page's inspector
+        controller and increments by one to account for the crossed inspection boundary.
+
+        No new tests, this is blocked by test infrastructure fixes (https://webkit.org/b/151573).
+
+        * inspector/InspectorController.cpp:
+        (WebCore::InspectorController::inspectionLevel): Added.
+        (WebCore::InspectorController::hasInspectorFrontendClient): Deleted.
+        * inspector/InspectorController.h:
+        * inspector/InspectorFrontendClient.h:
+        * inspector/InspectorFrontendClientLocal.cpp:
+        (WebCore::InspectorFrontendClientLocal::canAttachWindow): Check inspectionLevel().
+        (WebCore::InspectorFrontendClientLocal::inspectionLevel): Added.
+        * inspector/InspectorFrontendClientLocal.h:
+        * inspector/InspectorFrontendHost.cpp:
+        (WebCore::InspectorFrontendHost::inspectionLevel): Added.
+        * inspector/InspectorFrontendHost.h:
+        * inspector/InspectorFrontendHost.idl:
+        * page/ContextMenuController.cpp:
+        (WebCore::ContextMenuController::populate): Check inspectionLevel().
+
 2015-11-20  Brian Burg  <bburg@apple.com>
 
         Web Inspector: RemoteInspector should track targets and connections for remote automation
index 0410972..3397600 100644 (file)
@@ -219,9 +219,9 @@ bool InspectorController::hasRemoteFrontend() const
     return m_frontendRouter->hasRemoteFrontend();
 }
 
-bool InspectorController::hasInspectorFrontendClient() const
+unsigned InspectorController::inspectionLevel() const
 {
-    return m_inspectorFrontendClient;
+    return m_inspectorFrontendClient ? m_inspectorFrontendClient->inspectionLevel() : 0;
 }
 
 void InspectorController::didClearWindowObjectInWorld(Frame& frame, DOMWrapperWorld& world)
index 34445a4..f1d3e5c 100644 (file)
@@ -84,7 +84,7 @@ public:
     WEBCORE_EXPORT void show();
 
     WEBCORE_EXPORT void setInspectorFrontendClient(InspectorFrontendClient*);
-    bool hasInspectorFrontendClient() const;
+    unsigned inspectionLevel() const;
     void didClearWindowObjectInWorld(Frame&, DOMWrapperWorld&);
 
     WEBCORE_EXPORT void dispatchMessageFromFrontend(const String& message);
index 5d3f6c1..09b3251 100644 (file)
@@ -55,6 +55,7 @@ public:
     virtual void moveWindowBy(float x, float y) = 0;
 
     virtual String localizedStringsURL() = 0;
+    virtual unsigned inspectionLevel() const = 0;
 
     virtual void bringToFront() = 0;
     virtual void closeWindow() = 0;
index c1445d4..0a3bfe0 100644 (file)
@@ -185,7 +185,7 @@ void InspectorFrontendClientLocal::requestSetDockSide(DockSide dockSide)
 bool InspectorFrontendClientLocal::canAttachWindow()
 {
     // Don't allow attaching to another inspector -- two inspectors in one window is too much!
-    bool isInspectorPage = m_inspectedPageController->hasInspectorFrontendClient();
+    bool isInspectorPage = m_inspectedPageController->inspectionLevel() > 0;
     if (isInspectorPage)
         return false;
 
@@ -357,6 +357,11 @@ bool InspectorFrontendClientLocal::isUnderTest()
     return m_inspectedPageController->isUnderTest();
 }
 
+unsigned InspectorFrontendClientLocal::inspectionLevel() const
+{
+    return m_inspectedPageController->inspectionLevel() + 1;
+}
+
 bool InspectorFrontendClientLocal::evaluateAsBoolean(const String& expression)
 {
     Deprecated::ScriptValue value = m_frontendPage->mainFrame().script().executeScript(expression);
index d4e18c3..84867be 100644 (file)
@@ -79,6 +79,7 @@ public:
     WEBCORE_EXPORT virtual void sendMessageToBackend(const String& message) override final;
 
     WEBCORE_EXPORT virtual bool isUnderTest() override final;
+    WEBCORE_EXPORT virtual unsigned inspectionLevel() const override final;
 
     WEBCORE_EXPORT bool canAttachWindow();
     WEBCORE_EXPORT void setDockingUnavailable(bool);
index 8e275a8..e22c082 100644 (file)
@@ -236,6 +236,11 @@ String InspectorFrontendHost::debuggableType()
     return ASCIILiteral("web");
 }
 
+unsigned InspectorFrontendHost::inspectionLevel()
+{
+    return m_client ? m_client->inspectionLevel() : 1;
+}
+
 String InspectorFrontendHost::platform()
 {
 #if PLATFORM(MAC) || PLATFORM(IOS)
index d11575d..641a6a4 100644 (file)
@@ -71,6 +71,7 @@ public:
 
     String localizedStringsURL();
     String debuggableType();
+    unsigned inspectionLevel();
 
     String platform();
     String port();
index fafcde5..a8f6f9d 100644 (file)
@@ -53,6 +53,7 @@
 
     DOMString localizedStringsURL();
     DOMString debuggableType();
+    unsigned long inspectionLevel();
 
     void copyText(DOMString text);
     void killText(DOMString text, boolean shouldPrependToKillRing, boolean shouldStartNewSequence);
index 77e43a9..a6e8d51 100644 (file)
@@ -897,7 +897,7 @@ void ContextMenuController::populate()
                 appendItem(SpeechMenuItem, m_contextMenu.get());
 #endif                
             } else {
-                if (!(frame->page() && (frame->page()->inspectorController().hasInspectorFrontendClient() || frame->page()->inspectorController().hasRemoteFrontend()))) {
+                if (!(frame->page() && (frame->page()->inspectorController().inspectionLevel() > 0 || frame->page()->inspectorController().hasRemoteFrontend()))) {
 
                 // In GTK+ unavailable items are not hidden but insensitive.
 #if PLATFORM(GTK)
index 3e2cab0..7468d9d 100644 (file)
@@ -1,5 +1,38 @@
 2015-11-23  Brian Burg  <bburg@apple.com>
 
+        Web Inspector: inspector settings should not be shared between different inspection levels
+        https://bugs.webkit.org/show_bug.cgi?id=151151
+
+        Reviewed by Timothy Hatcher.
+
+        It's really annoying to have shared settings between Inspector^1 and Inspector^2, because
+        they are not designed to respond to external changes to local storage keys. As a result,
+        the two inspectors seemingly have different settings while both are open, but the settings
+        clobber each other depending on which inspector is closed first. On the next inspector
+        being opened, it has settings that reflect whichever inspector closed last.
+
+        To fix this, alter the local storage key prefix to incude the inspection level when it is
+        greater than 1 (i.e., inspecting the inspector). The storage prefix becomes
+        "com.apple.WebInspector-${inspectionLevel}." in this case.
+        This is backwards-compatible for normal Inspector, who keeps the same storage prefix. 
+
+        Alternate approaches that were considered and abandoned:
+
+         - Use separate WKWebSiteDataStores for each inspection level. This API (as it currently is)
+        does not support multiple on-disk storage locations. We don't want to add an entirely new
+        Library directory for each inspector level, and sharing a single location doesn't fix the
+        shared-settings bug. Changing storage location would lose all existing Inspector settings.
+
+         - Sync settings between multiple open Inspectors. This would be catastrophic, as changing
+        the active tab on one inspector would immediately propagate to the other open inspectors.
+
+        * UserInterface/Models/Setting.js:
+        (WebInspector.Setting):
+        * UserInterface/Protocol/InspectorFrontendHostStub.js:
+        (window.InspectorFrontendHost.WebInspector.InspectorFrontendHostStub.prototype.inspectionLevel):
+
+2015-11-23  Brian Burg  <bburg@apple.com>
+
         Web Inspector: use Cmd-Option-L and Cmd-Option-R for toggling navigation and details sidebars
         https://bugs.webkit.org/show_bug.cgi?id=151572
 
index 054d65b..56e9978 100644 (file)
@@ -36,7 +36,10 @@ WebInspector.Setting = class Setting extends WebInspector.Object
         super();
 
         this._name = name;
-        this._localStorageKey = WebInspector.Setting.LocalStorageKeyPrefix + name;
+
+        let inspectionLevel = InspectorFrontendHost.inspectionLevel();
+        let levelString = inspectionLevel > 1 ? "-" + inspectionLevel : "";
+        this._localStorageKey = `com.apple.WebInspector${levelString}.${name}`;
         this._defaultValue = defaultValue;
     }
 
@@ -86,8 +89,6 @@ WebInspector.Setting = class Setting extends WebInspector.Object
     }
 };
 
-WebInspector.Setting.LocalStorageKeyPrefix = "com.apple.WebInspector.";
-
 WebInspector.Setting.Event = {
     Changed: "setting-changed"
 };
index ace6bf1..e39743c 100644 (file)
@@ -110,6 +110,11 @@ if (!window.InspectorFrontendHost) {
             return "web";
         },
 
+        inspectionLevel: function()
+        {
+            return 1;
+        },
+
         inspectedURLChanged: function(title)
         {
             document.title = title;
index a423c3c..f0a8e0b 100644 (file)
@@ -1,3 +1,29 @@
+2015-11-23  Brian Burg  <bburg@apple.com>
+
+        Web Inspector: inspector settings should not be shared between different inspection levels
+        https://bugs.webkit.org/show_bug.cgi?id=151151
+
+        Reviewed by Timothy Hatcher.
+
+        In WebKit2, we already track the inspection level of WebPages in order to give inspectors
+        different page groups. Send the inspection level to WebInspectorUI WebProcess when
+        establishing a connection from the UIProcess. Use this number in the FrontendClient.
+
+        * UIProcess/WebInspectorProxy.cpp:
+        (WebKit::WebInspectorProxy::inspectionLevel): Renamed from inspectorLevel to be consistent.
+        (WebKit::WebInspectorProxy::inspectorPageGroupIdentifier):
+        (WebKit::WebInspectorProxy::didRelaunchInspectorPageProcess):
+        (WebKit::WebInspectorProxy::eagerlyCreateInspectorPage):
+        (WebKit::WebInspectorProxy::createInspectorPage):
+        (WebKit::WebInspectorProxy::inspectorLevel): Deleted.
+        * UIProcess/WebInspectorProxy.h:
+        * UIProcess/mac/WebInspectorProxyMac.mm:
+        (WebKit::WebInspectorProxy::updateInspectorWindowTitle):
+        * WebProcess/WebPage/WebInspectorUI.cpp:
+        (WebKit::WebInspectorUI::establishConnection):
+        * WebProcess/WebPage/WebInspectorUI.h:
+        * WebProcess/WebPage/WebInspectorUI.messages.in:
+
 2015-11-23  Gyuyoung Kim  <gyuyoung.kim@webkit.org>
 
         REGRESSION(r188206): [EFL] Missing to adjust scrollbar size to ewk_view_contents_size_get API test
index 65aaa51..fc6c6f5 100644 (file)
@@ -81,7 +81,7 @@ WebInspectorProxy::~WebInspectorProxy()
 {
 }
 
-unsigned WebInspectorProxy::inspectorLevel() const
+unsigned WebInspectorProxy::inspectionLevel() const
 {
     auto findResult = pageLevelMap().find(inspectedPage());
     if (findResult != pageLevelMap().end())
@@ -92,7 +92,7 @@ unsigned WebInspectorProxy::inspectorLevel() const
 
 String WebInspectorProxy::inspectorPageGroupIdentifier() const
 {
-    return String::format("__WebInspectorPageGroupLevel%u__", inspectorLevel());
+    return String::format("__WebInspectorPageGroupLevel%u__", inspectionLevel());
 }
 
 WebPreferences& WebInspectorProxy::inspectorPagePreferences() const
@@ -186,7 +186,7 @@ void WebInspectorProxy::didRelaunchInspectorPageProcess()
     // When didRelaunchInspectorPageProcess is called we can assume it is during a load request.
     // Any messages we would have sent to a terminated process need to be re-sent.
 
-    m_inspectorPage->process().send(Messages::WebInspectorUI::EstablishConnection(m_connectionIdentifier, m_inspectedPage->pageID(), m_underTest), m_inspectorPage->pageID());
+    m_inspectorPage->process().send(Messages::WebInspectorUI::EstablishConnection(m_connectionIdentifier, m_inspectedPage->pageID(), m_underTest, inspectionLevel()), m_inspectorPage->pageID());
 }
 
 void WebInspectorProxy::showConsole()
@@ -442,7 +442,7 @@ void WebInspectorProxy::eagerlyCreateInspectorPage()
     if (!m_inspectorPage)
         return;
 
-    pageLevelMap().set(m_inspectorPage, inspectorLevel());
+    pageLevelMap().set(m_inspectorPage, inspectionLevel());
 
     WKPagePolicyClientV1 policyClient = {
         { 1, this },
@@ -530,7 +530,7 @@ void WebInspectorProxy::createInspectorPage(IPC::Attachment connectionIdentifier
 
     m_connectionIdentifier = WTF::move(connectionIdentifier);
 
-    m_inspectorPage->process().send(Messages::WebInspectorUI::EstablishConnection(m_connectionIdentifier, m_inspectedPage->pageID(), m_underTest), m_inspectorPage->pageID());
+    m_inspectorPage->process().send(Messages::WebInspectorUI::EstablishConnection(m_connectionIdentifier, m_inspectedPage->pageID(), m_underTest, inspectionLevel()), m_inspectorPage->pageID());
 
     if (!m_underTest) {
         m_canAttach = platformCanAttach(canAttach);
index 5ecfb05..69afb01 100644 (file)
@@ -208,9 +208,10 @@ private:
 
     void open();
 
-    // The inspector level is used to give different preferences to each inspector
-    // level by setting a per-level page group identifier.
-    unsigned inspectorLevel() const;
+    // The inspection level is used to give different preferences to each inspector
+    // by setting a per-level page group identifier. Local storage settings in the frontend
+    // also use the inspection level in the key prefix to disambiguate persistent view state.
+    unsigned inspectionLevel() const;
     String inspectorPageGroupIdentifier() const;
     WebPreferences& inspectorPagePreferences() const;
 
index 6cd5595..8f406b4 100644 (file)
@@ -328,9 +328,9 @@ void WebInspectorProxy::updateInspectorWindowTitle() const
     if (!m_inspectorWindow)
         return;
 
-    unsigned inspectionLevel = inspectorLevel();
-    if (inspectionLevel > 1) {
-        NSString *debugTitle = [NSString stringWithFormat:WEB_UI_STRING("Web Inspector [%d] — %@", "Web Inspector window title when inspecting Web Inspector"), inspectionLevel, (NSString *)m_urlString];
+    unsigned level = inspectionLevel();
+    if (level > 1) {
+        NSString *debugTitle = [NSString stringWithFormat:WEB_UI_STRING("Web Inspector [%d] — %@", "Web Inspector window title when inspecting Web Inspector"), level, (NSString *)m_urlString];
         [m_inspectorWindow setTitle:debugTitle];
     } else {
         NSString *title = [NSString stringWithFormat:WEB_UI_STRING("Web Inspector — %@", "Web Inspector window title"), (NSString *)m_urlString];
index 341838a..23a3666 100644 (file)
@@ -52,7 +52,7 @@ WebInspectorUI::WebInspectorUI(WebPage& page)
 {
 }
 
-void WebInspectorUI::establishConnection(IPC::Attachment encodedConnectionIdentifier, uint64_t inspectedPageIdentifier, bool underTest)
+void WebInspectorUI::establishConnection(IPC::Attachment encodedConnectionIdentifier, uint64_t inspectedPageIdentifier, bool underTest, unsigned inspectionLevel)
 {
 #if USE(UNIX_DOMAIN_SOCKETS)
     IPC::Connection::Identifier connectionIdentifier(encodedConnectionIdentifier.releaseFileDescriptor());
@@ -69,6 +69,7 @@ void WebInspectorUI::establishConnection(IPC::Attachment encodedConnectionIdenti
     m_inspectedPageIdentifier = inspectedPageIdentifier;
     m_frontendAPIDispatcher.reset();
     m_underTest = underTest;
+    m_inspectionLevel = inspectionLevel;
 
     m_frontendController = &m_page.corePage()->inspectorController();
     m_frontendController->setInspectorFrontendClient(this);
index 3a1f68e..a0766ed 100644 (file)
@@ -53,7 +53,7 @@ public:
     virtual IPC::ProcessType remoteProcessType() override { return IPC::ProcessType::Web; }
 
     // Called by WebInspectorUI messages
-    void establishConnection(IPC::Attachment connectionIdentifier, uint64_t inspectedPageIdentifier, bool underTest);
+    void establishConnection(IPC::Attachment connectionIdentifier, uint64_t inspectedPageIdentifier, bool underTest, unsigned inspectionLevel);
 
     void showConsole();
     void showResources();
@@ -104,6 +104,7 @@ public:
     void sendMessageToBackend(const String&) override;
 
     bool isUnderTest() override { return m_underTest; }
+    unsigned inspectionLevel() const override { return m_inspectionLevel; }
 
 private:
     explicit WebInspectorUI(WebPage&);
@@ -120,6 +121,7 @@ private:
     uint64_t m_inspectedPageIdentifier { 0 };
     bool m_underTest { false };
     DockSide m_dockSide { DockSide::Undocked };
+    unsigned m_inspectionLevel { 1 };
 
 #if PLATFORM(COCOA)
     mutable String m_localizedStringsURL;
index 1165917..cc09f9a 100644 (file)
@@ -21,7 +21,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 messages -> WebInspectorUI {
-    EstablishConnection(IPC::Attachment connectionIdentifier, uint64_t inspectedPageIdentifier, bool underTest)
+    EstablishConnection(IPC::Attachment connectionIdentifier, uint64_t inspectedPageIdentifier, bool underTest, unsigned inspectionLevel)
 
     AttachedBottom()
     AttachedRight()