Changeset 234735 in webkit


Ignore:
Timestamp:
Aug 9, 2018, 2:43:48 PM (7 years ago)
Author:
[email protected]
Message:

WKURLSchemeHandler crashes when sent errors with sync XHR
https://bugs.webkit.org/show_bug.cgi?id=188358

Patch by Alex Christensen <[email protected]> on 2018-08-09
Reviewed by Chris Dumez.

Source/WebKit:

  • UIProcess/WebURLSchemeTask.cpp:

(WebKit::WebURLSchemeTask::didReceiveData):
(WebKit::WebURLSchemeTask::didComplete):

  • UIProcess/WebURLSchemeTask.h:

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm:

(-[SyncErrorScheme webView:startURLSchemeTask:]):
(-[SyncErrorScheme webView:stopURLSchemeTask:]):
(-[SyncErrorScheme webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r234730 r234735  
     12018-08-09  Alex Christensen  <[email protected]>
     2
     3        WKURLSchemeHandler crashes when sent errors with sync XHR
     4        https://bugs.webkit.org/show_bug.cgi?id=188358
     5
     6        Reviewed by Chris Dumez.
     7
     8        * UIProcess/WebURLSchemeTask.cpp:
     9        (WebKit::WebURLSchemeTask::didReceiveData):
     10        (WebKit::WebURLSchemeTask::didComplete):
     11        * UIProcess/WebURLSchemeTask.h:
     12
    1132018-08-09  Sihui Liu  <[email protected]>
    214
  • trunk/Source/WebKit/UIProcess/WebURLSchemeTask.cpp

    r233113 r234735  
    9797}
    9898
    99 auto WebURLSchemeTask::didReceiveData(Ref<SharedBuffer> buffer) -> ExceptionType
     99auto WebURLSchemeTask::didReceiveData(Ref<SharedBuffer>&& buffer) -> ExceptionType
    100100{
    101101    if (m_stopped)
     
    111111
    112112    if (isSync()) {
    113         if (!m_syncData)
    114             m_syncData = SharedBuffer::create();
    115         m_syncData->append(buffer);
     113        if (m_syncData)
     114            m_syncData->append(buffer);
     115        else
     116            m_syncData = WTFMove(buffer);
    116117    }
    117118
     
    134135   
    135136    if (isSync()) {
    136         m_syncCompletionHandler(m_syncResponse, error, IPC::DataReference { (const uint8_t*)m_syncData->data(), m_syncData->size() });
     137        IPC::DataReference data;
     138        if (m_syncData)
     139            data = { reinterpret_cast<const uint8_t*>(m_syncData->data()), m_syncData->size() };
     140        m_syncCompletionHandler(m_syncResponse, error, data);
    137141        m_syncData = nullptr;
    138142    }
  • trunk/Source/WebKit/UIProcess/WebURLSchemeTask.h

    r233113 r234735  
    7171    ExceptionType didPerformRedirection(WebCore::ResourceResponse&&, WebCore::ResourceRequest&&);
    7272    ExceptionType didReceiveResponse(const WebCore::ResourceResponse&);
    73     ExceptionType didReceiveData(Ref<WebCore::SharedBuffer>);
     73    ExceptionType didReceiveData(Ref<WebCore::SharedBuffer>&&);
    7474    ExceptionType didComplete(const WebCore::ResourceError&);
    7575
  • trunk/Tools/ChangeLog

    r234734 r234735  
     12018-08-09  Alex Christensen  <[email protected]>
     2
     3        WKURLSchemeHandler crashes when sent errors with sync XHR
     4        https://bugs.webkit.org/show_bug.cgi?id=188358
     5
     6        Reviewed by Chris Dumez.
     7
     8        * TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm:
     9        (-[SyncErrorScheme webView:startURLSchemeTask:]):
     10        (-[SyncErrorScheme webView:stopURLSchemeTask:]):
     11        (-[SyncErrorScheme webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
     12
    1132018-08-09  Per Arne Vollan  <[email protected]>
    214
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm

    r233113 r234735  
    539539}
    540540
     541@interface SyncErrorScheme : NSObject <WKURLSchemeHandler, WKUIDelegate>
     542@end
     543
     544@implementation SyncErrorScheme
     545
     546- (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)task
     547{
     548    if ([task.request.URL.absoluteString isEqualToString:@"syncerror:///main.html"]) {
     549        static const char* bytes = "<script>var xhr=new XMLHttpRequest();xhr.open('GET','https://trac.webkit.org/subresource',false);try{xhr.send(null);alert('no error')}catch(e){alert(e)}</script>";
     550        [task didReceiveResponse:[[[NSURLResponse alloc] initWithURL:task.request.URL MIMEType:@"text/html" expectedContentLength:strlen(bytes) textEncodingName:nil] autorelease]];
     551        [task didReceiveData:[NSData dataWithBytes:bytes length:strlen(bytes)]];
     552        [task didFinish];
     553    } else {
     554        EXPECT_STREQ(task.request.URL.absoluteString.UTF8String, "syncerror:///subresource");
     555        [task didReceiveResponse:[[[NSURLResponse alloc] init] autorelease]];
     556        [task didFailWithError:[NSError errorWithDomain:@"TestErrorDomain" code:123 userInfo:nil]];
     557    }
     558}
     559
     560- (void)webView:(WKWebView *)webView stopURLSchemeTask:(id <WKURLSchemeTask>)task
     561{
     562}
     563
     564- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
     565{
     566    EXPECT_STREQ(message.UTF8String, "NetworkError:  A network error occurred.");
     567    completionHandler();
     568    done = true;
     569}
     570
     571@end
     572
     573TEST(URLSchemeHandler, SyncXHRError)
     574{
     575    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
     576    auto handler = adoptNS([[SyncErrorScheme alloc] init]);
     577    [webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"syncerror"];
     578    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
     579    [webView setUIDelegate:handler.get()];
     580    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"syncerror:///main.html"]]];
     581    TestWebKitAPI::Util::run(&done);
     582}
     583
     584
    541585#endif // WK_API_ENABLED
    542586
Note: See TracChangeset for help on using the changeset viewer.