Changeset 62529 in webkit
- Timestamp:
- Jul 5, 2010 11:48:57 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r62528 r62529 1 2010-07-05 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): 35 (WebCore::InspectorResource::cachedResource): 36 (WebCore::InspectorResource::type): 37 (WebCore::InspectorResource::resourceData): 38 * inspector/InspectorResource.h: 39 (WebCore::InspectorResource::): 40 (WebCore::InspectorResource::markWebSocket): 41 * inspector/front-end/Resource.js: 42 (WebInspector.Resource.Type.toString): 43 (WebInspector.Resource.prototype.set type): 44 (WebInspector.Resource.prototype._mimeTypeIsConsistentWithType): 45 * inspector/front-end/ResourceView.js: 46 (WebInspector.ResourceView.prototype._refreshRequestHeaders): 47 (WebInspector.ResourceView.prototype._refreshResponseHeaders): 48 (WebInspector.ResourceView.prototype._refreshHeaders): 49 * inspector/front-end/inspector.css: 50 (.resources-category-websockets, .resources-category-other): 51 (.resources-category-websockets .resources-graph-bar): 52 (.resources-category-websockets.resource-cached .resources-graph-bar): 53 * inspector/front-end/inspector.js: 54 (WebInspector.loaded): 55 (WebInspector.updateResource): 56 * websockets/WebSocketChannel.cpp: 57 (WebCore::WebSocketChannel::WebSocketChannel): 58 (WebCore::WebSocketChannel::disconnect): 59 (WebCore::WebSocketChannel::didOpen): 60 (WebCore::WebSocketChannel::didClose): 61 (WebCore::WebSocketChannel::processBuffer): 62 (WebCore::WebSocketChannel::identifier): 63 * websockets/WebSocketChannel.h: 64 1 65 2010-07-05 Yury Semikhatsky <yurys@chromium.org> 2 66 -
trunk/WebCore/inspector/InspectorController.cpp
r62503 r62529 806 806 807 807 Frame* frame = resource->frame(); 808 if (!frame) 809 return; 808 810 ResourcesMap* resourceMap = m_frameResources.get(frame); 809 811 if (resourceMap) … … 824 826 825 827 Frame* frame = resource->frame(); 828 if (!frame) 829 return; 826 830 ResourcesMap* resourceMap = m_frameResources.get(frame); 827 831 if (!resourceMap) { … … 1466 1470 } 1467 1471 #endif 1472 1473 #if ENABLE(WEB_SOCKETS) 1474 void InspectorController::didCreateWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL) 1475 { 1476 if (!enabled()) 1477 return; 1478 ASSERT(m_inspectedPage); 1479 1480 RefPtr<InspectorResource> resource = InspectorResource::createWebSocket(identifier, requestURL, documentURL); 1481 addResource(resource.get()); 1482 1483 if (m_frontend) 1484 resource->updateScriptObject(m_frontend.get()); 1485 } 1486 1487 void InspectorController::willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest& request) 1488 { 1489 RefPtr<InspectorResource> resource = getTrackedResource(identifier); 1490 if (!resource) 1491 return; 1492 resource->startTiming(); 1493 resource->updateWebSocketRequest(request); 1494 if (m_frontend) 1495 resource->updateScriptObject(m_frontend.get()); 1496 } 1497 1498 void InspectorController::didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse& response) 1499 { 1500 RefPtr<InspectorResource> resource = getTrackedResource(identifier); 1501 if (!resource) 1502 return; 1503 // Calling resource->markResponseReceivedTime() here makes resources bar chart confusing, because 1504 // we cannot apply the "latency + download" model of regular resources to WebSocket connections. 1505 // FIXME: Design a new UI for bar charts of WebSocket resources, and record timing here. 1506 resource->updateWebSocketResponse(response); 1507 if (m_frontend) 1508 resource->updateScriptObject(m_frontend.get()); 1509 } 1510 1511 void InspectorController::didCloseWebSocket(unsigned long identifier) 1512 { 1513 RefPtr<InspectorResource> resource = getTrackedResource(identifier); 1514 if (!resource) 1515 return; 1516 1517 resource->endTiming(); 1518 if (m_frontend) 1519 resource->updateScriptObject(m_frontend.get()); 1520 } 1521 #endif // ENABLE(WEB_SOCKETS) 1468 1522 1469 1523 #if ENABLE(JAVASCRIPT_DEBUGGER) -
trunk/WebCore/inspector/InspectorController.h
r62503 r62529 91 91 #endif 92 92 93 #if ENABLE(WEB_SOCKETS) 94 class WebSocketHandshakeRequest; 95 class WebSocketHandshakeResponse; 96 #endif 97 93 98 class InspectorController 94 99 #if ENABLE(JAVASCRIPT_DEBUGGER) … … 216 221 void removeDOMStorageItem(long callId, long storageId, const String& key); 217 222 #endif 223 #if ENABLE(WEB_SOCKETS) 224 void didCreateWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL); 225 void willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest&); 226 void didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse&); 227 void didCloseWebSocket(unsigned long identifier); 228 #endif 218 229 219 230 const ResourcesMap& resources() const { return m_resources; } -
trunk/WebCore/inspector/InspectorResource.cpp
r61012 r62529 42 42 #include "ResourceRequest.h" 43 43 #include "ResourceResponse.h" 44 #include "StringBuffer.h" 44 45 #include "TextEncoding.h" 45 46 #include "ScriptObject.h" 47 #include "WebSocketHandshakeRequest.h" 48 #include "WebSocketHandshakeResponse.h" 49 50 #include <wtf/Assertions.h> 46 51 47 52 namespace WebCore { 48 53 49 InspectorResource::InspectorResource(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL) 54 // Create human-readable binary representation, like "01:23:45:67:89:AB:CD:EF". 55 static String createReadableStringFromBinary(const unsigned char* value, size_t length) 56 { 57 ASSERT(length > 0); 58 static const char hexDigits[17] = "0123456789ABCDEF"; 59 size_t bufferSize = length * 3 - 1; 60 StringBuffer buffer(bufferSize); 61 size_t index = 0; 62 for (size_t i = 0; i < length; ++i) { 63 if (i > 0) 64 buffer[index++] = ':'; 65 buffer[index++] = hexDigits[value[i] >> 4]; 66 buffer[index++] = hexDigits[value[i] & 0xF]; 67 } 68 ASSERT(index == bufferSize); 69 return String::adopt(buffer); 70 } 71 72 InspectorResource::InspectorResource(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL, const KURL& documentURL) 50 73 : m_identifier(identifier) 51 74 , m_loader(loader) 52 , m_frame(loader ->frame())75 , m_frame(loader ? loader->frame() : 0) 53 76 , m_requestURL(requestURL) 77 , m_documentURL(documentURL) 54 78 , m_expectedContentLength(0) 55 79 , m_cached(false) … … 64 88 , m_domContentEventTime(-1.0) 65 89 , m_isMainResource(false) 90 #if ENABLE(WEB_SOCKETS) 91 , m_isWebSocket(false) 92 #endif 66 93 { 67 94 } … … 86 113 } 87 114 115 PassRefPtr<InspectorResource> InspectorResource::create(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL) 116 { 117 ASSERT(loader); 118 return adoptRef(new InspectorResource(identifier, loader, requestURL, loader->frame()->document()->url())); 119 } 120 88 121 PassRefPtr<InspectorResource> InspectorResource::createCached(unsigned long identifier, DocumentLoader* loader, const CachedResource* cachedResource) 89 122 { … … 104 137 return resource; 105 138 } 139 140 #if ENABLE(WEB_SOCKETS) 141 PassRefPtr<InspectorResource> InspectorResource::createWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL) 142 { 143 RefPtr<InspectorResource> resource(new InspectorResource(identifier, 0, requestURL, documentURL)); 144 resource->markWebSocket(); 145 return resource.release(); 146 } 147 #endif 106 148 107 149 void InspectorResource::updateRequest(const ResourceRequest& request) … … 133 175 } 134 176 177 #if ENABLE(WEB_SOCKETS) 178 void InspectorResource::updateWebSocketRequest(const WebSocketHandshakeRequest& request) 179 { 180 m_requestHeaderFields = request.headerFields(); 181 m_requestMethod = "GET"; // Currently we always use "GET" to request handshake. 182 m_webSocketRequestKey3.set(new WebSocketHandshakeRequest::Key3(request.key3())); 183 m_changes.set(RequestChange); 184 m_changes.set(TypeChange); 185 } 186 187 void InspectorResource::updateWebSocketResponse(const WebSocketHandshakeResponse& response) 188 { 189 m_responseStatusCode = response.statusCode(); 190 m_responseStatusText = response.statusText(); 191 m_responseHeaderFields = response.headerFields(); 192 m_webSocketChallengeResponse.set(new WebSocketHandshakeResponse::ChallengeResponse(response.challengeResponse())); 193 m_changes.set(ResponseChange); 194 m_changes.set(TypeChange); 195 } 196 #endif // ENABLE(WEB_SOCKETS) 197 135 198 static void populateHeadersObject(ScriptObject* object, const HTTPHeaderMap& headers) 136 199 { … … 150 213 if (m_changes.hasChange(RequestChange)) { 151 214 jsonObject.set("url", m_requestURL.string()); 152 jsonObject.set("documentURL", m_ frame->document()->url().string());215 jsonObject.set("documentURL", m_documentURL.string()); 153 216 jsonObject.set("host", m_requestURL.host()); 154 217 jsonObject.set("path", m_requestURL.path()); … … 162 225 jsonObject.set("didRequestChange", true); 163 226 jsonObject.set("cached", m_cached); 227 #if ENABLE(WEB_SOCKETS) 228 if (m_webSocketRequestKey3) 229 jsonObject.set("webSocketRequestKey3", createReadableStringFromBinary(m_webSocketRequestKey3->value, sizeof(m_webSocketRequestKey3->value))); 230 #endif 164 231 } 165 232 … … 173 240 populateHeadersObject(&responseHeaders, m_responseHeaderFields); 174 241 jsonObject.set("responseHeaders", responseHeaders); 242 #if ENABLE(WEB_SOCKETS) 243 if (m_webSocketChallengeResponse) 244 jsonObject.set("webSocketChallengeResponse", createReadableStringFromBinary(m_webSocketChallengeResponse->value, sizeof(m_webSocketChallengeResponse->value))); 245 #endif 175 246 jsonObject.set("didResponseChange", true); 176 247 } … … 231 302 // but Inspector will already try to fetch data that is only available via CachedResource (and it won't update once the resource is added, 232 303 // because m_changes will not have the appropriate bits set). 304 if (!m_frame) 305 return 0; 233 306 const String& url = m_requestURL.string(); 234 307 CachedResource* cachedResource = m_frame->document()->docLoader()->cachedResource(url); … … 267 340 return m_overrideContentType; 268 341 342 #if ENABLE(WEB_SOCKETS) 343 if (m_isWebSocket) 344 return WebSocket; 345 #endif 346 347 ASSERT(m_loader); 269 348 if (m_requestURL == m_loader->requestURL()) { 270 349 InspectorResource::Type resourceType = cachedResourceType(); … … 306 385 PassRefPtr<SharedBuffer> InspectorResource::resourceData(String* textEncodingName) const 307 386 { 308 if (m_ requestURL == m_loader->requestURL()) {387 if (m_loader && m_requestURL == m_loader->requestURL()) { 309 388 *textEncodingName = m_frame->document()->inputEncoding(); 310 389 return m_loader->mainResourceData(); -
trunk/WebCore/inspector/InspectorResource.h
r60206 r62529 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> … … 51 53 class Frame; 52 54 class ResourceResponse; 53 54 55 class ResourceRequest; 56 57 #if ENABLE(WEB_SOCKETS) 58 class WebSocketHandshakeRequest; 59 class WebSocketHandshakeResponse; 60 #endif 55 61 56 62 class InspectorResource : public RefCounted<InspectorResource> { … … 66 72 XHR, 67 73 Media, 74 WebSocket, 68 75 Other 69 76 }; 70 77 71 static PassRefPtr<InspectorResource> create(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL) 72 { 73 return adoptRef(new InspectorResource(identifier, loader, requestURL)); 74 } 78 static PassRefPtr<InspectorResource> create(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL); 75 79 76 80 static PassRefPtr<InspectorResource> createCached(unsigned long identifier, DocumentLoader*, const CachedResource*); 81 82 #if ENABLE(WEB_SOCKETS) 83 // WebSocket resource doesn't have its loader. For WebSocket resources, m_loader and m_frame will become null. 84 static PassRefPtr<InspectorResource> createWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL); 85 #endif 77 86 78 87 ~InspectorResource(); … … 84 93 void updateRequest(const ResourceRequest&); 85 94 void updateResponse(const ResourceResponse&); 95 96 #if ENABLE(WEB_SOCKETS) 97 void updateWebSocketRequest(const WebSocketHandshakeRequest&); 98 void updateWebSocketResponse(const WebSocketHandshakeResponse&); 99 #endif 86 100 87 101 void setOverrideContent(const ScriptString& data, Type); … … 147 161 }; 148 162 149 InspectorResource(unsigned long identifier, DocumentLoader*, const KURL& requestURL );163 InspectorResource(unsigned long identifier, DocumentLoader*, const KURL& requestURL, const KURL& documentURL); 150 164 Type type() const; 151 165 152 166 Type cachedResourceType() const; 153 167 CachedResource* cachedResource() const; 168 169 #if ENABLE(WEB_SOCKETS) 170 void markWebSocket() { m_isWebSocket = true; } 171 #endif 154 172 155 173 unsigned long m_identifier; … … 157 175 RefPtr<Frame> m_frame; 158 176 KURL m_requestURL; 177 KURL m_documentURL; 159 178 HTTPHeaderMap m_requestHeaderFields; 160 179 HTTPHeaderMap m_responseHeaderFields; … … 180 199 String m_requestFormData; 181 200 Vector<RefPtr<InspectorResource> > m_redirects; 201 202 #if ENABLE(WEB_SOCKETS) 203 bool m_isWebSocket; 204 205 // The following fields are not used for resources other than WebSocket. 206 // We allocate them dynamically to reduce memory consumption for regular resources. 207 OwnPtr<WebSocketHandshakeRequest::Key3> m_webSocketRequestKey3; 208 OwnPtr<WebSocketHandshakeResponse::ChallengeResponse> m_webSocketChallengeResponse; 209 #endif 182 210 }; 183 211 -
trunk/WebCore/inspector/front-end/Resource.js
r60562 r62529 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: … … 353 356 this.category = WebInspector.resourceCategories.xhr; 354 357 break; 358 case WebInspector.Resource.Type.WebSocket: 359 this.category = WebInspector.resourceCategories.websocket; 360 break; 355 361 case WebInspector.Resource.Type.Other: 356 362 default: … … 565 571 if (typeof this.type === "undefined" 566 572 || this.type === WebInspector.Resource.Type.Other 567 || this.type === WebInspector.Resource.Type.XHR) 573 || this.type === WebInspector.Resource.Type.XHR 574 || this.type === WebInspector.Resource.Type.WebSocket) 568 575 return true; 569 576 -
trunk/WebCore/inspector/front-end/ResourceView.js
r61014 r62529 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
r62502 r62529 2804 2804 2805 2805 .resources-category-documents, .resources-category-stylesheets, .resources-category-images, 2806 .resources-category-scripts, .resources-category-xhr, .resources-category-fonts, .resources-category-other { 2806 .resources-category-scripts, .resources-category-xhr, .resources-category-fonts, 2807 .resources-category-websockets, .resources-category-other { 2807 2808 display: none; 2808 2809 } … … 2814 2815 .filter-all .resources-category-xhr, .filter-xhr .resources-category-xhr, 2815 2816 .filter-all .resources-category-fonts, .filter-fonts .resources-category-fonts, 2817 .filter-all .resources-category-websockets, .filter-websockets .resources-category-websockets, 2816 2818 .filter-all .resources-category-other, .filter-other .resources-category-other, 2817 2819 .resource-sidebar-tree-item.selected { … … 2887 2889 .resources-category-xhr.resource-cached .resources-graph-bar { 2888 2890 -webkit-border-image: url(Images/timelineHollowPillYellow.png) 6 7 6 7; 2891 } 2892 2893 /* FIXME: Create bar images for WebSocket. */ 2894 .resources-category-websockets .resources-graph-bar { 2895 -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7; 2896 } 2897 2898 .resources-category-websockets.resource-cached .resources-graph-bar { 2899 -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7; 2889 2900 } 2890 2901 -
trunk/WebCore/inspector/front-end/inspector.js
r62503 r62529 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 }; … … 1162 1163 resource.cached = payload.cached; 1163 1164 resource.documentURL = payload.documentURL; 1165 if (typeof payload.webSocketRequestKey3 !== "undefined") 1166 resource.webSocketRequestKey3 = payload.webSocketRequestKey3; 1164 1167 1165 1168 if (resource.mainResource) … … 1182 1185 resource.suggestedFilename = payload.suggestedFilename; 1183 1186 resource.responseHeaders = payload.responseHeaders; 1187 if (typeof payload.webSocketChallengeResponse !== "undefined") 1188 resource.webSocketChallengeResponse = payload.webSocketChallengeResponse; 1184 1189 } 1185 1190 -
trunk/WebCore/websockets/WebSocketChannel.cpp
r61375 r62529 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
r61375 r62529 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.