void SocketStreamHandle::platformClose() { LOG(Network, "SocketStreamHandle %p platformClose", this); if (m_pacRunLoopSource) removePACRunLoopSource(); ASSERT(!m_readStream == !m_writeStream); if (!m_readStream) { if (m_connectingSubstate == New || m_connectingSubstate == ExecutingPACFile) m_client->didCloseSocketStream(this); return; } #if PLATFORM(WIN) CFReadStreamUnscheduleFromRunLoop(m_readStream.get(), loaderRunLoop(), kCFRunLoopDefaultMode); CFWriteStreamUnscheduleFromRunLoop(m_writeStream.get(), loaderRunLoop(), kCFRunLoopDefaultMode); #else CFReadStreamUnscheduleFromRunLoop(m_readStream.get(), CFRunLoopGetCurrent(), kCFRunLoopCommonModes); CFWriteStreamUnscheduleFromRunLoop(m_writeStream.get(), CFRunLoopGetCurrent(), kCFRunLoopCommonModes); #endif CFReadStreamClose(m_readStream.get()); CFWriteStreamClose(m_writeStream.get()); m_readStream = 0; m_writeStream = 0; m_client->didCloseSocketStream(this); }
void SocketStreamHandle::scheduleStreams() { ASSERT(m_readStream); ASSERT(m_writeStream); CFStreamClientContext clientContext = { 0, this, 0, 0, copyCFStreamDescription }; // FIXME: Pass specific events we're interested in instead of -1. CFReadStreamSetClient(m_readStream.get(), static_cast<CFOptionFlags>(-1), readStreamCallback, &clientContext); CFWriteStreamSetClient(m_writeStream.get(), static_cast<CFOptionFlags>(-1), writeStreamCallback, &clientContext); #if PLATFORM(WIN) CFReadStreamScheduleWithRunLoop(m_readStream.get(), loaderRunLoop(), kCFRunLoopDefaultMode); CFWriteStreamScheduleWithRunLoop(m_writeStream.get(), loaderRunLoop(), kCFRunLoopDefaultMode); #else CFReadStreamScheduleWithRunLoop(m_readStream.get(), CFRunLoopGetCurrent(), kCFRunLoopCommonModes); CFWriteStreamScheduleWithRunLoop(m_writeStream.get(), CFRunLoopGetCurrent(), kCFRunLoopCommonModes); #endif CFReadStreamOpen(m_readStream.get()); CFWriteStreamOpen(m_writeStream.get()); #ifndef BUILDING_ON_TIGER if (m_pacRunLoopSource) removePACRunLoopSource(); #endif m_connectingSubstate = WaitingForConnect; }
bool ResourceHandle::start(NetworkingContext* context) { if (!context) return false; // If NetworkingContext is invalid then we are no longer attached to a Page, // this must be an attempted load from an unload handler, so let's just block it. if (!context->isValid()) return false; d->m_storageSession = context->storageSession(); bool shouldUseCredentialStorage = !client() || client()->shouldUseCredentialStorage(this); createCFURLConnection(shouldUseCredentialStorage, shouldRelaxThirdPartyCookiePolicy(context, firstRequest().url()), d->m_shouldContentSniff); #if PLATFORM(WIN) CFURLConnectionScheduleWithCurrentMessageQueue(d->m_connection.get()); #else CFURLConnectionScheduleWithRunLoop(d->m_connection.get(), CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); #endif CFURLConnectionScheduleDownloadWithRunLoop(d->m_connection.get(), loaderRunLoop(), kCFRunLoopDefaultMode); CFURLConnectionStart(d->m_connection.get()); LOG(Network, "CFNet - Starting URL %s (handle=%p, conn=%p)", firstRequest().url().string().utf8().data(), this, d->m_connection.get()); return true; }
bool ResourceHandle::start(Frame* frame) { // If we are no longer attached to a Page, this must be an attempted load from an // onUnload handler, so let's just block it. if (!frame->page()) return false; RetainPtr<CFURLRequestRef> request(AdoptCF, makeFinalRequest(d->m_request, d->m_shouldContentSniff)); CFURLConnectionClient* client; #ifdef _CFURLConnectionClientV2Present // CFURLConnection Callback API currently at version 2 CFURLConnectionClient_V2 client_V2 = {2, this, 0, 0, 0, willSendRequest, didReceiveResponse, didReceiveData, NULL, didFinishLoading, didFail, willCacheResponse, didReceiveChallenge, didSendBodyData}; client = reinterpret_cast<CFURLConnectionClient*>(&client_V2); #else CFURLConnectionClient client_V1 = {1, this, 0, 0, 0, willSendRequest, didReceiveResponse, didReceiveData, NULL, didFinishLoading, didFail, willCacheResponse, didReceiveChallenge}; client = &client_V1; #endif d->m_connection.adoptCF(CFURLConnectionCreate(0, request.get(), client)); CFURLConnectionScheduleWithCurrentMessageQueue(d->m_connection.get()); CFURLConnectionScheduleDownloadWithRunLoop(d->m_connection.get(), loaderRunLoop(), kCFRunLoopDefaultMode); CFURLConnectionStart(d->m_connection.get()); LOG(Network, "CFNet - Starting URL %s (handle=%p, conn=%p)", d->m_request.url().string().utf8().data(), this, d->m_connection); return true; }
static inline CFRunLoopRef cookieStorageObserverRunLoop() { // We're using the loader run loop because we need a CFRunLoop to // call the CFNetwork cookie storage APIs with. Re-using the loader // run loop is less overhead than starting a new thread to just listen // for changes in cookies. // FIXME: The loaderRunLoop function name should be a little more generic. return loaderRunLoop(); }
void SynchronousResourceHandleCFURLConnectionDelegate::setupConnectionScheduling(CFURLConnectionRef connection) { #if PLATFORM(WIN) CFURLConnectionScheduleWithCurrentMessageQueue(connection); #elif PLATFORM(IOS) CFURLConnectionScheduleWithRunLoop(connection, WebThreadRunLoop(), kCFRunLoopDefaultMode); #else CFURLConnectionScheduleWithRunLoop(connection, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); #endif CFURLConnectionScheduleDownloadWithRunLoop(connection, loaderRunLoop(), kCFRunLoopDefaultMode); }
void SocketStreamHandle::removePACRunLoopSource() { ASSERT(m_pacRunLoopSource); CFRunLoopSourceInvalidate(m_pacRunLoopSource.get()); #if PLATFORM(WIN) CFRunLoopRemoveSource(loaderRunLoop(), m_pacRunLoopSource.get(), kCFRunLoopDefaultMode); #else CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_pacRunLoopSource.get(), kCFRunLoopCommonModes); #endif m_pacRunLoopSource = 0; }
void SocketStreamHandle::executePACFileURL(CFURLRef pacFileURL) { // CFNetwork returns an empty proxy array for WebScoket schemes, so use m_httpsURL. CFStreamClientContext clientContext = { 0, this, 0, 0, copyPACExecutionDescription }; m_pacRunLoopSource.adoptCF(CFNetworkExecuteProxyAutoConfigurationURL(pacFileURL, m_httpsURL.get(), pacExecutionCallback, &clientContext)); #if PLATFORM(WIN) CFRunLoopAddSource(loaderRunLoop(), m_pacRunLoopSource.get(), kCFRunLoopDefaultMode); #else CFRunLoopAddSource(CFRunLoopGetCurrent(), m_pacRunLoopSource.get(), kCFRunLoopCommonModes); #endif m_connectingSubstate = ExecutingPACFile; }
void Download::start(WebPage* initiatingWebPage) { ASSERT(!m_download); CFURLRequestRef cfRequest = m_request.cfURLRequest(); CFURLDownloadClient client = {0, this, 0, 0, 0, didStartCallback, willSendRequestCallback, didReceiveAuthenticationChallengeCallback, didReceiveResponseCallback, willResumeWithResponseCallback, didReceiveDataCallback, shouldDecodeDataOfMIMETypeCallback, decideDestinationWithSuggestedObjectNameCallback, didCreateDestinationCallback, didFinishCallback, didFailCallback}; m_download.adoptCF(CFURLDownloadCreate(0, cfRequest, &client)); // FIXME: Allow this to be changed by the client. CFURLDownloadSetDeletesUponFailure(m_download.get(), false); CFURLDownloadScheduleWithCurrentMessageQueue(m_download.get()); CFURLDownloadScheduleDownloadWithRunLoop(m_download.get(), loaderRunLoop(), kCFRunLoopDefaultMode); }
void DNSResolveQueue::resolve(const String& hostname) { ASSERT(isMainThread()); RetainPtr<CFStringRef> hostnameCF(AdoptCF, hostname.createCFString()); RetainPtr<CFHostRef> host(AdoptCF, CFHostCreateWithName(0, hostnameCF.get())); if (!host) { atomicDecrement(&m_requestsInFlight); return; } CFHostClientContext context = { 0, 0, 0, 0, 0 }; Boolean result = CFHostSetClient(host.get(), clientCallback, &context); ASSERT_UNUSED(result, result); #if !PLATFORM(WIN) CFHostScheduleWithRunLoop(host.get(), CFRunLoopGetMain(), kCFRunLoopCommonModes); #else // On Windows, we run a separate thread with CFRunLoop, which is where clientCallback will be called. CFHostScheduleWithRunLoop(host.get(), loaderRunLoop(), kCFRunLoopDefaultMode); #endif CFHostStartInfoResolution(host.get(), kCFHostAddresses, 0); host.releaseRef(); // The host will be released from clientCallback(). }
bool ResourceHandle::start(NetworkingContext* context) { if (!context) return false; // If NetworkingContext is invalid then we are no longer attached to a Page, // this must be an attempted load from an unload handler, so let's just block it. if (!context->isValid()) return false; bool shouldUseCredentialStorage = !client() || client()->shouldUseCredentialStorage(this); createCFURLConnection(shouldUseCredentialStorage, d->m_shouldContentSniff, client()->connectionProperties(this)); CFURLConnectionScheduleWithRunLoop(d->m_connection.get(), WebThreadRunLoop(), kCFRunLoopDefaultMode); CFURLConnectionScheduleDownloadWithRunLoop(d->m_connection.get(), loaderRunLoop(), kCFRunLoopDefaultMode); CFURLConnectionStart(d->m_connection.get()); LOG(Network, "CFNet - Starting URL %s (handle=%p, conn=%p)", firstRequest().url().string().utf8().data(), this, d->m_connection.get()); return true; }
void DNSResolveQueue::platformResolve(const String& hostname) { ASSERT(isMainThread()); RetainPtr<CFHostRef> host = adoptCF(CFHostCreateWithName(0, hostname.createCFString().get())); if (!host) { decrementRequestCount(); return; } CFHostClientContext context = { 0, 0, 0, 0, 0 }; CFHostRef leakedHost = host.leakRef(); // The host will be released from clientCallback(). Boolean result = CFHostSetClient(leakedHost, clientCallback, &context); ASSERT_UNUSED(result, result); #if !PLATFORM(WIN) CFHostScheduleWithRunLoop(leakedHost, CFRunLoopGetMain(), kCFRunLoopCommonModes); #else // On Windows, we run a separate thread with CFRunLoop, which is where clientCallback will be called. CFHostScheduleWithRunLoop(leakedHost, loaderRunLoop(), kCFRunLoopDefaultMode); #endif CFHostStartInfoResolution(leakedHost, kCFHostAddresses, 0); }