Changeset 175618 in webkit


Ignore:
Timestamp:
Nov 5, 2014 2:54:05 AM (9 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Add WebKitWebResource::failed-with-tls-errors signal
https://bugs.webkit.org/show_bug.cgi?id=137862

Reviewed by Gustavo Noronha Silva.

Source/WebKit2:

When a resource load fails due to TLS errors emit WebKitWebResource::failed-with-tls-errors
signal instead of WebKitWebResource::failed so that TLS errors information and certificate
are provided.

  • UIProcess/API/gtk/WebKitInjectedBundleClient.cpp:

(didReceiveWebViewMessageFromInjectedBundle): Check if the error
is a TLS failure to emit failed-with-tls-errors instead of failed.

  • UIProcess/API/gtk/WebKitWebResource.cpp:

(webkit_web_resource_class_init): Add WebKitWebResource::failed-with-tls-errors signal.
(webkitWebResourceFailedWithTLSErrors): Emit failed-with-tls-errors and finish signals.

  • UIProcess/API/gtk/WebKitWebResourcePrivate.h:

Tools:

Add a test case to check that WebKitWebResource::failed-with-tls-errors
is emitted when a subresource load fails due to TLS errors.

  • TestWebKitAPI/Tests/WebKit2Gtk/TestSSL.cpp:

(TLSSubresourceTest::resourceLoadStartedCallback):
(TLSSubresourceTest::TLSSubresourceTest):
(TLSSubresourceTest::subresourceFailedCallback):
(TLSSubresourceTest::subresourceFailedWithTLSErrorsCallback):
(TLSSubresourceTest::subresourceLoadStarted):
(TLSSubresourceTest::subresourceFailedWithTLSErrors):
(TLSSubresourceTest::waitUntilSubresourceLoadFail):
(testSubresourceLoadFailedWithTLSErrors):
(httpsServerCallback):
(httpServerCallback):
(beforeAll):

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r175616 r175618  
     12014-11-05  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add WebKitWebResource::failed-with-tls-errors signal
     4        https://bugs.webkit.org/show_bug.cgi?id=137862
     5
     6        Reviewed by Gustavo Noronha Silva.
     7
     8        When a resource load fails due to TLS errors emit WebKitWebResource::failed-with-tls-errors
     9        signal instead of WebKitWebResource::failed so that TLS errors information and certificate
     10        are provided.
     11
     12        * UIProcess/API/gtk/WebKitInjectedBundleClient.cpp:
     13        (didReceiveWebViewMessageFromInjectedBundle): Check if the error
     14        is a TLS failure to emit failed-with-tls-errors instead of failed.
     15        * UIProcess/API/gtk/WebKitWebResource.cpp:
     16        (webkit_web_resource_class_init): Add WebKitWebResource::failed-with-tls-errors signal.
     17        (webkitWebResourceFailedWithTLSErrors): Emit failed-with-tls-errors and finish signals.
     18        * UIProcess/API/gtk/WebKitWebResourcePrivate.h:
     19
    1202014-11-05  Shivakumar JM  <shiva.jm@samsung.com>
    221
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInjectedBundleClient.cpp

    r164438 r175618  
    9090        GUniquePtr<GError> resourceError(g_error_new_literal(g_quark_from_string(platformError.domain().utf8().data()),
    9191            toWebKitError(platformError.errorCode()), platformError.localizedDescription().utf8().data()));
     92        if (platformError.tlsErrors())
     93            webkitWebResourceFailedWithTLSErrors(resource.get(), static_cast<GTlsCertificateFlags>(platformError.tlsErrors()), platformError.certificate());
     94        else
     95            webkitWebResourceFailed(resource.get(), resourceError.get());
    9296
    93         webkitWebResourceFailed(resource.get(), resourceError.get());
    9497        webkitWebViewRemoveLoadingWebResource(webView, resourceIdentifier->value());
    9598    } else if (g_str_equal(messageName, "DidGetSnapshot")) {
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResource.cpp

    r170633 r175618  
    5454    FINISHED,
    5555    FAILED,
     56    FAILED_WITH_TLS_ERRORS,
    5657
    5758    LAST_SIGNAL
     
    198199                     G_TYPE_NONE, 1,
    199200                     G_TYPE_POINTER);
     201
     202    /**
     203     * WebKitWebResource::failed-with-tls-errors:
     204     * @resource: the #WebKitWebResource
     205     * @certificate: a #GTlsCertificate
     206     * @errors: a #GTlsCertificateFlags with the verification status of @certificate
     207     *
     208     * This signal is emitted when a TLS error occurs during the resource load operation.
     209     *
     210     * Since: 2.8
     211     */
     212    signals[FAILED_WITH_TLS_ERRORS] =
     213        g_signal_new("failed-with-tls-errors",
     214            G_TYPE_FROM_CLASS(objectClass),
     215            G_SIGNAL_RUN_LAST,
     216            0, nullptr, nullptr,
     217            g_cclosure_marshal_generic,
     218            G_TYPE_NONE, 2,
     219            G_TYPE_TLS_CERTIFICATE,
     220            G_TYPE_TLS_CERTIFICATE_FLAGS);
    200221}
    201222
     
    245266    g_signal_emit(resource, signals[FAILED], 0, error);
    246267    g_signal_emit(resource, signals[FINISHED], 0, NULL);
     268}
     269
     270void webkitWebResourceFailedWithTLSErrors(WebKitWebResource* resource, GTlsCertificateFlags tlsErrors, GTlsCertificate* certificate)
     271{
     272    g_signal_emit(resource, signals[FAILED_WITH_TLS_ERRORS], 0, certificate, tlsErrors);
     273    g_signal_emit(resource, signals[FINISHED], 0, nullptr);
    247274}
    248275
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResourcePrivate.h

    r131760 r175618  
    3030void webkitWebResourceFinished(WebKitWebResource*);
    3131void webkitWebResourceFailed(WebKitWebResource*, GError*);
     32void webkitWebResourceFailedWithTLSErrors(WebKitWebResource*, GTlsCertificateFlags, GTlsCertificate*);
    3233WebKit::WebFrameProxy* webkitWebResourceGetFrame(WebKitWebResource*);
    3334
  • trunk/Tools/ChangeLog

    r175613 r175618  
     12014-11-05  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add WebKitWebResource::failed-with-tls-errors signal
     4        https://bugs.webkit.org/show_bug.cgi?id=137862
     5
     6        Reviewed by Gustavo Noronha Silva.
     7
     8        Add a test case to check that WebKitWebResource::failed-with-tls-errors
     9        is emitted when a subresource load fails due to TLS errors.
     10
     11        * TestWebKitAPI/Tests/WebKit2Gtk/TestSSL.cpp:
     12        (TLSSubresourceTest::resourceLoadStartedCallback):
     13        (TLSSubresourceTest::TLSSubresourceTest):
     14        (TLSSubresourceTest::subresourceFailedCallback):
     15        (TLSSubresourceTest::subresourceFailedWithTLSErrorsCallback):
     16        (TLSSubresourceTest::subresourceLoadStarted):
     17        (TLSSubresourceTest::subresourceFailedWithTLSErrors):
     18        (TLSSubresourceTest::waitUntilSubresourceLoadFail):
     19        (testSubresourceLoadFailedWithTLSErrors):
     20        (httpsServerCallback):
     21        (httpServerCallback):
     22        (beforeAll):
     23
    1242014-11-05  Alexey Proskuryakov  <ap@apple.com>
    225
  • trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestSSL.cpp

    r174930 r175618  
    260260}
    261261
     262class TLSSubresourceTest : public WebViewTest {
     263public:
     264    MAKE_GLIB_TEST_FIXTURE(TLSSubresourceTest);
     265
     266    static void resourceLoadStartedCallback(WebKitWebView* webView, WebKitWebResource* resource, WebKitURIRequest* request, TLSSubresourceTest* test)
     267    {
     268        if (webkit_web_view_get_main_resource(test->m_webView) == resource)
     269            return;
     270
     271        // Ignore favicons.
     272        if (g_str_has_suffix(webkit_uri_request_get_uri(request), "favicon.ico"))
     273            return;
     274
     275        test->subresourceLoadStarted(resource);
     276    }
     277
     278    TLSSubresourceTest()
     279        : m_tlsErrors(static_cast<GTlsCertificateFlags>(0))
     280    {
     281        g_signal_connect(m_webView, "resource-load-started", G_CALLBACK(resourceLoadStartedCallback), this);
     282    }
     283
     284    static void subresourceFailedCallback(WebKitWebResource*, GError*)
     285    {
     286        g_assert_not_reached();
     287    }
     288
     289    static void subresourceFailedWithTLSErrorsCallback(WebKitWebResource* resource, GTlsCertificate* certificate, GTlsCertificateFlags tlsErrors, TLSSubresourceTest* test)
     290    {
     291        test->subresourceFailedWithTLSErrors(resource, certificate, tlsErrors);
     292    }
     293
     294    void subresourceLoadStarted(WebKitWebResource* resource)
     295    {
     296        g_signal_connect(resource, "failed", G_CALLBACK(subresourceFailedCallback), nullptr);
     297        g_signal_connect(resource, "failed-with-tls-errors", G_CALLBACK(subresourceFailedWithTLSErrorsCallback), this);
     298    }
     299
     300    void subresourceFailedWithTLSErrors(WebKitWebResource* resource, GTlsCertificate* certificate, GTlsCertificateFlags tlsErrors)
     301    {
     302        m_certificate = certificate;
     303        m_tlsErrors = tlsErrors;
     304        g_main_loop_quit(m_mainLoop);
     305    }
     306
     307    void waitUntilSubresourceLoadFail()
     308    {
     309        g_main_loop_run(m_mainLoop);
     310    }
     311
     312    GRefPtr<GTlsCertificate> m_certificate;
     313    GTlsCertificateFlags m_tlsErrors;
     314};
     315
     316static void testSubresourceLoadFailedWithTLSErrors(TLSSubresourceTest* test, gconstpointer)
     317{
     318    WebKitWebContext* context = webkit_web_view_get_context(test->m_webView);
     319    webkit_web_context_set_tls_errors_policy(context, WEBKIT_TLS_ERRORS_POLICY_FAIL);
     320
     321    test->loadURI(kHttpServer->getURIForPath("/").data());
     322    test->waitUntilSubresourceLoadFail();
     323    g_assert(G_IS_TLS_CERTIFICATE(test->m_certificate.get()));
     324    g_assert_cmpuint(test->m_tlsErrors, ==, G_TLS_CERTIFICATE_UNKNOWN_CA);
     325}
    262326
    263327static void httpsServerCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer)
     
    287351        soup_message_set_status(message, SOUP_STATUS_UNAUTHORIZED);
    288352        soup_message_headers_append(message->response_headers, "WWW-Authenticate", "Basic realm=\"HTTPS auth\"");
     353    } else if (g_str_equal(path, "/style.css")) {
     354        soup_message_set_status(message, SOUP_STATUS_OK);
     355        static const char* styleCSS = "body { color: black; }";
     356        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, styleCSS, strlen(styleCSS));
    289357    } else
    290358        soup_message_set_status(message, SOUP_STATUS_NOT_FOUND);
     
    315383        soup_message_body_append(message->response_body, SOUP_MEMORY_TAKE, contents, length);
    316384        soup_message_set_status(message, SOUP_STATUS_OK);
     385        soup_message_body_complete(message->response_body);
     386    } else if (g_str_equal(path, "/")) {
     387        soup_message_set_status(message, SOUP_STATUS_OK);
     388        char* responseHTML = g_strdup_printf("<html><head><link rel='stylesheet' href='%s' type='text/css'></head><body>SSL subresource test</body></html>",
     389            kHttpsServer->getURIForPath("/style.css").data());
     390        soup_message_body_append(message->response_body, SOUP_MEMORY_TAKE, responseHTML, strlen(responseHTML));
    317391        soup_message_body_complete(message->response_body);
    318392    } else
     
    336410    SSLTest::add("WebKitWebView", "tls-errors-redirect-to-http", testTLSErrorsRedirect);
    337411    SSLTest::add("WebKitWebView", "tls-http-auth", testTLSErrorsHTTPAuth);
     412    TLSSubresourceTest::add("WebKitWebView", "tls-subresource", testSubresourceLoadFailedWithTLSErrors);
    338413    TLSErrorsTest::add("WebKitWebView", "load-failed-with-tls-errors", testLoadFailedWithTLSErrors);
    339414}
Note: See TracChangeset for help on using the changeset viewer.