- changed ResourceLoader to be refcounted
It keeps a ref on itself while loading as well. This makes
for a much saner memory management model than the previous.
* bridge/mac/WebCoreResourceLoaderImp.mm:
(-[WebCoreResourceLoaderImp finishJobAndHandle:]):
* dom/XMLTokenizer.cpp:
(WebCore::openFunc):
* loader/icon/IconLoader.cpp:
(IconLoader::IconLoader):
(IconLoader::~IconLoader):
(IconLoader::startLoading):
(IconLoader::stopLoading):
(IconLoader::receivedData):
* loader/icon/IconLoader.h:
* loader/loader.cpp:
(WebCore::Loader::servePendingRequests):
* platform/ResourceLoader.cpp:
(WebCore::ResourceLoader::create):
(WebCore::ResourceLoader::kill):
* platform/ResourceLoader.h:
* platform/ResourceLoaderInternal.h:
(WebCore::ResourceLoaderInternal::ResourceLoaderInternal):
* platform/mac/ResourceLoaderMac.mm:
(WebCore::ResourceLoader::start):
* xml/XSLTProcessor.cpp:
(WebCore::docLoaderFunc):
* xml/xmlhttprequest.cpp:
(WebCore::XMLHttpRequest::send):
* xml/xmlhttprequest.h:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16803
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2006-10-05 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Adam.
+
+ - changed ResourceLoader to be refcounted
+
+ It keeps a ref on itself while loading as well. This makes
+ for a much saner memory management model than the previous.
+
+ * bridge/mac/WebCoreResourceLoaderImp.mm:
+ (-[WebCoreResourceLoaderImp finishJobAndHandle:]):
+ * dom/XMLTokenizer.cpp:
+ (WebCore::openFunc):
+ * loader/icon/IconLoader.cpp:
+ (IconLoader::IconLoader):
+ (IconLoader::~IconLoader):
+ (IconLoader::startLoading):
+ (IconLoader::stopLoading):
+ (IconLoader::receivedData):
+ * loader/icon/IconLoader.h:
+ * loader/loader.cpp:
+ (WebCore::Loader::servePendingRequests):
+ * platform/ResourceLoader.cpp:
+ (WebCore::ResourceLoader::create):
+ (WebCore::ResourceLoader::kill):
+ * platform/ResourceLoader.h:
+ * platform/ResourceLoaderInternal.h:
+ (WebCore::ResourceLoaderInternal::ResourceLoaderInternal):
+ * platform/mac/ResourceLoaderMac.mm:
+ (WebCore::ResourceLoader::start):
+ * xml/XSLTProcessor.cpp:
+ (WebCore::docLoaderFunc):
+ * xml/xmlhttprequest.cpp:
+ (WebCore::XMLHttpRequest::send):
+ * xml/xmlhttprequest.h:
+
2006-10-05 Eric Seidel <eric@eseidel.com>
Reviewed by mjs.
client->receivedAllData(job, data);
client->receivedAllData(job);
}
- delete job;
+ job->kill();
}
[handle release];
}
return &globalDescriptor;
KURL finalURL;
- ResourceLoader* job = new ResourceLoader(0, "GET", uri);
+ RefPtr<ResourceLoader> loader = ResourceLoader::create(0, "GET", uri);
DeprecatedString headers;
- Vector<char> data = ServeSynchronousRequest(Cache::loader(), globalDocLoader, job, finalURL, headers);
+ Vector<char> data = ServeSynchronousRequest(Cache::loader(), globalDocLoader, loader.get(), finalURL, headers);
return new OffsetBuffer(data);
}
using namespace WebCore;
IconLoader::IconLoader(Frame* frame)
- : m_resourceLoader(0)
- , m_frame(frame)
+ : m_frame(frame)
, m_httpStatusCode(0)
{
}
IconLoader::~IconLoader()
{
- delete m_resourceLoader;
+ if (m_resourceLoader)
+ m_resourceLoader->kill();
}
void IconLoader::startLoading()
return;
m_httpStatusCode = 0;
- m_resourceLoader = new ResourceLoader(this, "GET", m_frame->iconURL());
+ m_resourceLoader = ResourceLoader::create(this, "GET", m_frame->iconURL());
// A frame may be documentless - one example is viewing a PDF directly
if (!m_frame->document()) {
LOG(IconDatabase, "Documentless-frame - icon won't be loaded");
} else if (!m_resourceLoader->start(m_frame->document()->docLoader())) {
LOG_ERROR("Failed to start load for icon at url %s", m_frame->iconURL().url().ascii());
+ if (m_resourceLoader)
+ m_resourceLoader->kill();
m_resourceLoader = 0;
}
}
void IconLoader::stopLoading()
{
- delete m_resourceLoader;
+ if (m_resourceLoader)
+ m_resourceLoader->kill();
m_resourceLoader = 0;
m_data.clear();
}
void IconLoader::receivedData(ResourceLoader* resourceLoader, const char* data, int size)
{
- ASSERT(resourceLoader = m_resourceLoader);
+ ASSERT(resourceLoader == m_resourceLoader);
ASSERT(data);
ASSERT(size > -1);
void notifyIconChanged(const KURL& iconURL);
- ResourceLoader* m_resourceLoader;
+ RefPtr<ResourceLoader> m_resourceLoader;
Frame* m_frame;
static const int IconLoaderDefaultBuffer = 4096;
Request* req = m_requestsPending.take(0);
KURL u(req->cachedObject()->url().deprecatedString());
- ResourceLoader* job = new ResourceLoader(this, "GET", u);
+ RefPtr<ResourceLoader> loader = ResourceLoader::create(this, "GET", u);
if (!req->cachedObject()->accept().isEmpty())
- job->addMetaData("accept", req->cachedObject()->accept());
+ loader->addMetaData("accept", req->cachedObject()->accept());
if (req->docLoader()) {
KURL r = req->docLoader()->doc()->URL();
if (r.protocol().startsWith("http") && r.path().isEmpty())
r.setPath("/");
- job->addMetaData("referrer", r.url());
+ loader->addMetaData("referrer", r.url());
DeprecatedString domain = r.host();
if (req->docLoader()->doc()->isHTMLDocument())
domain = static_cast<HTMLDocument*>(req->docLoader()->doc())->domain().deprecatedString();
if (crossDomain(u.host(), domain))
- job->addMetaData("cross-domain", "true");
+ loader->addMetaData("cross-domain", "true");
}
- if (job->start(req->docLoader()))
- m_requestsLoading.add(job, req);
+ if (loader->start(req->docLoader()))
+ m_requestsLoading.add(loader.get(), req);
}
void Loader::receivedAllData(ResourceLoader* job, PlatformData allData)
{
}
+PassRefPtr<ResourceLoader> ResourceLoader::create(ResourceLoaderClient* client, const String& method, const KURL& url)
+{
+ return new ResourceLoader(client, method, url);
+}
+
+PassRefPtr<ResourceLoader> ResourceLoader::create(ResourceLoaderClient* client, const String& method, const KURL& url, const FormData& postData)
+{
+ return new ResourceLoader(client, method, url, postData);
+}
+
bool ResourceLoader::isErrorPage() const
{
return d->status != 0;
void ResourceLoader::kill()
{
- delete this;
+ if (d->m_loading){
+ ASSERT(!d->m_cancelled);
+ d->m_loading = false;
+ d->m_cancelled = true;
+ deref();
+ }
}
KURL ResourceLoader::url() const
class KURL;
class ResourceLoaderInternal;
-class ResourceLoader {
-public:
+class ResourceLoader : public Shared<ResourceLoader> {
+private:
ResourceLoader(ResourceLoaderClient*, const String& method, const KURL&);
ResourceLoader(ResourceLoaderClient*, const String& method, const KURL&, const FormData& postData);
+
+public:
+ static PassRefPtr<ResourceLoader> create(ResourceLoaderClient*, const String& method, const KURL&);
+ static PassRefPtr<ResourceLoader> create(ResourceLoaderClient*, const String& method, const KURL&, const FormData& postData);
+
~ResourceLoader();
bool start(DocLoader*);
, method(method)
, assembledResponseHeaders(true)
, retrievedCharset(true)
+ , m_loading(false)
+ , m_cancelled(false)
#if USE(CFNETWORK)
, m_connection(0)
#elif PLATFORM(MAC)
, postData(p)
, assembledResponseHeaders(true)
, retrievedCharset(true)
+ , m_loading(false)
+ , m_cancelled(false)
#if USE(CFNETWORK)
, m_connection(0)
#elif PLATFORM(MAC)
bool assembledResponseHeaders;
bool retrievedCharset;
DeprecatedString responseHeaders;
-
+
+ bool m_loading;
+ bool m_cancelled;
+
#if USE(CFNETWORK)
CFURLConnectionRef m_connection;
#elif PLATFORM(MAC)
bool ResourceLoader::start(DocLoader* docLoader)
{
+ ref();
+ d->m_loading = true;
+
ASSERT(docLoader);
FrameMac* frame = Mac(docLoader->frame());
if (!frame) {
- delete this;
+ kill();
return false;
}
END_BLOCK_OBJC_EXCEPTIONS;
- delete this;
+ kill();
return false;
}
KURL url((const char*)base, (const char*)uri);
xmlFree(base);
KURL finalURL;
- ResourceLoader* job = new ResourceLoader(0, "GET", url);
+ RefPtr<ResourceLoader> loader = ResourceLoader::create(0, "GET", url);
DeprecatedString headers;
xmlGenericErrorFunc oldErrorFunc = xmlGenericError;
void *oldErrorContext = xmlGenericErrorContext;
- Vector<char> data = ServeSynchronousRequest(Cache::loader(), globalDocLoader, job, finalURL, headers);
+ Vector<char> data = ServeSynchronousRequest(Cache::loader(), globalDocLoader, loader.get(), finalURL, headers);
xmlSetGenericErrorFunc(0, parseErrorFunc);
// We don't specify an encoding here. Neither Gecko nor WinIE respects
if (!m_encoding.isValid()) // FIXME: report an error?
m_encoding = UTF8Encoding();
- m_loader = new ResourceLoader(m_async ? this : 0, m_method, m_url, m_encoding.encode(body.characters(), body.length()));
+ m_loader = ResourceLoader::create(m_async ? this : 0, m_method, m_url, m_encoding.encode(body.characters(), body.length()));
} else {
// FIXME: HEAD requests just crash; see <rdar://4460899> and the commented out tests in http/tests/xmlhttprequest/methods.html.
if (m_method == "HEAD")
m_method = "GET";
- m_loader = new ResourceLoader(m_async ? this : 0, m_method, m_url);
+ m_loader = ResourceLoader::create(m_async ? this : 0, m_method, m_url);
}
if (m_requestHeaders.length())
{
// avoid deadlock in case the loader wants to use JS on a background thread
KJS::JSLock::DropAllLocks dropLocks;
- data = ServeSynchronousRequest(Cache::loader(), m_doc->docLoader(), m_loader, finalURL, headers);
+ data = ServeSynchronousRequest(Cache::loader(), m_doc->docLoader(), m_loader.get(), finalURL, headers);
}
m_loader = 0;
bool m_async;
DeprecatedString m_requestHeaders;
- ResourceLoader* m_loader;
+ RefPtr<ResourceLoader> m_loader;
XMLHttpRequestState m_state;