RetainPtr<CFDataRef> ShareableResource::Handle::tryWrapInCFData() const { RefPtr<ShareableResource> resource = ShareableResource::create(*this); if (!resource) { LOG_ERROR("Failed to recreate ShareableResource from handle."); return 0; } RetainPtr<CFAllocatorRef> deallocator = adoptCF(createShareableResourceDeallocator(resource.get())); return adoptCF(CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<const UInt8*>(resource->data()), static_cast<CFIndex>(resource->size()), deallocator.get())); }
PassRefPtr<SharedBuffer> ShareableResource::wrapInSharedBuffer() { ref(); // Balanced by deref when SharedBuffer is deallocated. #if USE(CF) RetainPtr<CFAllocatorRef> deallocator = adoptCF(createShareableResourceDeallocator(this)); RetainPtr<CFDataRef> cfData = adoptCF(CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<const UInt8*>(data()), static_cast<CFIndex>(size()), deallocator.get())); return SharedBuffer::wrapCFData(cfData.get()); #elif USE(SOUP) return SharedBuffer::wrapSoupBuffer(soup_buffer_new_with_owner(data(), size(), this, [](void* data) { static_cast<ShareableResource*>(data)->deref(); })); #else ASSERT_NOT_REACHED(); return nullptr; #endif }
void WebResourceLoader::didReceiveResource(const ShareableResource::Handle& handle, double finishTime) { LOG(Network, "(WebProcess) WebResourceLoader::didReceiveResource for '%s'", m_coreLoader->url().string().utf8().data()); RefPtr<ShareableResource> resource = ShareableResource::create(handle); if (!resource) { LOG_ERROR("Unabled to recreate the ShareableResource sent from the network process."); m_coreLoader->didFail(internalError(m_coreLoader->request().url())); return; } // Only send data to the didReceiveData callback if it exists. if (resource->size()) { RetainPtr<CFAllocatorRef> deallocator(AdoptCF, createShareableResourceDeallocator(resource)); RetainPtr<CFDataRef> data(AdoptCF, CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<const UInt8*>(resource->data()), static_cast<CFIndex>(resource->size()), deallocator.get())); RefPtr<SharedBuffer> buffer = SharedBuffer::wrapCFData(data.get()); m_coreLoader->didReceiveBuffer(buffer.get(), buffer->size(), DataPayloadWholeResource); } m_coreLoader->didFinishLoading(finishTime); }