WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
patch.txt (text/plain), 29.04 KB, created by
Nikita Vasilyev
on 2017-03-03 17:16:18 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Nikita Vasilyev
Created:
2017-03-03 17:16:18 PST
Size:
29.04 KB
patch
obsolete
>diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 5907676..a2d1ed8 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,22 @@ >+2017-03-03 Nikita Vasilyev <nvasilyev@apple.com> >+ >+ Web Inspector: Show Web Socket connections in Network tab >+ https://bugs.webkit.org/show_bug.cgi?id=167520 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * http/tests/websocket/tests/hybi/inspector/client-close-expected.txt: Added. >+ * http/tests/websocket/tests/hybi/inspector/client-close.html: Added. >+ * http/tests/websocket/tests/hybi/inspector/client-close_wsh.py: Added. >+ (web_socket_do_extra_handshake): >+ (web_socket_transfer_data): >+ * http/tests/websocket/tests/hybi/inspector/server-close-expected.txt: Added. >+ * http/tests/websocket/tests/hybi/inspector/server-close.html: Added. >+ * http/tests/websocket/tests/hybi/inspector/server-close_wsh.py: Added. >+ (web_socket_do_extra_handshake): >+ (web_socket_transfer_data): >+ * platform/ios-simulator/TestExpectations: >+ > 2017-02-18 Chris Dumez <cdumez@apple.com> > > Recursive MessagePort.postMessage() calls causes tab to become unresponsive >diff --git a/LayoutTests/http/tests/websocket/tests/hybi/inspector/client-close-expected.txt b/LayoutTests/http/tests/websocket/tests/hybi/inspector/client-close-expected.txt >new file mode 100644 >index 0000000..fba686b >--- /dev/null >+++ b/LayoutTests/http/tests/websocket/tests/hybi/inspector/client-close-expected.txt >@@ -0,0 +1,15 @@ >+Tests WebSockets connection closed by the client. >+ >+ >+== Running test suite: WebSocket.ClientClose >+-- Running test case: WebSocket.ClientClose >+PASS: WebSocketResource should be created. >+PASS: WebSocketResource should be a WebSocket type. >+PASS: WebSocketResource should be in a Connecting state. >+PASS: WebSocketResource previous state should be Connecting. >+PASS: WebSocketResource state should change to Open. >+PASS: WebSocketResource should be in a Open state. >+PASS: WebSocketResource previous state should be Open. >+PASS: WebSocketResource state should change to Closed. >+PASS: WebSocketResource should be in a Closed state. >+ >diff --git a/LayoutTests/http/tests/websocket/tests/hybi/inspector/client-close.html b/LayoutTests/http/tests/websocket/tests/hybi/inspector/client-close.html >new file mode 100644 >index 0000000..79cd62f >--- /dev/null >+++ b/LayoutTests/http/tests/websocket/tests/hybi/inspector/client-close.html >@@ -0,0 +1,69 @@ >+<!doctype html> >+<html> >+<head> >+ <meta charset="utf-8"> >+ <script src="../../../../inspector/resources/inspector-test.js"></script> >+</head> >+<body onload="runTest()"> >+<p>Tests WebSockets connection closed by the client.</p> >+<script> >+function createWebSocketConnection() >+{ >+ let webSocket = new WebSocket("ws://127.0.0.1:8880/websocket/tests/hybi/inspector/client-close"); >+ >+ webSocket.onopen = function() >+ { >+ webSocket.send("A message."); >+ }; >+ >+ webSocket.onmessage = function() >+ { >+ webSocket.close(); >+ }; >+} >+ >+function test() >+{ >+ let suite = InspectorTest.createAsyncSuite("WebSocket.ClientClose"); >+ >+ suite.addTestCase({ >+ name: "WebSocket.ClientClose", >+ description: "WebInspector.WebSocketResource.Event.ReadyStateChanged events are fired in order when WebSocket connection is closed by the client.", >+ test(resolve, reject) { >+ WebInspector.Frame.singleFireEventListener(WebInspector.Frame.Event.ResourceWasAdded, function(event) { >+ let resource = event.data.resource; >+ >+ InspectorTest.expectThat(resource instanceof WebInspector.WebSocketResource, "WebSocketResource should be created."); >+ InspectorTest.expectEqual(resource.type, WebInspector.Resource.Type.WebSocket, "WebSocketResource should be a WebSocket type."); >+ InspectorTest.expectEqual(resource.readyState, WebInspector.WebSocketResource.ReadyState.Connecting, "WebSocketResource should be in a Connecting state."); >+ >+ let runCount = 0; >+ >+ // FIXME: Rewrite this using Promises. >+ resource.addEventListener(WebInspector.WebSocketResource.Event.ReadyStateChanged, function(event) { >+ let data = event.data; >+ runCount++; >+ >+ if (runCount === 1) { >+ InspectorTest.expectEqual(data.previousState, WebInspector.WebSocketResource.ReadyState.Connecting, "WebSocketResource previous state should be Connecting."); >+ InspectorTest.expectEqual(data.state, WebInspector.WebSocketResource.ReadyState.Open, "WebSocketResource state should change to Open."); >+ InspectorTest.expectEqual(resource.readyState, WebInspector.WebSocketResource.ReadyState.Open, "WebSocketResource should be in a Open state."); >+ } else if (runCount === 2) { >+ InspectorTest.expectEqual(data.previousState, WebInspector.WebSocketResource.ReadyState.Open, "WebSocketResource previous state should be Open."); >+ InspectorTest.expectEqual(data.state, WebInspector.WebSocketResource.ReadyState.Closed, "WebSocketResource state should change to Closed."); >+ InspectorTest.expectEqual(resource.readyState, WebInspector.WebSocketResource.ReadyState.Closed, "WebSocketResource should be in a Closed state."); >+ resolve("Ran twice."); >+ } else >+ reject("Ran more times than expected."); >+ }); >+ }); >+ >+ InspectorTest.evaluateInPage("createWebSocketConnection()"); >+ } >+ }); >+ >+ suite.runTestCasesAndFinish(); >+} >+</script> >+</body> >+</html> >diff --git a/LayoutTests/http/tests/websocket/tests/hybi/inspector/client-close_wsh.py b/LayoutTests/http/tests/websocket/tests/hybi/inspector/client-close_wsh.py >new file mode 100644 >index 0000000..0cf1ca0 >--- /dev/null >+++ b/LayoutTests/http/tests/websocket/tests/hybi/inspector/client-close_wsh.py >@@ -0,0 +1,11 @@ >+from mod_pywebsocket import msgutil >+ >+ >+def web_socket_do_extra_handshake(request): >+ pass # Always accept. >+ >+ >+def web_socket_transfer_data(request): >+ # Echo message back >+ message = msgutil.receive_message(request) >+ msgutil.send_message(request, message) >diff --git a/LayoutTests/http/tests/websocket/tests/hybi/inspector/server-close-expected.txt b/LayoutTests/http/tests/websocket/tests/hybi/inspector/server-close-expected.txt >new file mode 100644 >index 0000000..1450094 >--- /dev/null >+++ b/LayoutTests/http/tests/websocket/tests/hybi/inspector/server-close-expected.txt >@@ -0,0 +1,15 @@ >+Tests WebSockets connection closed by the server. >+ >+ >+== Running test suite: WebSocket.ServerClose >+-- Running test case: WebSocket.ServerClose >+PASS: WebSocketResource should be created. >+PASS: WebSocketResource should be a WebSocket type. >+PASS: WebSocketResource should be in a Connecting state. >+PASS: WebSocketResource previous state should be Connecting. >+PASS: WebSocketResource state should change to Open. >+PASS: WebSocketResource should be in a Open state. >+PASS: WebSocketResource previous state should be Open. >+PASS: WebSocketResource state should change to Closed. >+PASS: WebSocketResource should be in a Closed state. >+ >diff --git a/LayoutTests/http/tests/websocket/tests/hybi/inspector/server-close.html b/LayoutTests/http/tests/websocket/tests/hybi/inspector/server-close.html >new file mode 100644 >index 0000000..2b9628d >--- /dev/null >+++ b/LayoutTests/http/tests/websocket/tests/hybi/inspector/server-close.html >@@ -0,0 +1,59 @@ >+<!doctype html> >+<html> >+<head> >+ <meta charset="utf-8"> >+ <script src="../../../../inspector/resources/inspector-test.js"></script> >+</head> >+<body onload="runTest()"> >+<p>Tests WebSockets connection closed by the server.</p> >+<script> >+function createWebSocketConnection() >+{ >+ new WebSocket("ws://127.0.0.1:8880/websocket/tests/hybi/inspector/server-close"); >+} >+ >+function test() >+{ >+ let suite = InspectorTest.createAsyncSuite("WebSocket.ServerClose"); >+ >+ suite.addTestCase({ >+ name: "WebSocket.ServerClose", >+ description: "WebInspector.WebSocketResource.Event.ReadyStateChanged events are fired in order when WebSocket connection is closed by the server.", >+ test(resolve, reject) { >+ WebInspector.Frame.singleFireEventListener(WebInspector.Frame.Event.ResourceWasAdded, function(event) { >+ let resource = event.data.resource; >+ >+ InspectorTest.expectThat(resource instanceof WebInspector.WebSocketResource, "WebSocketResource should be created."); >+ InspectorTest.expectEqual(resource.type, WebInspector.Resource.Type.WebSocket, "WebSocketResource should be a WebSocket type."); >+ InspectorTest.expectEqual(resource.readyState, WebInspector.WebSocketResource.ReadyState.Connecting, "WebSocketResource should be in a Connecting state."); >+ >+ let runCount = 0; >+ >+ // FIXME: Rewrite this using Promises. >+ resource.addEventListener(WebInspector.WebSocketResource.Event.ReadyStateChanged, function(event) { >+ let data = event.data; >+ runCount++; >+ >+ if (runCount === 1) { >+ InspectorTest.expectEqual(data.previousState, WebInspector.WebSocketResource.ReadyState.Connecting, "WebSocketResource previous state should be Connecting."); >+ InspectorTest.expectEqual(data.state, WebInspector.WebSocketResource.ReadyState.Open, "WebSocketResource state should change to Open."); >+ InspectorTest.expectEqual(resource.readyState, WebInspector.WebSocketResource.ReadyState.Open, "WebSocketResource should be in a Open state."); >+ } else if (runCount === 2) { >+ InspectorTest.expectEqual(data.previousState, WebInspector.WebSocketResource.ReadyState.Open, "WebSocketResource previous state should be Open."); >+ InspectorTest.expectEqual(data.state, WebInspector.WebSocketResource.ReadyState.Closed, "WebSocketResource state should change to Closed."); >+ InspectorTest.expectEqual(resource.readyState, WebInspector.WebSocketResource.ReadyState.Closed, "WebSocketResource should be in a Closed state."); >+ resolve("Ran twice."); >+ } else >+ reject("Ran more times than expected."); >+ }); >+ }); >+ >+ InspectorTest.evaluateInPage("createWebSocketConnection()"); >+ } >+ }); >+ >+ suite.runTestCasesAndFinish(); >+} >+</script> >+</body> >+</html> >diff --git a/LayoutTests/http/tests/websocket/tests/hybi/inspector/server-close_wsh.py b/LayoutTests/http/tests/websocket/tests/hybi/inspector/server-close_wsh.py >new file mode 100644 >index 0000000..a0698a3 >--- /dev/null >+++ b/LayoutTests/http/tests/websocket/tests/hybi/inspector/server-close_wsh.py >@@ -0,0 +1,7 @@ >+def web_socket_do_extra_handshake(request): >+ pass >+ >+ >+def web_socket_transfer_data(request): >+ # After this handler exits, pywebsocket initiates the closing handshake. >+ pass >diff --git a/LayoutTests/platform/ios-simulator/TestExpectations b/LayoutTests/platform/ios-simulator/TestExpectations >index 1487682..9abe6e4 100644 >--- a/LayoutTests/platform/ios-simulator/TestExpectations >+++ b/LayoutTests/platform/ios-simulator/TestExpectations >@@ -212,6 +212,7 @@ storage/websql/quota-tracking.html > # iOS doesn't have a local inspector > inspector/ [ Skip ] > http/tests/inspector/ [ Skip ] >+http/tests/websocket/tests/hybi/inspector/ [ Skip ] > > # Some CSS3 Text tests are not enabled on iOS > webkit.org/b/76173 fast/css3-text/css3-text-align-last >diff --git a/Source/WebInspectorUI/ChangeLog b/Source/WebInspectorUI/ChangeLog >index 55e6bf6..ea8e3b7 100644 >--- a/Source/WebInspectorUI/ChangeLog >+++ b/Source/WebInspectorUI/ChangeLog >@@ -1,3 +1,64 @@ >+2017-03-03 Nikita Vasilyev <nvasilyev@apple.com> >+ >+ Web Inspector: Show Web Socket connections in Network tab >+ https://bugs.webkit.org/show_bug.cgi?id=167520 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Show Web Socket connections in Network and Resources tabs. Display HTTP headers >+ of Web Socket handshake request in the details sidebar. >+ >+ * UserInterface/Controllers/FrameResourceManager.js: >+ (WebInspector.FrameResourceManager.prototype.initialize): >+ (WebInspector.FrameResourceManager.prototype.webSocketCreated): >+ (WebInspector.FrameResourceManager.prototype.webSocketWillSendHandshakeRequest): >+ webSocketWillSendHandshakeRequest doesn't receive a request URL as one of its parameters. >+ Store URLs received from webSocketCreated method in _webSocketIdentifierToURL map. >+ >+ (WebInspector.FrameResourceManager.prototype.webSocketHandshakeResponseReceived): >+ (WebInspector.FrameResourceManager.prototype.webSocketFrameReceived): >+ (WebInspector.FrameResourceManager.prototype.webSocketFrameSent): >+ (WebInspector.FrameResourceManager.prototype.webSocketClosed): >+ Mark resource as finished when Web Socket handshake is complete or Web Socket is closed. >+ This may change in the future. >+ >+ (WebInspector.FrameResourceManager.prototype._webSocketFrameReceivedOrSent): >+ * UserInterface/Main.html: >+ >+ * UserInterface/Models/WebSocketResource.js: Added. >+ (WebInspector.WebSocketResource): >+ (WebInspector.WebSocketResource.prototype.set readyState): >+ (WebInspector.WebSocketResource.prototype.get readyState): >+ (WebInspector.WebSocketResource.prototype.get frames): >+ (WebInspector.WebSocketResource.prototype.addFrame): >+ Introduce WebSocketResource model to store WebSocket frames (incoming and outgoing messages) >+ and readyState. >+ >+ * UserInterface/Protocol/NetworkObserver.js: >+ (WebInspector.NetworkObserver.prototype.webSocketCreated): >+ (WebInspector.NetworkObserver.prototype.webSocketWillSendHandshakeRequest): >+ (WebInspector.NetworkObserver.prototype.webSocketHandshakeResponseReceived): >+ (WebInspector.NetworkObserver.prototype.webSocketClosed): >+ (WebInspector.NetworkObserver.prototype.webSocketFrameReceived): >+ (WebInspector.NetworkObserver.prototype.webSocketFrameError): >+ (WebInspector.NetworkObserver.prototype.webSocketFrameSent): >+ (WebInspector.NetworkObserver): >+ Add corresponding methods for the newly added FrameResourceManager methods. >+ >+ * UserInterface/Test.html: >+ * UserInterface/Views/NetworkSidebarPanel.js: >+ (WebInspector.NetworkSidebarPanel.prototype.treeElementAddedOrChanged): >+ Don't show the go to arrow for WebSocket items since WebSocketContentView isn't implemented >+ yet. >+ >+ * UserInterface/Views/ResourceClusterContentView.js: >+ (WebInspector.ResourceClusterContentView.prototype.get responseContentView): >+ Don't show any content views for WebSocket items. >+ >+ * UserInterface/Views/ResourceTreeElement.js: >+ (WebInspector.ResourceTreeElement.prototype.ondblclick): >+ Don't open WebSocket URL in a new browser tab. >+ > 2017-02-17 Nikita Vasilyev <nvasilyev@apple.com> > > Web Inspector: Use Maps in FrameResourceManager instead of objects >diff --git a/Source/WebInspectorUI/UserInterface/Controllers/FrameResourceManager.js b/Source/WebInspectorUI/UserInterface/Controllers/FrameResourceManager.js >index 2fa0c93..fed480f 100644 >--- a/Source/WebInspectorUI/UserInterface/Controllers/FrameResourceManager.js >+++ b/Source/WebInspectorUI/UserInterface/Controllers/FrameResourceManager.js >@@ -49,6 +49,7 @@ WebInspector.FrameResourceManager = class FrameResourceManager extends WebInspec > this._mainFrame = null; > this._resourceRequestIdentifierMap = new Map; > this._orphanedResources = new Map; >+ this._webSocketIdentifierToURL = new Map; > > if (this._mainFrame !== oldMainFrame) > this._mainFrameDidChange(oldMainFrame); >@@ -200,6 +201,93 @@ WebInspector.FrameResourceManager = class FrameResourceManager extends WebInspec > this._resourceRequestIdentifierMap.set(requestIdentifier, resource); > } > >+ webSocketCreated(requestId, url) >+ { >+ this._webSocketIdentifierToURL.set(requestId, url); >+ } >+ >+ webSocketWillSendHandshakeRequest(requestId, timestamp, request) >+ { >+ let url = this._webSocketIdentifierToURL.get(requestId); >+ console.assert(url); >+ if (!url) >+ return; >+ >+ // FIXME: <https://webkit.org/b/168475> Web Inspector: Correctly display iframe's and worker's WebSockets >+ let frameIdentifier = WebInspector.frameResourceManager.mainFrame.id; >+ let loaderIdentifier = WebInspector.frameResourceManager.mainFrame.id; >+ >+ let frame = this.frameForIdentifier(frameIdentifier); >+ let targetId; >+ let requestData = null; >+ let elapsedTime = WebInspector.timelineManager.computeElapsedTime(timestamp); >+ let initiatorSourceCodeLocation = null; >+ >+ let resource = new WebInspector.WebSocketResource(url, loaderIdentifier, targetId, requestId, request.headers, requestData, elapsedTime, initiatorSourceCodeLocation); >+ frame.addResource(resource); >+ >+ this._resourceRequestIdentifierMap.set(requestId, resource); >+ } >+ >+ webSocketHandshakeResponseReceived(requestId, timestamp, response) >+ { >+ let resource = this._resourceRequestIdentifierMap.get(requestId); >+ console.assert(resource); >+ if (!resource) >+ return; >+ >+ resource.readyState = WebInspector.WebSocketResource.ReadyState.Open; >+ >+ let elapsedTime = WebInspector.timelineManager.computeElapsedTime(timestamp); >+ resource.markAsFinished(elapsedTime); >+ >+ // FIXME: Unimplemented for Web Sockets. >+ let responseTiming = response.timing || null; >+ resource.updateForResponse(resource.url, resource.mimeType, resource.type, response.headers, response.status, response.statusText, elapsedTime, responseTiming); >+ } >+ >+ webSocketFrameReceived(requestId, timestamp, response) >+ { >+ this._webSocketFrameReceivedOrSent(requestId, timestamp, response); >+ } >+ >+ webSocketFrameSent(requestId, timestamp, response) >+ { >+ this._webSocketFrameReceivedOrSent(requestId, timestamp, response); >+ } >+ >+ webSocketClosed(requestId, timestamp) >+ { >+ let resource = this._resourceRequestIdentifierMap.get(requestId); >+ console.assert(resource); >+ if (!resource) >+ return; >+ >+ resource.readyState = WebInspector.WebSocketResource.ReadyState.Closed; >+ >+ let elapsedTime = WebInspector.timelineManager.computeElapsedTime(timestamp); >+ resource.markAsFinished(elapsedTime); >+ >+ this._webSocketIdentifierToURL.delete(requestId); >+ this._resourceRequestIdentifierMap.delete(requestId); >+ } >+ >+ _webSocketFrameReceivedOrSent(requestId, timestamp, response) >+ { >+ let resource = this._resourceRequestIdentifierMap.get(requestId); >+ console.assert(resource); >+ if (!resource) >+ return; >+ >+ let isIncoming = !!response.mask; >+ let data = response.payloadData; >+ let opcode = response.opcode; >+ >+ let elapsedTime = WebInspector.timelineManager.computeElapsedTime(timestamp); >+ >+ resource.addFrame(data, isIncoming, opcode, timestamp, elapsedTime); >+ } >+ > markResourceRequestAsServedFromMemoryCache(requestIdentifier) > { > // Called from WebInspector.NetworkObserver. >diff --git a/Source/WebInspectorUI/UserInterface/Main.html b/Source/WebInspectorUI/UserInterface/Main.html >index 364c27a..cdac162 100644 >--- a/Source/WebInspectorUI/UserInterface/Main.html >+++ b/Source/WebInspectorUI/UserInterface/Main.html >@@ -397,6 +397,7 @@ > <script src="Models/TimelineRecording.js"></script> > <script src="Models/TypeDescription.js"></script> > <script src="Models/TypeSet.js"></script> >+ <script src="Models/WebSocketResource.js"></script> > <script src="Models/WrappedPromise.js"></script> > > <script src="Proxies/FormatterWorkerProxy.js"></script> >diff --git a/Source/WebInspectorUI/UserInterface/Models/WebSocketResource.js b/Source/WebInspectorUI/UserInterface/Models/WebSocketResource.js >new file mode 100644 >index 0000000..c345900 >--- /dev/null >+++ b/Source/WebInspectorUI/UserInterface/Models/WebSocketResource.js >@@ -0,0 +1,77 @@ >+/* >+ * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 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. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+WebInspector.WebSocketResource = class WebSocketResource extends WebInspector.Resource >+{ >+ constructor(url, loaderIdentifier, targetId, requestIdentifier, requestHeaders, requestData, requestSentTimestamp, initiatorSourceCodeLocation) >+ { >+ const type = WebInspector.Resource.Type.WebSocket; >+ const mimeType = null; >+ const requestMethod = "GET"; >+ super(url, mimeType, type, loaderIdentifier, targetId, requestIdentifier, requestMethod, requestHeaders, requestData, requestSentTimestamp, initiatorSourceCodeLocation); >+ >+ this._readyState = WebInspector.WebSocketResource.ReadyState.Connecting; >+ this._frames = []; >+ } >+ >+ // Public >+ >+ get frames() { return this._frames; } >+ >+ get readyState() >+ { >+ return this._readyState; >+ } >+ >+ set readyState(state) >+ { >+ if (state === this._readyState) >+ return; >+ >+ let previousState = this._readyState; >+ this._readyState = state; >+ >+ this.dispatchEventToListeners(WebInspector.WebSocketResource.Event.ReadyStateChanged, {previousState, state}); >+ } >+ >+ addFrame(data, isIncoming, opcode, timestamp, elapsedTime) >+ { >+ let frame = {data, isIncoming, opcode, timestamp, elapsedTime}; >+ this._frames.push(frame); >+ >+ this.dispatchEventToListeners(WebInspector.WebSocketResource.Event.FrameAdded, frame); >+ } >+}; >+ >+WebInspector.WebSocketResource.Event = { >+ FrameAdded: Symbol("web-socket-frame-added"), >+ ReadyStateChanged: Symbol("web-socket-resource-ready-state-changed"), >+}; >+ >+WebInspector.WebSocketResource.ReadyState = { >+ Closed: Symbol("web-socket-ready-state-closed"), >+ Connecting: Symbol("web-socket-ready-state-connecting"), >+ Open: Symbol("web-socket-ready-state-open"), >+}; >diff --git a/Source/WebInspectorUI/UserInterface/Protocol/NetworkObserver.js b/Source/WebInspectorUI/UserInterface/Protocol/NetworkObserver.js >index 70f2346..f2e4c0d 100644 >--- a/Source/WebInspectorUI/UserInterface/Protocol/NetworkObserver.js >+++ b/Source/WebInspectorUI/UserInterface/Protocol/NetworkObserver.js >@@ -62,29 +62,29 @@ WebInspector.NetworkObserver = class NetworkObserver > WebInspector.frameResourceManager.resourceRequestWasServedFromMemoryCache(requestId, frameId, loaderId, resource, timestamp, initiator); > } > >- webSocketWillSendHandshakeRequest(requestId, timestamp, request) >+ webSocketCreated(requestId, url) > { >- // FIXME: Not implemented. >+ WebInspector.frameResourceManager.webSocketCreated(requestId, url); > } > >- webSocketHandshakeResponseReceived(requestId, timestamp, response) >+ webSocketWillSendHandshakeRequest(requestId, timestamp, request) > { >- // FIXME: Not implemented. >+ WebInspector.frameResourceManager.webSocketWillSendHandshakeRequest(requestId, timestamp, request); > } > >- webSocketCreated(requestId, url) >+ webSocketHandshakeResponseReceived(requestId, timestamp, response) > { >- // FIXME: Not implemented. >+ WebInspector.frameResourceManager.webSocketHandshakeResponseReceived(requestId, timestamp, response); > } > > webSocketClosed(requestId, timestamp) > { >- // FIXME: Not implemented. >+ WebInspector.frameResourceManager.webSocketClosed(requestId, timestamp); > } > > webSocketFrameReceived(requestId, timestamp, response) > { >- // FIXME: Not implemented. >+ WebInspector.frameResourceManager.webSocketFrameReceived(requestId, timestamp, response); > } > > webSocketFrameError(requestId, timestamp, errorMessage) >@@ -94,6 +94,6 @@ WebInspector.NetworkObserver = class NetworkObserver > > webSocketFrameSent(requestId, timestamp, response) > { >- // FIXME: Not implemented. >+ WebInspector.frameResourceManager.webSocketFrameSent(requestId, timestamp, response); > } > }; >diff --git a/Source/WebInspectorUI/UserInterface/Test.html b/Source/WebInspectorUI/UserInterface/Test.html >index d9e41b6..afa60ce 100644 >--- a/Source/WebInspectorUI/UserInterface/Test.html >+++ b/Source/WebInspectorUI/UserInterface/Test.html >@@ -171,6 +171,7 @@ > <script src="Models/TextRange.js"></script> > <script src="Models/TimelineMarker.js"></script> > <script src="Models/TimelineRecording.js"></script> >+ <script src="Models/WebSocketResource.js"></script> > <script src="Models/WrappedPromise.js"></script> > > <script src="Proxies/FormatterWorkerProxy.js"></script> >diff --git a/Source/WebInspectorUI/UserInterface/Views/NetworkSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/NetworkSidebarPanel.js >index b2f0581..39abc3b 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/NetworkSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/NetworkSidebarPanel.js >@@ -163,10 +163,13 @@ WebInspector.NetworkSidebarPanel = class NetworkSidebarPanel extends WebInspecto > closeButton.addEventListener(WebInspector.TreeElementStatusButton.Event.Clicked, this._treeElementCloseButtonClicked, this); > fragment.appendChild(closeButton.element); > >- var goToButton = new WebInspector.TreeElementStatusButton(WebInspector.createGoToArrowButton()); >- goToButton[WebInspector.NetworkSidebarPanel.TreeElementSymbol] = treeElement; >- goToButton.addEventListener(WebInspector.TreeElementStatusButton.Event.Clicked, this._treeElementGoToArrowWasClicked, this); >- fragment.appendChild(goToButton.element); >+ // FIXME: <webkit.org/b/169011> Web Inspector: Show individual messages in the content pane for a WebSocket >+ if (treeElement.resource.type !== WebInspector.Resource.Type.WebSocket) { >+ let goToButton = new WebInspector.TreeElementStatusButton(WebInspector.createGoToArrowButton()); >+ goToButton[WebInspector.NetworkSidebarPanel.TreeElementSymbol] = treeElement; >+ goToButton.addEventListener(WebInspector.TreeElementStatusButton.Event.Clicked, this._treeElementGoToArrowWasClicked, this); >+ fragment.appendChild(goToButton.element); >+ } > > treeElement.status = fragment; > } >diff --git a/Source/WebInspectorUI/UserInterface/Views/ResourceClusterContentView.js b/Source/WebInspectorUI/UserInterface/Views/ResourceClusterContentView.js >index 3f084df..0f12833 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ResourceClusterContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ResourceClusterContentView.js >@@ -83,6 +83,10 @@ WebInspector.ResourceClusterContentView = class ResourceClusterContentView exten > this._responseContentView = new WebInspector.FontResourceContentView(this._resource); > break; > >+ case WebInspector.Resource.Type.WebSocket: >+ // FIXME: <webkit.org/b/169011> Web Inspector: Show individual messages in the content pane for a WebSocket >+ break; >+ > default: > this._responseContentView = new WebInspector.GenericResourceContentView(this._resource); > break; >diff --git a/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js b/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js >index a073471..54e1742 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js >@@ -91,6 +91,9 @@ WebInspector.ResourceTreeElement = class ResourceTreeElement extends WebInspecto > > ondblclick() > { >+ if (this._resource.type === WebInspector.Resource.Type.WebSocket) >+ return; >+ > InspectorFrontendHost.openInNewTab(this._resource.url); > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
joepeck
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 167520
:
301652
|
301724
|
301851
|
301852
|
302065
|
303030
|
303035
|
303177
|
303366
|
303371
|
303374
|
303391