Changeset 64104 in webkit
- Timestamp:
- Jul 26, 2010 9:51:38 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r64103 r64104 1 2010-07-26 Yuta Kitamura <yutak@chromium.org> 2 3 Reviewed by Pavel Feldman. 4 5 Add WebSocket resource type to Web Inspector. 6 7 When a new WebSocket connection is established, a line for that connection 8 will appear in Web Inspector's Resources tab. If the resource name is 9 clicked, the details of handshake request and response will be shown. 10 11 Web Inspector: WebSocket in Resources tab 12 https://bugs.webkit.org/show_bug.cgi?id=40768 13 14 * inspector/InspectorController.cpp: 15 (WebCore::InspectorController::addResource): WebSocket resource does not 16 have an associated loader, thus frame might be null. Need to check it. 17 (WebCore::InspectorController::removeResource): Ditto. 18 (WebCore::InspectorController::didCreateWebSocket): 19 (WebCore::InspectorController::willSendWebSocketHandshakeRequest): 20 (WebCore::InspectorController::didReceiveWebSocketHandshakeResponse): 21 (WebCore::InspectorController::didCloseWebSocket): 22 * inspector/InspectorController.h: 23 * inspector/InspectorResource.cpp: Add null checks of m_loader and m_frame, 24 because WebSocket does not have a loader and we need to allow null for 25 these variables. 26 (WebCore::createReadableStringFromBinary): 27 (WebCore::InspectorResource::InspectorResource): 28 (WebCore::InspectorResource::create): Factory function of 29 regular (non-WebSocket) resources. 30 (WebCore::InspectorResource::createWebSocket): Factory function of 31 WebSocket resources. 32 (WebCore::InspectorResource::updateWebSocketRequest): 33 (WebCore::InspectorResource::updateWebSocketResponse): 34 (WebCore::InspectorResource::updateScriptObject): m_frame->document() becomes 35 available when Frame::setDocument() is called. We cannot obtain documentURL 36 during the constructor or updateRequest() function, because m_frame->document() 37 is not available yet at that point and documentURL will contain a wrong URL. 38 As far as I know, updateScriptObject() is the only place where we can safely 39 obtain documentURL. 40 (WebCore::InspectorResource::cachedResource): 41 (WebCore::InspectorResource::type): 42 (WebCore::InspectorResource::resourceData): 43 * inspector/InspectorResource.h: 44 (WebCore::InspectorResource::): 45 (WebCore::InspectorResource::markWebSocket): 46 * inspector/front-end/Resource.js: 47 (WebInspector.Resource.Type.toString): 48 (WebInspector.Resource.prototype.set type): 49 (WebInspector.Resource.prototype._mimeTypeIsConsistentWithType): 50 * inspector/front-end/ResourceView.js: 51 (WebInspector.ResourceView.prototype._refreshRequestHeaders): 52 (WebInspector.ResourceView.prototype._refreshResponseHeaders): 53 (WebInspector.ResourceView.prototype._refreshHeaders): 54 * inspector/front-end/inspector.css: 55 (.resources-category-websockets, .resources-category-other): 56 (.resources-category-websockets .resources-graph-bar): 57 (.resources-category-websockets.resource-cached .resources-graph-bar): 58 * inspector/front-end/inspector.js: 59 (WebInspector.loaded): 60 (WebInspector.updateResource): 61 * websockets/WebSocketChannel.cpp: 62 (WebCore::WebSocketChannel::WebSocketChannel): 63 (WebCore::WebSocketChannel::disconnect): 64 (WebCore::WebSocketChannel::didOpen): 65 (WebCore::WebSocketChannel::didClose): 66 (WebCore::WebSocketChannel::processBuffer): 67 (WebCore::WebSocketChannel::identifier): 68 * websockets/WebSocketChannel.h: 69 1 70 2010-07-26 Cosmin Truta <ctruta@chromium.org> 2 71 -
trunk/WebCore/inspector/InspectorController.cpp
r63965 r64104 827 827 828 828 Frame* frame = resource->frame(); 829 if (!frame) 830 return; 829 831 ResourcesMap* resourceMap = m_frameResources.get(frame); 830 832 if (resourceMap) … … 845 847 846 848 Frame* frame = resource->frame(); 849 if (!frame) 850 return; 847 851 ResourcesMap* resourceMap = m_frameResources.get(frame); 848 852 if (!resourceMap) { … … 1487 1491 } 1488 1492 #endif 1493 1494 #if ENABLE(WEB_SOCKETS) 1495 void InspectorController::didCreateWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL) 1496 { 1497 if (!enabled()) 1498 return; 1499 ASSERT(m_inspectedPage); 1500 1501 RefPtr<InspectorResource> resource = InspectorResource::createWebSocket(identifier, requestURL, documentURL); 1502 addResource(resource.get()); 1503 1504 if (m_frontend) 1505 resource->updateScriptObject(m_frontend.get()); 1506 } 1507 1508 void InspectorController::willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest& request) 1509 { 1510 RefPtr<InspectorResource> resource = getTrackedResource(identifier); 1511 if (!resource) 1512 return; 1513 resource->startTiming(); 1514 resource->updateWebSocketRequest(request); 1515 if (m_frontend) 1516 resource->updateScriptObject(m_frontend.get()); 1517 } 1518 1519 void InspectorController::didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse& response) 1520 { 1521 RefPtr<InspectorResource> resource = getTrackedResource(identifier); 1522 if (!resource) 1523 return; 1524 // Calling resource->markResponseReceivedTime() here makes resources bar chart confusing, because 1525 // we cannot apply the "latency + download" model of regular resources to WebSocket connections. 1526 // FIXME: Design a new UI for bar charts of WebSocket resources, and record timing here. 1527 resource->updateWebSocketResponse(response); 1528 if (m_frontend) 1529 resource->updateScriptObject(m_frontend.get()); 1530 } 1531 1532 void InspectorController::didCloseWebSocket(unsigned long identifier) 1533 { 1534 RefPtr<InspectorResource> resource = getTrackedResource(identifier); 1535 if (!resource) 1536 return; 1537 1538 resource->endTiming(); 1539 if (m_frontend) 1540 resource->updateScriptObject(m_frontend.get()); 1541 } 1542 #endif // ENABLE(WEB_SOCKETS) 1489 1543 1490 1544 #if ENABLE(JAVASCRIPT_DEBUGGER) -
trunk/WebCore/inspector/InspectorController.h
r63952 r64104 93 93 #endif 94 94 95 #if ENABLE(WEB_SOCKETS) 96 class WebSocketHandshakeRequest; 97 class WebSocketHandshakeResponse; 98 #endif 99 95 100 class InspectorController 96 101 #if ENABLE(JAVASCRIPT_DEBUGGER) … … 224 229 void removeDOMStorageItem(long callId, long storageId, const String& key); 225 230 #endif 231 #if ENABLE(WEB_SOCKETS) 232 void didCreateWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL); 233 void willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest&); 234 void didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse&); 235 void didCloseWebSocket(unsigned long identifier); 236 #endif 226 237 227 238 const ResourcesMap& resources() const { return m_resources; } -
trunk/WebCore/inspector/InspectorResource.cpp
r63554 r64104 43 43 #include "ResourceRequest.h" 44 44 #include "ResourceResponse.h" 45 #include "StringBuffer.h" 45 46 #include "TextEncoding.h" 46 47 #include "ScriptObject.h" 48 #include "WebSocketHandshakeRequest.h" 49 #include "WebSocketHandshakeResponse.h" 50 51 #include <wtf/Assertions.h> 47 52 48 53 namespace WebCore { 54 55 // Create human-readable binary representation, like "01:23:45:67:89:AB:CD:EF". 56 static String createReadableStringFromBinary(const unsigned char* value, size_t length) 57 { 58 ASSERT(length > 0); 59 static const char hexDigits[17] = "0123456789ABCDEF"; 60 size_t bufferSize = length * 3 - 1; 61 StringBuffer buffer(bufferSize); 62 size_t index = 0; 63 for (size_t i = 0; i < length; ++i) { 64 if (i > 0) 65 buffer[index++] = ':'; 66 buffer[index++] = hexDigits[value[i] >> 4]; 67 buffer[index++] = hexDigits[value[i] & 0xF]; 68 } 69 ASSERT(index == bufferSize); 70 return String::adopt(buffer); 71 } 49 72 50 73 InspectorResource::InspectorResource(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL) 51 74 : m_identifier(identifier) 52 75 , m_loader(loader) 53 , m_frame(loader ->frame())76 , m_frame(loader ? loader->frame() : 0) 54 77 , m_requestURL(requestURL) 55 78 , m_expectedContentLength(0) … … 67 90 , m_connectionReused(false) 68 91 , m_isMainResource(false) 92 #if ENABLE(WEB_SOCKETS) 93 , m_isWebSocket(false) 94 #endif 69 95 { 70 96 } … … 89 115 } 90 116 117 PassRefPtr<InspectorResource> InspectorResource::create(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL) 118 { 119 ASSERT(loader); 120 return adoptRef(new InspectorResource(identifier, loader, requestURL)); 121 } 122 91 123 PassRefPtr<InspectorResource> InspectorResource::createCached(unsigned long identifier, DocumentLoader* loader, const CachedResource* cachedResource) 92 124 { … … 107 139 return resource; 108 140 } 141 142 #if ENABLE(WEB_SOCKETS) 143 PassRefPtr<InspectorResource> InspectorResource::createWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL) 144 { 145 RefPtr<InspectorResource> resource = adoptRef(new InspectorResource(identifier, 0, requestURL)); 146 resource->markWebSocket(); 147 resource->m_documentURL = documentURL; 148 return resource.release(); 149 } 150 #endif 109 151 110 152 void InspectorResource::updateRequest(const ResourceRequest& request) … … 147 189 } 148 190 191 #if ENABLE(WEB_SOCKETS) 192 void InspectorResource::updateWebSocketRequest(const WebSocketHandshakeRequest& request) 193 { 194 m_requestHeaderFields = request.headerFields(); 195 m_requestMethod = "GET"; // Currently we always use "GET" to request handshake. 196 m_webSocketRequestKey3.set(new WebSocketHandshakeRequest::Key3(request.key3())); 197 m_changes.set(RequestChange); 198 m_changes.set(TypeChange); 199 } 200 201 void InspectorResource::updateWebSocketResponse(const WebSocketHandshakeResponse& response) 202 { 203 m_responseStatusCode = response.statusCode(); 204 m_responseStatusText = response.statusText(); 205 m_responseHeaderFields = response.headerFields(); 206 m_webSocketChallengeResponse.set(new WebSocketHandshakeResponse::ChallengeResponse(response.challengeResponse())); 207 m_changes.set(ResponseChange); 208 m_changes.set(TypeChange); 209 } 210 #endif // ENABLE(WEB_SOCKETS) 211 149 212 static void populateHeadersObject(ScriptObject* object, const HTTPHeaderMap& headers) 150 213 { … … 162 225 ScriptObject jsonObject = frontend->newScriptObject(); 163 226 if (m_changes.hasChange(RequestChange)) { 227 if (m_frame) 228 m_documentURL = m_frame->document()->url(); 229 164 230 jsonObject.set("url", m_requestURL.string()); 165 jsonObject.set("documentURL", m_ frame->document()->url().string());231 jsonObject.set("documentURL", m_documentURL.string()); 166 232 jsonObject.set("host", m_requestURL.host()); 167 233 jsonObject.set("path", m_requestURL.path()); … … 174 240 jsonObject.set("requestFormData", m_requestFormData); 175 241 jsonObject.set("didRequestChange", true); 242 #if ENABLE(WEB_SOCKETS) 243 if (m_webSocketRequestKey3) 244 jsonObject.set("webSocketRequestKey3", createReadableStringFromBinary(m_webSocketRequestKey3->value, sizeof(m_webSocketRequestKey3->value))); 245 #endif 176 246 } 177 247 … … 190 260 if (m_loadTiming && !m_cached) 191 261 jsonObject.set("timing", buildObjectForTiming(frontend, m_loadTiming.get())); 262 #if ENABLE(WEB_SOCKETS) 263 if (m_webSocketChallengeResponse) 264 jsonObject.set("webSocketChallengeResponse", createReadableStringFromBinary(m_webSocketChallengeResponse->value, sizeof(m_webSocketChallengeResponse->value))); 265 #endif 192 266 jsonObject.set("didResponseChange", true); 193 267 } … … 248 322 // but Inspector will already try to fetch data that is only available via CachedResource (and it won't update once the resource is added, 249 323 // because m_changes will not have the appropriate bits set). 324 if (!m_frame) 325 return 0; 250 326 const String& url = m_requestURL.string(); 251 327 CachedResource* cachedResource = m_frame->document()->docLoader()->cachedResource(url); … … 284 360 return m_overrideContentType; 285 361 362 #if ENABLE(WEB_SOCKETS) 363 if (m_isWebSocket) 364 return WebSocket; 365 #endif 366 367 ASSERT(m_loader); 286 368 if (m_requestURL == m_loader->requestURL()) { 287 369 InspectorResource::Type resourceType = cachedResourceType(); … … 323 405 PassRefPtr<SharedBuffer> InspectorResource::resourceData(String* textEncodingName) const 324 406 { 325 if (m_ requestURL == m_loader->requestURL()) {407 if (m_loader && m_requestURL == m_loader->requestURL()) { 326 408 *textEncodingName = m_frame->document()->inputEncoding(); 327 409 return m_loader->mainResourceData(); -
trunk/WebCore/inspector/InspectorResource.h
r63425 r64104 37 37 #include "ScriptState.h" 38 38 #include "ScriptString.h" 39 #include "WebSocketHandshakeRequest.h" 40 #include "WebSocketHandshakeResponse.h" 39 41 40 42 #include <wtf/CurrentTime.h> … … 53 55 class ResourceRequest; 54 56 class ResourceResponse; 57 58 #if ENABLE(WEB_SOCKETS) 59 class WebSocketHandshakeRequest; 60 class WebSocketHandshakeResponse; 61 #endif 55 62 56 63 class InspectorResource : public RefCounted<InspectorResource> { … … 66 73 XHR, 67 74 Media, 75 WebSocket, 68 76 Other 69 77 }; 70 78 71 static PassRefPtr<InspectorResource> create(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL) 72 { 73 return adoptRef(new InspectorResource(identifier, loader, requestURL)); 74 } 79 static PassRefPtr<InspectorResource> create(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL); 75 80 76 81 static PassRefPtr<InspectorResource> createCached(unsigned long identifier, DocumentLoader*, const CachedResource*); 82 83 #if ENABLE(WEB_SOCKETS) 84 // WebSocket resource doesn't have its loader. For WebSocket resources, m_loader and m_frame will become null. 85 static PassRefPtr<InspectorResource> createWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL); 86 #endif 77 87 78 88 ~InspectorResource(); … … 84 94 void updateRequest(const ResourceRequest&); 85 95 void updateResponse(const ResourceResponse&); 96 97 #if ENABLE(WEB_SOCKETS) 98 void updateWebSocketRequest(const WebSocketHandshakeRequest&); 99 void updateWebSocketResponse(const WebSocketHandshakeResponse&); 100 #endif 86 101 87 102 void setOverrideContent(const ScriptString& data, Type); … … 154 169 ScriptObject buildObjectForTiming(InspectorFrontend*, ResourceLoadTiming*); 155 170 171 #if ENABLE(WEB_SOCKETS) 172 void markWebSocket() { m_isWebSocket = true; } 173 #endif 174 156 175 unsigned long m_identifier; 157 176 RefPtr<DocumentLoader> m_loader; 158 177 RefPtr<Frame> m_frame; 159 178 KURL m_requestURL; 179 KURL m_documentURL; 160 180 HTTPHeaderMap m_requestHeaderFields; 161 181 HTTPHeaderMap m_responseHeaderFields; … … 184 204 String m_requestFormData; 185 205 Vector<RefPtr<InspectorResource> > m_redirects; 206 207 #if ENABLE(WEB_SOCKETS) 208 bool m_isWebSocket; 209 210 // The following fields are not used for resources other than WebSocket. 211 // We allocate them dynamically to reduce memory consumption for regular resources. 212 OwnPtr<WebSocketHandshakeRequest::Key3> m_webSocketRequestKey3; 213 OwnPtr<WebSocketHandshakeResponse::ChallengeResponse> m_webSocketChallengeResponse; 214 #endif 186 215 }; 187 216 -
trunk/WebCore/inspector/front-end/Resource.js
r63427 r64104 46 46 XHR: 5, 47 47 Media: 6, 48 Other: 7, 48 WebSocket: 7, 49 Other: 8, 49 50 50 51 isTextType: function(type) … … 68 69 case this.XHR: 69 70 return WebInspector.UIString("XHR"); 71 case this.WebSocket: 72 return WebInspector.UIString("WebSocket"); 70 73 case this.Other: 71 74 default: … … 364 367 this.category = WebInspector.resourceCategories.xhr; 365 368 break; 369 case WebInspector.Resource.Type.WebSocket: 370 this.category = WebInspector.resourceCategories.websocket; 371 break; 366 372 case WebInspector.Resource.Type.Other: 367 373 default: … … 576 582 if (typeof this.type === "undefined" 577 583 || this.type === WebInspector.Resource.Type.Other 578 || this.type === WebInspector.Resource.Type.XHR) 584 || this.type === WebInspector.Resource.Type.XHR 585 || this.type === WebInspector.Resource.Type.WebSocket) 579 586 return true; 580 587 -
trunk/WebCore/inspector/front-end/ResourceView.js
r62535 r64104 279 279 _refreshRequestHeaders: function() 280 280 { 281 this._refreshHeaders(WebInspector.UIString("Request Headers"), this.resource.sortedRequestHeaders, this.requestHeadersTreeElement); 281 var additionalRow = null; 282 if (typeof this.resource.webSocketRequestKey3 !== "undefined") 283 additionalRow = {header: "(Key3)", value: this.resource.webSocketRequestKey3}; 284 this._refreshHeaders(WebInspector.UIString("Request Headers"), this.resource.sortedRequestHeaders, additionalRow, this.requestHeadersTreeElement); 282 285 this._refreshFormData(); 283 286 }, … … 285 288 _refreshResponseHeaders: function() 286 289 { 287 this._refreshHeaders(WebInspector.UIString("Response Headers"), this.resource.sortedResponseHeaders, this.responseHeadersTreeElement); 290 var additionalRow = null; 291 if (typeof this.resource.webSocketChallengeResponse !== "undefined") 292 additionalRow = {header: "(Challenge Response)", value: this.resource.webSocketChallengeResponse}; 293 this._refreshHeaders(WebInspector.UIString("Response Headers"), this.resource.sortedResponseHeaders, additionalRow, this.responseHeadersTreeElement); 288 294 }, 289 295 … … 316 322 }, 317 323 318 _refreshHeaders: function(title, headers, headersTreeElement)324 _refreshHeaders: function(title, headers, additionalRow, headersTreeElement) 319 325 { 320 326 headersTreeElement.removeChildren(); … … 333 339 headersTreeElement.appendChild(headerTreeElement); 334 340 } 341 342 if (additionalRow) { 343 var title = "<div class=\"header-name\">" + additionalRow.header.escapeHTML() + ":</div>"; 344 title += "<div class=\"header-value source-code\">" + additionalRow.value.escapeHTML() + "</div>" 345 346 var headerTreeElement = new TreeElement(title, null, false); 347 headerTreeElement.selectable = false; 348 headersTreeElement.appendChild(headerTreeElement); 349 } 335 350 } 336 351 } -
trunk/WebCore/inspector/front-end/inspector.css
r63757 r64104 2820 2820 2821 2821 .resources-category-documents, .resources-category-stylesheets, .resources-category-images, 2822 .resources-category-scripts, .resources-category-xhr, .resources-category-fonts, .resources-category-other { 2822 .resources-category-scripts, .resources-category-xhr, .resources-category-fonts, 2823 .resources-category-websockets, .resources-category-other { 2823 2824 display: none; 2824 2825 } … … 2830 2831 .filter-all .resources-category-xhr, .filter-xhr .resources-category-xhr, 2831 2832 .filter-all .resources-category-fonts, .filter-fonts .resources-category-fonts, 2833 .filter-all .resources-category-websockets, .filter-websockets .resources-category-websockets, 2832 2834 .filter-all .resources-category-other, .filter-other .resources-category-other, 2833 2835 .resource-sidebar-tree-item.selected { … … 2903 2905 .resources-category-xhr.resource-cached .resources-graph-bar { 2904 2906 -webkit-border-image: url(Images/timelineHollowPillYellow.png) 6 7 6 7; 2907 } 2908 2909 /* FIXME: Create bar images for WebSocket. */ 2910 .resources-category-websockets .resources-graph-bar { 2911 -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7; 2912 } 2913 2914 .resources-category-websockets.resource-cached .resources-graph-bar { 2915 -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7; 2905 2916 } 2906 2917 -
trunk/WebCore/inspector/front-end/inspector.js
r63891 r64104 465 465 xhr: new WebInspector.ResourceCategory("xhr", WebInspector.UIString("XHR"), "rgb(231,231,10)"), 466 466 fonts: new WebInspector.ResourceCategory("fonts", WebInspector.UIString("Fonts"), "rgb(255,82,62)"), 467 websocket: new WebInspector.ResourceCategory("websockets", WebInspector.UIString("WebSocket"), "rgb(186,186,186)"), // FIXME: Decide the color. 467 468 other: new WebInspector.ResourceCategory("other", WebInspector.UIString("Other"), "rgb(186,186,186)") 468 469 }; … … 1164 1165 resource.requestFormData = payload.requestFormData; 1165 1166 resource.documentURL = payload.documentURL; 1167 if (typeof payload.webSocketRequestKey3 !== "undefined") 1168 resource.webSocketRequestKey3 = payload.webSocketRequestKey3; 1166 1169 1167 1170 if (resource.mainResource) … … 1188 1191 resource.timing = payload.timing; 1189 1192 resource.cached = payload.cached; 1193 if (typeof payload.webSocketChallengeResponse !== "undefined") 1194 resource.webSocketChallengeResponse = payload.webSocketChallengeResponse; 1190 1195 } 1191 1196 -
trunk/WebCore/websockets/WebSocketChannel.cpp
r62535 r64104 37 37 #include "CookieJar.h" 38 38 #include "Document.h" 39 #include "InspectorController.h" 39 40 #include "Logging.h" 41 #include "Page.h" 40 42 #include "PlatformString.h" 43 #include "ProgressTracker.h" 41 44 #include "ScriptExecutionContext.h" 42 45 #include "SocketStreamError.h" … … 63 66 , m_closed(false) 64 67 , m_unhandledBufferedAmount(0) 65 { 68 #if ENABLE(INSPECTOR) 69 , m_identifier(0) 70 #endif 71 { 72 #if ENABLE(INSPECTOR) 73 if (InspectorController* controller = m_context->inspectorController()) 74 controller->didCreateWebSocket(identifier(), url, m_context->url()); 75 #endif 66 76 } 67 77 … … 112 122 { 113 123 LOG(Network, "WebSocketChannel %p disconnect", this); 124 #if ENABLE(INSPECTOR) 125 if (m_context) 126 if (InspectorController* controller = m_context->inspectorController()) 127 controller->didCloseWebSocket(identifier()); 128 #endif 114 129 m_handshake.clearScriptExecutionContext(); 115 130 m_client = 0; … … 137 152 if (!m_context) 138 153 return; 154 #if ENABLE(INSPECTOR) 155 if (InspectorController* controller = m_context->inspectorController()) 156 controller->willSendWebSocketHandshakeRequest(identifier(), m_handshake.clientHandshakeRequest()); 157 #endif 139 158 const CString& handshakeMessage = m_handshake.clientHandshakeMessage(); 140 159 if (!handle->send(handshakeMessage.data(), handshakeMessage.length())) { … … 147 166 { 148 167 LOG(Network, "WebSocketChannel %p didClose", this); 168 #if ENABLE(INSPECTOR) 169 if (m_context) 170 if (InspectorController* controller = m_context->inspectorController()) 171 controller->didCloseWebSocket(identifier()); 172 #endif 149 173 ASSERT_UNUSED(handle, handle == m_handle || !m_handle); 150 174 m_closed = true; … … 238 262 return false; 239 263 if (m_handshake.mode() == WebSocketHandshake::Connected) { 264 #if ENABLE(INSPECTOR) 265 if (InspectorController* controller = m_context->inspectorController()) 266 controller->didReceiveWebSocketHandshakeResponse(identifier(), m_handshake.serverHandshakeResponse()); 267 #endif 240 268 if (!m_handshake.serverSetCookie().isEmpty()) { 241 269 if (m_context->isDocument()) { … … 329 357 } 330 358 359 #if ENABLE(INSPECTOR) 360 unsigned long WebSocketChannel::identifier() 361 { 362 if (m_identifier) 363 return m_identifier; 364 365 if (InspectorController* controller = m_context->inspectorController()) 366 if (Page* page = controller->inspectedPage()) 367 m_identifier = page->progress()->createUniqueIdentifier(); 368 369 ASSERT(m_identifier); 370 return m_identifier; 371 } 372 #endif // ENABLE(INSPECTOR) 373 331 374 } // namespace WebCore 332 375 -
trunk/WebCore/websockets/WebSocketChannel.h
r62535 r64104 85 85 void resumeTimerFired(Timer<WebSocketChannel>* timer); 86 86 87 #if ENABLE(INSPECTOR) 88 unsigned long identifier(); 89 #endif 90 87 91 ScriptExecutionContext* m_context; 88 92 WebSocketChannelClient* m_client; … … 96 100 bool m_closed; 97 101 unsigned long m_unhandledBufferedAmount; 102 103 #if ENABLE(INSPECTOR) 104 unsigned long m_identifier; 105 #endif 98 106 }; 99 107
Note: See TracChangeset
for help on using the changeset viewer.