Changeset 103487 in webkit
- Timestamp:
- Dec 21, 2011 6:50:12 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r103486 r103487 1 2011-12-21 Chris Guan <chris.guan@torchmobile.com.cn> 2 3 Upstream the Multipart feature in Blackberry port 4 https://bugs.webkit.org/show_bug.cgi?id=73533 5 6 Reviewed by Rob Buis. 7 8 I refactored Multipart code of Blackberry port. Moved Multipart into 9 Blackerry network layer and removed the dependence of std::string. 10 11 Initial upstream, no new test cases. 12 13 * platform/network/blackberry/DeferredData.cpp: 14 (WebCore::DeferredData::deferMultipartHeaderReceived): 15 (WebCore::DeferredData::processHeaders): 16 (WebCore::DeferredData::processDeferredData): 17 * platform/network/blackberry/DeferredData.h: 18 (WebCore::DeferredData::hasDeferredData): 19 * platform/network/blackberry/NetworkJob.cpp: 20 (WebCore::NetworkJob::notifyMultipartHeaderReceived): 21 (WebCore::NetworkJob::handleNotifyMultipartHeaderReceived): 22 (WebCore::NetworkJob::handleNotifyDataReceived): 23 (WebCore::NetworkJob::handleNotifyClose): 24 (WebCore::NetworkJob::startNewJobWithRequest): 25 (WebCore::NetworkJob::sendResponseIfNeeded): 26 (WebCore::NetworkJob::sendMultipartResponseIfNeeded): 27 * platform/network/blackberry/NetworkJob.h: 28 1 29 2011-12-21 Eric Carlson <eric.carlson@apple.com> 2 30 -
trunk/Source/WebCore/platform/network/blackberry/DeferredData.cpp
r102433 r103487 56 56 } 57 57 58 void DeferredData::deferMultipartHeaderReceived(const String& key, const String& value) 59 { 60 m_multipartHeaderKeys.append(key); 61 m_multipartheaderValues.append(value); 62 } 63 58 64 void DeferredData::deferDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) 59 65 { … … 72 78 m_deferredCloseStatus = status; 73 79 m_deferredClose = true; 80 } 81 82 bool DeferredData::processHeaders(Vector<String>& headerKeys, Vector<String>& headerValues, HandleHeadersFunction function) 83 { 84 size_t numHeaders = headerKeys.size(); 85 ASSERT(headerValues.size() == numHeaders); 86 for (size_t i = 0; i < numHeaders; ++i) { 87 (m_job.*function)(headerKeys[i], headerValues[i]); 88 89 if (m_job.isDeferringLoading()) { 90 // Remove all the headers that have already been processed. 91 headerKeys.remove(0, i + 1); 92 headerValues.remove(0, i + 1); 93 return false; 94 } 95 96 if (m_job.isCancelled()) { 97 // Don't bother removing headers; job will be deleted. 98 return false; 99 } 100 } 101 headerKeys.clear(); 102 headerValues.clear(); 103 return true; 74 104 } 75 105 … … 101 131 } 102 132 103 size_t numHeaders = m_headerKeys.size(); 104 ASSERT(m_headerValues.size() == numHeaders); 105 for (unsigned i = 0; i < numHeaders; ++i) { 106 m_job.handleNotifyHeaderReceived(m_headerKeys[i], m_headerValues[i]); 107 108 if (m_job.isDeferringLoading()) { 109 // Remove all the headers that have already been processed. 110 m_headerKeys.remove(0, i + 1); 111 m_headerValues.remove(0, i + 1); 112 return; 113 } 114 115 if (m_job.isCancelled()) { 116 // Don't bother removing headers; job will be deleted. 117 return; 118 } 119 } 120 m_headerKeys.clear(); 121 m_headerValues.clear(); 133 if (!processHeaders(m_headerKeys, m_headerValues, &NetworkJob::handleNotifyHeaderReceived) 134 || !processHeaders(m_multipartHeaderKeys, m_multipartheaderValues, &NetworkJob::handleNotifyMultipartHeaderReceived)) 135 return; 122 136 123 137 // Only process 32k of data at a time to avoid blocking the event loop for too long. -
trunk/Source/WebCore/platform/network/blackberry/DeferredData.h
r102433 r103487 54 54 void deferWMLOverride(); 55 55 void deferHeaderReceived(const String& key, const String& value); 56 void deferMultipartHeaderReceived(const String& key, const String& value); 56 57 void deferDataReceived(const char* buf, size_t len); 57 58 void deferDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent); … … 60 61 bool hasDeferredData() const 61 62 { 62 return m_deferredStatusReceived || m_deferredWMLOverride || !m_headerKeys.isEmpty() || !m_ dataSegments.isEmpty() || m_deferredClose;63 return m_deferredStatusReceived || m_deferredWMLOverride || !m_headerKeys.isEmpty() || !m_multipartHeaderKeys.isEmpty() || !m_dataSegments.isEmpty() || m_deferredClose; 63 64 } 64 65 … … 72 73 73 74 private: 75 typedef void (NetworkJob::*HandleHeadersFunction)(const String& key, const String& value); 76 77 // Returns false if the job is deferred or canceled, otherwise returns true. 78 bool processHeaders(Vector<String>& headerKeys, Vector<String>& headerValues, HandleHeadersFunction); 79 74 80 void fireProcessDataTimer(Timer<DeferredData>*); 75 81 NetworkJob& m_job; … … 81 87 Vector<String> m_headerKeys; 82 88 Vector<String> m_headerValues; 89 Vector<String> m_multipartHeaderKeys; 90 Vector<String> m_multipartheaderValues; 83 91 Deque<Vector<char> > m_dataSegments; 84 92 unsigned long long m_bytesSent; -
trunk/Source/WebCore/platform/network/blackberry/NetworkJob.cpp
r102937 r103487 38 38 #include <BlackBerryPlatformWebKitCredits.h> 39 39 #include <BuildInformation.h> 40 #include <network/MultipartStream.h> 40 41 #include <network/NetworkRequest.h> 41 42 #include <network/NetworkStreamFactory.h> … … 280 281 } 281 282 283 void NetworkJob::notifyMultipartHeaderReceived(const char* key, const char* value) 284 { 285 if (shouldDeferLoading()) 286 m_deferredData.deferMultipartHeaderReceived(key, value); 287 else 288 handleNotifyMultipartHeaderReceived(key, value); 289 } 290 282 291 void NetworkJob::notifyStringHeaderReceived(const String& key, const String& value) 283 292 { … … 314 323 315 324 m_response.setHTTPHeaderField(key, value); 325 } 326 327 void NetworkJob::handleNotifyMultipartHeaderReceived(const String& key, const String& value) 328 { 329 if (!m_multipartResponse) { 330 // Create a new response based on the original set of headers + the 331 // replacement headers. We only replace the same few headers that gecko 332 // does. See netwerk/streamconv/converters/nsMultiMixedConv.cpp. 333 m_multipartResponse = adoptPtr(new ResourceResponse); 334 m_multipartResponse->setURL(m_response.url()); 335 336 // The list of BlackBerry::Platform::replaceHeaders that we do not copy from the original 337 // response when generating a response. 338 const WebCore::HTTPHeaderMap& map = m_response.httpHeaderFields(); 339 340 for (WebCore::HTTPHeaderMap::const_iterator it = map.begin(); it != map.end(); ++it) { 341 bool needsCopyfromOriginalResponse = true; 342 int replaceHeadersIndex = 0; 343 while (BlackBerry::Platform::MultipartStream::replaceHeaders[replaceHeadersIndex]) { 344 if (it->first.lower() == BlackBerry::Platform::MultipartStream::replaceHeaders[replaceHeadersIndex]) { 345 needsCopyfromOriginalResponse = false; 346 break; 347 } 348 replaceHeadersIndex++; 349 } 350 if (needsCopyfromOriginalResponse) 351 m_multipartResponse->setHTTPHeaderField(it->first, it->second); 352 } 353 354 m_multipartResponse->setIsMultipartPayload(true); 355 } else { 356 if (key.lower() == "content-type") { 357 String contentType = value.lower(); 358 m_multipartResponse->setMimeType(extractMIMETypeFromMediaType(contentType)); 359 m_multipartResponse->setTextEncodingName(extractCharsetFromMediaType(contentType)); 360 } 361 m_multipartResponse->setHTTPHeaderField(key, value); 362 } 316 363 } 317 364 … … 351 398 if (shouldSendClientData()) { 352 399 sendResponseIfNeeded(); 400 sendMultipartResponseIfNeeded(); 353 401 if (clientIsOk()) { 354 if (m_multipartDelegate) 355 m_multipartDelegate->onReceivedData(buf, len, len); 356 else { 357 RecursionGuard guard(m_callingClient); 358 m_handle->client()->didReceiveData(m_handle.get(), buf, len, len); 359 } 402 RecursionGuard guard(m_callingClient); 403 m_handle->client()->didReceiveData(m_handle.get(), buf, len, len); 360 404 } 361 405 } … … 420 464 sendResponseIfNeeded(); 421 465 if (clientIsOk()) { 422 if (m_multipartDelegate)423 m_multipartDelegate->onCompletedRequest();424 466 425 467 RecursionGuard guard(m_callingClient); … … 440 482 // Detach from the ResourceHandle in any case. 441 483 m_handle = 0; 442 m_multipart Delegate = nullptr;484 m_multipartResponse = nullptr; 443 485 } 444 486 … … 488 530 RefPtr<ResourceHandle> handle = m_handle; 489 531 m_handle = 0; 490 m_multipart Delegate = nullptr;532 m_multipartResponse = nullptr; 491 533 492 534 NetworkManager::instance()->startJob(m_playerId, … … 583 625 RecursionGuard guard(m_callingClient); 584 626 m_handle->client()->didReceiveResponse(m_handle.get(), m_response); 585 586 if (mimeType == "multipart/x-mixed-replace") { 587 std::string boundary; 588 bool isReadBoundary = MultipartResponseDelegate::readMultipartBoundary(m_contentType.lower().utf8().data(), boundary); 589 if (isReadBoundary && !boundary.empty()) 590 m_multipartDelegate = adoptPtr(new MultipartResponseDelegate(m_handle, m_response, boundary)); 591 } 627 } 628 } 629 630 void NetworkJob::sendMultipartResponseIfNeeded() 631 { 632 if (m_multipartResponse && clientIsOk()) { 633 m_handle->client()->didReceiveResponse(m_handle.get(), *m_multipartResponse); 634 m_multipartResponse = nullptr; 592 635 } 593 636 } -
trunk/Source/WebCore/platform/network/blackberry/NetworkJob.h
r102433 r103487 21 21 22 22 #include "DeferredData.h" 23 #include "MultipartResponseDelegate.h"24 23 #include "PlatformString.h" 25 24 #include "ProtectionSpace.h" … … 71 70 void handleNotifyWMLOverride() { m_response.setIsWML(true); } 72 71 virtual void notifyHeaderReceived(const char* key, const char* value); 72 virtual void notifyMultipartHeaderReceived(const char* key, const char* value); 73 73 // Exists only to resolve ambiguity between char* and String parameters 74 74 void notifyStringHeaderReceived(const String& key, const String& value); 75 75 void handleNotifyHeaderReceived(const String& key, const String& value); 76 void handleNotifyMultipartHeaderReceived(const String& key, const String& value); 76 77 void handleSetCookieHeader(const String& value); 77 78 void notifyDataReceivedPlain(const char* buf, size_t len); … … 109 110 // This can cause m_cancelled to be set to true, if it passes up an error to m_handle->client() which causes the job to be cancelled 110 111 void sendResponseIfNeeded(); 112 void sendMultipartResponseIfNeeded(); 111 113 112 114 void fireLoadDataTimer(Timer<NetworkJob>*) … … 150 152 Timer<NetworkJob> m_loadDataTimer; 151 153 Timer<NetworkJob> m_loadAboutTimer; 152 OwnPtr< MultipartResponseDelegate> m_multipartDelegate;154 OwnPtr<ResourceResponse> m_multipartResponse; 153 155 Timer<NetworkJob> m_deleteJobTimer; 154 156 String m_contentType;
Note: See TracChangeset
for help on using the changeset viewer.