<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[238660] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/238660">238660</a></dd>
<dt>Author</dt> <dd>joepeck@webkit.org</dd>
<dt>Date</dt> <dd>2018-11-28 20:39:45 -0800 (Wed, 28 Nov 2018)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: REGRESSION(?): all "Show *" develop menu items cause the page to crash
https://bugs.webkit.org/show_bug.cgi?id=192016
<rdar://problem/46284417>

Reviewed by Devin Rousso.

Source/WebInspectorUI:

* UserInterface/Base/Main.js:
(WI.loaded):
(WI.initializeBackendTarget):
(WI.contentLoaded):
(WI.whenTargetsAvailable):
Don't evaluate any InspectorFrontendAPI commands until the frontend
has initialized a main target and the user interface.

Source/WebKit:

Previously calling the Page's inspectorController.show()
would create a frontend connection on the WebProcess side.
However now the frontend connection is handed to the WebProcess
once the UIProcess creates it. So queue actions that take place
immediately after showing the inspector until we have a frontend
to send the actions to.

* WebProcess/WebPage/WebInspector.h:
* WebProcess/WebPage/WebInspector.cpp:
(WebKit::WebInspector::setFrontendConnection):
(WebKit::WebInspector::closeFrontendConnection):
(WebKit::WebInspector::whenFrontendConnectionEstablished):
(WebKit::WebInspector::showConsole):
(WebKit::WebInspector::showResources):
(WebKit::WebInspector::showTimelines):
(WebKit::WebInspector::showMainResourceForFrame):
(WebKit::WebInspector::startPageProfiling):
(WebKit::WebInspector::stopPageProfiling):
(WebKit::WebInspector::startElementSelection):
(WebKit::WebInspector::stopElementSelection):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceBaseMainjs">trunk/Source/WebInspectorUI/UserInterface/Base/Main.js</a></li>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitWebProcessWebPageWebInspectorcpp">trunk/Source/WebKit/WebProcess/WebPage/WebInspector.cpp</a></li>
<li><a href="#trunkSourceWebKitWebProcessWebPageWebInspectorh">trunk/Source/WebKit/WebProcess/WebPage/WebInspector.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (238659 => 238660)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog    2018-11-29 04:14:02 UTC (rev 238659)
+++ trunk/Source/WebInspectorUI/ChangeLog       2018-11-29 04:39:45 UTC (rev 238660)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2018-11-28  Joseph Pecoraro  <pecoraro@apple.com>
+
+        Web Inspector: REGRESSION(?): all "Show *" develop menu items cause the page to crash
+        https://bugs.webkit.org/show_bug.cgi?id=192016
+        <rdar://problem/46284417>
+
+        Reviewed by Devin Rousso.
+
+        * UserInterface/Base/Main.js:
+        (WI.loaded):
+        (WI.initializeBackendTarget):
+        (WI.contentLoaded):
+        (WI.whenTargetsAvailable):
+        Don't evaluate any InspectorFrontendAPI commands until the frontend
+        has initialized a main target and the user interface.
+
</ins><span class="cx"> 2018-11-28  Nikita Vasilyev  <nvasilyev@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Styles: enable selection of multiple properties by default
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceBaseMainjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Base/Main.js (238659 => 238660)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Base/Main.js   2018-11-29 04:14:02 UTC (rev 238659)
+++ trunk/Source/WebInspectorUI/UserInterface/Base/Main.js      2018-11-29 04:39:45 UTC (rev 238660)
</span><span class="lines">@@ -157,6 +157,7 @@
</span><span class="cx">     this.modifierKeys = {altKey: false, metaKey: false, shiftKey: false};
</span><span class="cx">     this.visible = false;
</span><span class="cx">     this._windowKeydownListeners = [];
</span><ins>+    this._targetsAvailablePromise = new WI.WrappedPromise;
</ins><span class="cx"> 
</span><span class="cx">     // Targets.
</span><span class="cx">     WI.backendTarget = null;
</span><span class="lines">@@ -181,6 +182,8 @@
</span><span class="cx">     WI.backendTarget = target;
</span><span class="cx"> 
</span><span class="cx">     WI.resetMainExecutionContext();
</span><ins>+
+    this._targetsAvailablePromise.resolve();
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> WI.initializePageTarget = function(target)
</span><span class="lines">@@ -551,7 +554,9 @@
</span><span class="cx">     this.tabBar.addEventListener(WI.TabBar.Event.TabBarItemsReordered, this._rememberOpenTabs, this);
</span><span class="cx"> 
</span><span class="cx">     // Signal that the frontend is now ready to receive messages.
</span><del>-    InspectorFrontendAPI.loadCompleted();
</del><ins>+    WI.whenTargetsAvailable().then(() => {
+        InspectorFrontendAPI.loadCompleted();
+    });
</ins><span class="cx"> 
</span><span class="cx">     // Tell the InspectorFrontendHost we loaded, which causes the window to display
</span><span class="cx">     // and pending InspectorFrontendAPI commands to be sent.
</span><span class="lines">@@ -580,6 +585,11 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+WI.whenTargetsAvailable = function()
+{
+    return this._targetsAvailablePromise.promise;
+};
+
</ins><span class="cx"> WI.isTabTypeAllowed = function(tabType)
</span><span class="cx"> {
</span><span class="cx">     let tabClass = this._knownTabClassesByType.get(tabType);
</span></span></pre></div>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (238659 => 238660)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog    2018-11-29 04:14:02 UTC (rev 238659)
+++ trunk/Source/WebKit/ChangeLog       2018-11-29 04:39:45 UTC (rev 238660)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2018-11-28  Joseph Pecoraro  <pecoraro@apple.com>
+
+        Web Inspector: REGRESSION(?): all "Show *" develop menu items cause the page to crash
+        https://bugs.webkit.org/show_bug.cgi?id=192016
+        <rdar://problem/46284417>
+
+        Reviewed by Devin Rousso.
+
+        Previously calling the Page's inspectorController.show()
+        would create a frontend connection on the WebProcess side.
+        However now the frontend connection is handed to the WebProcess
+        once the UIProcess creates it. So queue actions that take place
+        immediately after showing the inspector until we have a frontend
+        to send the actions to.
+
+        * WebProcess/WebPage/WebInspector.h:
+        * WebProcess/WebPage/WebInspector.cpp:
+        (WebKit::WebInspector::setFrontendConnection):
+        (WebKit::WebInspector::closeFrontendConnection):
+        (WebKit::WebInspector::whenFrontendConnectionEstablished):
+        (WebKit::WebInspector::showConsole):
+        (WebKit::WebInspector::showResources):
+        (WebKit::WebInspector::showTimelines):
+        (WebKit::WebInspector::showMainResourceForFrame):
+        (WebKit::WebInspector::startPageProfiling):
+        (WebKit::WebInspector::stopPageProfiling):
+        (WebKit::WebInspector::startElementSelection):
+        (WebKit::WebInspector::stopElementSelection):
+
</ins><span class="cx"> 2018-11-28  Vivek Seth  <v_seth@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Consult dummy storage for HTTPS Upgrade, Apply If Appropriate
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessWebPageWebInspectorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/WebPage/WebInspector.cpp (238659 => 238660)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/WebPage/WebInspector.cpp  2018-11-29 04:14:02 UTC (rev 238659)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebInspector.cpp     2018-11-29 04:39:45 UTC (rev 238660)
</span><span class="lines">@@ -100,6 +100,10 @@
</span><span class="cx"> 
</span><span class="cx">     m_frontendConnection = IPC::Connection::createClientConnection(connectionIdentifier, *this);
</span><span class="cx">     m_frontendConnection->open();
</span><ins>+
+    for (auto& callback : m_frontendConnectionActions)
+        callback();
+    m_frontendConnectionActions.clear();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebInspector::closeFrontendConnection()
</span><span class="lines">@@ -112,6 +116,8 @@
</span><span class="cx">         m_frontendConnection = nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    m_frontendConnectionActions.clear();
+
</ins><span class="cx">     m_attached = false;
</span><span class="cx">     m_previousCanAttach = false;
</span><span class="cx"> }
</span><span class="lines">@@ -121,6 +127,16 @@
</span><span class="cx">     WebProcess::singleton().parentProcessConnection()->send(Messages::WebInspectorProxy::BringToFront(), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebInspector::whenFrontendConnectionEstablished(Function<void()>&& callback)
+{
+    if (m_frontendConnection) {
+        callback();
+        return;
+    }
+
+    m_frontendConnectionActions.append(WTFMove(callback));
+}
+
</ins><span class="cx"> // Called by WebInspector messages
</span><span class="cx"> void WebInspector::show()
</span><span class="cx"> {
</span><span class="lines">@@ -175,7 +191,10 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_page->corePage()->inspectorController().show();
</span><del>-    m_frontendConnection->send(Messages::WebInspectorUI::ShowConsole(), 0);
</del><ins>+
+    whenFrontendConnectionEstablished([=] {
+        m_frontendConnection->send(Messages::WebInspectorUI::ShowConsole(), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebInspector::showResources()
</span><span class="lines">@@ -184,7 +203,10 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_page->corePage()->inspectorController().show();
</span><del>-    m_frontendConnection->send(Messages::WebInspectorUI::ShowResources(), 0);
</del><ins>+
+    whenFrontendConnectionEstablished([=] {
+        m_frontendConnection->send(Messages::WebInspectorUI::ShowResources(), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebInspector::showTimelines()
</span><span class="lines">@@ -193,7 +215,10 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_page->corePage()->inspectorController().show();
</span><del>-    m_frontendConnection->send(Messages::WebInspectorUI::ShowTimelines(), 0);
</del><ins>+
+    whenFrontendConnectionEstablished([=] {
+        m_frontendConnection->send(Messages::WebInspectorUI::ShowTimelines(), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebInspector::showMainResourceForFrame(uint64_t frameIdentifier)
</span><span class="lines">@@ -208,7 +233,10 @@
</span><span class="cx">     m_page->corePage()->inspectorController().show();
</span><span class="cx"> 
</span><span class="cx">     String inspectorFrameIdentifier = m_page->corePage()->inspectorController().pageAgent()->frameId(frame->coreFrame());
</span><del>-    m_frontendConnection->send(Messages::WebInspectorUI::ShowMainResourceForFrame(inspectorFrameIdentifier), 0);
</del><ins>+
+    whenFrontendConnectionEstablished([=] {
+        m_frontendConnection->send(Messages::WebInspectorUI::ShowMainResourceForFrame(inspectorFrameIdentifier), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebInspector::startPageProfiling()
</span><span class="lines">@@ -216,7 +244,9 @@
</span><span class="cx">     if (!m_page->corePage())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_frontendConnection->send(Messages::WebInspectorUI::StartPageProfiling(), 0);
</del><ins>+    whenFrontendConnectionEstablished([=] {
+        m_frontendConnection->send(Messages::WebInspectorUI::StartPageProfiling(), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebInspector::stopPageProfiling()
</span><span class="lines">@@ -224,7 +254,9 @@
</span><span class="cx">     if (!m_page->corePage())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_frontendConnection->send(Messages::WebInspectorUI::StopPageProfiling(), 0);
</del><ins>+    whenFrontendConnectionEstablished([=] {
+        m_frontendConnection->send(Messages::WebInspectorUI::StopPageProfiling(), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebInspector::startElementSelection()
</span><span class="lines">@@ -232,7 +264,9 @@
</span><span class="cx">     if (!m_page->corePage())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_frontendConnection->send(Messages::WebInspectorUI::StartElementSelection(), 0);
</del><ins>+    whenFrontendConnectionEstablished([=] {
+        m_frontendConnection->send(Messages::WebInspectorUI::StartElementSelection(), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebInspector::stopElementSelection()
</span><span class="lines">@@ -240,7 +274,9 @@
</span><span class="cx">     if (!m_page->corePage())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_frontendConnection->send(Messages::WebInspectorUI::StopElementSelection(), 0);
</del><ins>+    whenFrontendConnectionEstablished([=] {
+        m_frontendConnection->send(Messages::WebInspectorUI::StopElementSelection(), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebInspector::elementSelectionChanged(bool active)
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessWebPageWebInspectorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/WebPage/WebInspector.h (238659 => 238660)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/WebPage/WebInspector.h    2018-11-29 04:14:02 UTC (rev 238659)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebInspector.h       2018-11-29 04:39:45 UTC (rev 238660)
</span><span class="lines">@@ -92,9 +92,12 @@
</span><span class="cx"> 
</span><span class="cx">     void bringToFront();
</span><span class="cx"> 
</span><ins>+    void whenFrontendConnectionEstablished(Function<void()>&&);
+
</ins><span class="cx">     WebPage* m_page;
</span><span class="cx"> 
</span><span class="cx">     RefPtr<IPC::Connection> m_frontendConnection;
</span><ins>+    Vector<Function<void()>> m_frontendConnectionActions;
</ins><span class="cx"> 
</span><span class="cx">     bool m_attached { false };
</span><span class="cx">     bool m_previousCanAttach { false };
</span></span></pre>
</div>
</div>

</body>
</html>