Changeset 82206 in webkit


Ignore:
Timestamp:
Mar 29, 2011 12:37:30 AM (13 years ago)
Author:
mjs@apple.com
Message:

2011-03-28 Maciej Stachowiak <mjs@apple.com>

Reviewed by Dan Bernstein.

WKPageGetSourceForFrame and WKPageGetContentsAsString should throw an error in case of a race with page loading
https://bugs.webkit.org/show_bug.cgi?id=57305
<rdar://problem/8738060>, <rdar://problem/8780168>

  • UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::close): Clear m_loadDependentStringCallbackIDs (WebKit::WebPageProxy::getSourceForFrame): track the callback as load dependent (WebKit::WebPageProxy::getContentsAsString): ditto (WebKit::WebPageProxy::clearLoadDependentCallbacks): Invalidate all load dependent callbacks (WebKit::WebPageProxy::didCommitLoadForFrame): Call clearLoadDependentCallbacks (WebKit::WebPageProxy::didFailLoadForFrame): ditto (WebKit::WebPageProxy::stringCallback): Remove callback from load dependent set if appropriate (WebKit::WebPageProxy::processDidCrash): Clear m_loadDependentStringCallbackIDs
  • UIProcess/WebPageProxy.h: Add m_loadDependentStringCallbackIDs hash set.
Location:
trunk/Source/WebKit2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r82193 r82206  
     12011-03-28  Maciej Stachowiak  <mjs@apple.com>
     2
     3        Reviewed by Dan Bernstein.
     4
     5        WKPageGetSourceForFrame and WKPageGetContentsAsString should throw an error in case of a race with page loading
     6        https://bugs.webkit.org/show_bug.cgi?id=57305
     7        <rdar://problem/8738060>, <rdar://problem/8780168>
     8
     9        * UIProcess/WebPageProxy.cpp:
     10        (WebKit::WebPageProxy::close): Clear m_loadDependentStringCallbackIDs
     11        (WebKit::WebPageProxy::getSourceForFrame): track the callback as load dependent
     12        (WebKit::WebPageProxy::getContentsAsString): ditto
     13        (WebKit::WebPageProxy::clearLoadDependentCallbacks): Invalidate all load dependent callbacks
     14        (WebKit::WebPageProxy::didCommitLoadForFrame): Call clearLoadDependentCallbacks
     15        (WebKit::WebPageProxy::didFailLoadForFrame): ditto
     16        (WebKit::WebPageProxy::stringCallback): Remove callback from load dependent set if appropriate
     17        (WebKit::WebPageProxy::processDidCrash): Clear m_loadDependentStringCallbackIDs
     18        * UIProcess/WebPageProxy.h: Add m_loadDependentStringCallbackIDs hash set.
     19
    1202011-03-28  Patrick Gansterer  <paroga@webkit.org>
    221
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r82047 r82206  
    324324    invalidateCallbackMap(m_dataCallbacks);
    325325    invalidateCallbackMap(m_stringCallbacks);
     326    m_loadDependentStringCallbackIDs.clear();
    326327    invalidateCallbackMap(m_scriptValueCallbacks);
    327328    invalidateCallbackMap(m_computedPagesCallbacks);
     
    11161117    RefPtr<StringCallback> callback = prpCallback;
    11171118    uint64_t callbackID = callback->callbackID();
     1119    m_loadDependentStringCallbackIDs.add(callbackID);
    11181120    m_stringCallbacks.set(callbackID, callback.get());
    11191121    process()->send(Messages::WebPage::GetSourceForFrame(frame->frameID(), callbackID), m_pageID);
     
    11241126    RefPtr<StringCallback> callback = prpCallback;
    11251127    uint64_t callbackID = callback->callbackID();
     1128    m_loadDependentStringCallbackIDs.add(callbackID);
    11261129    m_stringCallbacks.set(callbackID, callback.get());
    11271130    process()->send(Messages::WebPage::GetContentsAsString(callbackID), m_pageID);
     
    13961399}
    13971400
     1401void WebPageProxy::clearLoadDependentCallbacks()
     1402{
     1403    Vector<uint64_t> callbackIDsCopy;
     1404    copyToVector(m_loadDependentStringCallbackIDs, callbackIDsCopy);
     1405    m_loadDependentStringCallbackIDs.clear();
     1406
     1407    for (size_t i = 0; i < callbackIDsCopy.size(); ++i) {
     1408        RefPtr<StringCallback> callback = m_stringCallbacks.take(callbackIDsCopy[i]);
     1409        if (callback)
     1410            callback->invalidate();
     1411    }
     1412}
     1413
    13981414void WebPageProxy::didCommitLoadForFrame(uint64_t frameID, const String& mimeType, bool frameHasCustomRepresentation, const PlatformCertificateInfo& certificateInfo, CoreIPC::ArgumentDecoder* arguments)
    13991415{
     
    14101426    MESSAGE_CHECK(frame);
    14111427
     1428    clearLoadDependentCallbacks();
     1429
    14121430    frame->didCommitLoad(mimeType, certificateInfo);
    14131431
     
    14571475    WebFrameProxy* frame = process()->webFrame(frameID);
    14581476    MESSAGE_CHECK(frame);
     1477
     1478    clearLoadDependentCallbacks();
    14591479
    14601480    frame->didFailLoad();
     
    24322452    if (!callback) {
    24332453        // FIXME: Log error or assert.
    2434         return;
    2435     }
     2454        // this can validly happen if a load invalidated the callback, though
     2455        return;
     2456    }
     2457
     2458    m_loadDependentStringCallbackIDs.remove(callbackID);
    24362459
    24372460    callback->performCallbackWithReturnValue(resultString.impl());
     
    25562579    invalidateCallbackMap(m_dataCallbacks);
    25572580    invalidateCallbackMap(m_stringCallbacks);
     2581    m_loadDependentStringCallbackIDs.clear();
    25582582    invalidateCallbackMap(m_scriptValueCallbacks);
    25592583    invalidateCallbackMap(m_computedPagesCallbacks);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r82019 r82206  
    657657#endif
    658658
     659    void clearLoadDependentCallbacks();
     660
    659661    PageClient* m_pageClient;
    660662    WebLoaderClient m_loaderClient;
     
    689691    HashMap<uint64_t, RefPtr<DataCallback> > m_dataCallbacks;
    690692    HashMap<uint64_t, RefPtr<StringCallback> > m_stringCallbacks;
     693    HashSet<uint64_t> m_loadDependentStringCallbackIDs;
    691694    HashMap<uint64_t, RefPtr<ScriptValueCallback> > m_scriptValueCallbacks;
    692695    HashMap<uint64_t, RefPtr<ComputedPagesCallback> > m_computedPagesCallbacks;
Note: See TracChangeset for help on using the changeset viewer.