Changeset 64496 in webkit


Ignore:
Timestamp:
Aug 2, 2010 2:55:02 PM (14 years ago)
Author:
Martin Robinson
Message:

2010-08-02 Martin Robinson <mrobinson@igalia.com>

Reviewed by Xan Lopez.

[GTK] Create a frame-created signal
https://bugs.webkit.org/show_bug.cgi?id=43284

Add a frame-created signal, which will allow developers to track
the beginning of a frame lifecycle and attach signal handlers to
all new frames.

  • WebCoreSupport/FrameLoaderClientGtk.cpp: (WebKit::FrameLoaderClient::createFrame): Emit the frame-created signal.
  • tests/testwebframe.c: Add a test which verifies that the correct number of frame-created signals is fired when a page with iframes loads. (createFrameSignalTestFrameCreatedCallback): Added. (createFrameSignalTestTimeout): Added. (test_webkit_web_frame_created_signal): Added. (main): Add a reference to the new test.
  • webkit/webkitprivate.h: De-normalize webkit_web_frame_init_with_web_view into the one place that it is used, so that the frame-created signal may be fired there.
  • webkit/webkitwebframe.cpp: Remove webkit_web_frame_init_with_web_view.
  • webkit/webkitwebview.cpp: (webkit_web_view_class_init): Add the frame-created signal declaration.
Location:
trunk/WebKit/gtk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit/gtk/ChangeLog

    r64475 r64496  
     12010-08-02  Martin Robinson  <mrobinson@igalia.com>
     2
     3        Reviewed by Xan Lopez.
     4
     5        [GTK] Create a frame-created signal
     6        https://bugs.webkit.org/show_bug.cgi?id=43284
     7
     8        Add a frame-created signal, which will allow developers to track
     9        the beginning of a frame lifecycle and attach signal handlers to
     10        all new frames.
     11
     12        * WebCoreSupport/FrameLoaderClientGtk.cpp:
     13        (WebKit::FrameLoaderClient::createFrame): Emit the frame-created signal.
     14        * tests/testwebframe.c: Add a test which verifies that the correct number of
     15        frame-created signals is fired when a page with iframes loads.
     16        (createFrameSignalTestFrameCreatedCallback): Added.
     17        (createFrameSignalTestTimeout): Added.
     18        (test_webkit_web_frame_created_signal): Added.
     19        (main): Add a reference to the new test.
     20        * webkit/webkitprivate.h: De-normalize webkit_web_frame_init_with_web_view into
     21        the one place that it is used, so that the frame-created signal may be fired there.
     22        * webkit/webkitwebframe.cpp: Remove webkit_web_frame_init_with_web_view.
     23        * webkit/webkitwebview.cpp:
     24        (webkit_web_view_class_init): Add the frame-created signal declaration.
     25
    1262010-08-02  Mario Sanchez Prada  <msanchez@igalia.com>
    227
  • trunk/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp

    r62002 r64496  
    66 *  Copyright (C) 2009, 2010 Gustavo Noronha Silva <gns@gnome.org>
    77 *  Copyright (C) Research In Motion Limited 2009. All rights reserved.
     8 *  Copyright (C) 2010 Igalia S.L.
    89 *
    910 *  This library is free software; you can redistribute it and/or
     
    473474                                                 const String& referrer, bool allowsScrolling, int marginWidth, int marginHeight)
    474475{
    475     Frame* coreFrame = core(m_frame);
    476 
    477     ASSERT(core(getViewFromFrame(m_frame)) == coreFrame->page());
    478 
    479     RefPtr<Frame> childFrame = webkit_web_frame_init_with_web_view(getViewFromFrame(m_frame), ownerElement);
    480 
    481     coreFrame->tree()->appendChild(childFrame);
    482 
     476    ASSERT(m_frame);
     477    Frame* parentFrame = core(m_frame);
     478    WebKitWebView* webView = getViewFromFrame(m_frame);
     479    WebCore::Page* page = core(webView);
     480    ASSERT(page == parentFrame->page());
     481
     482    WebKitWebFrame* kitFrame = WEBKIT_WEB_FRAME(g_object_new(WEBKIT_TYPE_WEB_FRAME, NULL));
     483    WebKitWebFramePrivate* framePrivate = kitFrame->priv;
     484    framePrivate->webView = webView;
     485
     486    RefPtr<Frame> childFrame = Frame::create(page, ownerElement, new FrameLoaderClient(kitFrame));
     487    framePrivate->coreFrame = childFrame.get();
     488
     489    parentFrame->tree()->appendChild(childFrame);
    483490    childFrame->tree()->setName(name);
    484491    childFrame->init();
     
    494501        return 0;
    495502
     503    g_signal_emit_by_name(webView, "frame-created", kitFrame);
    496504    return childFrame.release();
    497505}
  • trunk/WebKit/gtk/tests/testwebframe.c

    r51825 r64496  
    2828#if GLIB_CHECK_VERSION(2, 16, 0) && GTK_CHECK_VERSION(2, 14, 0)
    2929
     30static int numberOfFramesCreated = 0;
     31
     32static void createFrameSignalTestFrameCreatedCallback(WebKitWebView* webView, WebKitWebFrame* frame, gpointer data)
     33{
     34    numberOfFramesCreated++;
     35}
     36
     37static gboolean createFrameSignalTestTimeout(gpointer data)
     38{
     39    g_assert_cmpint(numberOfFramesCreated, ==, 2);
     40    g_main_loop_quit((GMainLoop*) data);
     41    return FALSE;
     42}
     43
     44static void test_webkit_web_frame_created_signal(void)
     45{
     46    GtkWidget* webView;
     47    GtkWidget* window;
     48    GMainLoop* loop = g_main_loop_new(NULL, TRUE);
     49
     50    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     51
     52    webView = webkit_web_view_new();
     53    g_signal_connect(webView, "frame-created", G_CALLBACK(createFrameSignalTestFrameCreatedCallback), loop);
     54
     55    // We want to ensure that exactly two create-frame signals are
     56    // fired and no more, so we set a timeout here. There does not appear
     57    // to be a simple way via the API to figure out when all frames have
     58    // loaded.
     59    g_timeout_add(500, createFrameSignalTestTimeout, loop);
     60
     61    gtk_container_add(GTK_CONTAINER(window), webView);
     62    gtk_widget_show(window);
     63    gtk_widget_show(webView);
     64
     65    webkit_web_view_load_string(WEBKIT_WEB_VIEW(webView),
     66        "<html><body>Frames!"
     67        "<iframe></iframe>"
     68        "<iframe></iframe>"
     69        "</body></html>",
     70        "text/html", "utf-8", "file://");
     71    g_main_loop_run(loop);
     72}
     73
    3074static void test_webkit_web_frame_create_destroy(void)
    3175{
     
    171215    g_test_bug_base("https://bugs.webkit.org/");
    172216    g_test_add_func("/webkit/webview/create_destroy", test_webkit_web_frame_create_destroy);
     217    g_test_add_func("/webkit/webview/frame-created_signal", test_webkit_web_frame_created_signal);
    173218    g_test_add_func("/webkit/webframe/lifetime", test_webkit_web_frame_lifetime);
    174219    g_test_add_func("/webkit/webview/printing", test_webkit_web_frame_printing);
  • trunk/WebKit/gtk/webkit/webkitprivate.h

    r63058 r64496  
    197197    };
    198198
    199     PassRefPtr<WebCore::Frame>
    200     webkit_web_frame_init_with_web_view(WebKitWebView*, WebCore::HTMLFrameOwnerElement*);
    201 
    202199    void
    203200    webkit_web_frame_core_frame_gone(WebKitWebFrame*);
  • trunk/WebKit/gtk/webkit/webkitwebframe.cpp

    r57986 r64496  
    409409}
    410410
    411 PassRefPtr<Frame> webkit_web_frame_init_with_web_view(WebKitWebView* webView, HTMLFrameOwnerElement* element)
    412 {
    413     WebKitWebFrame* frame = WEBKIT_WEB_FRAME(g_object_new(WEBKIT_TYPE_WEB_FRAME, NULL));
    414     WebKitWebFramePrivate* priv = frame->priv;
    415     WebKitWebViewPrivate* viewPriv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);
    416 
    417     priv->webView = webView;
    418     WebKit::FrameLoaderClient* client = new WebKit::FrameLoaderClient(frame);
    419 
    420     RefPtr<Frame> coreFrame = Frame::create(viewPriv->corePage, element, client);
    421     priv->coreFrame = coreFrame.get();
    422 
    423     return coreFrame.release();
    424 }
    425 
    426411/**
    427412 * webkit_web_frame_get_title:
  • trunk/WebKit/gtk/webkit/webkitwebview.cpp

    r64208 r64496  
    173173    GEOLOCATION_POLICY_DECISION_CANCELLED,
    174174    ONLOAD_EVENT,
     175    FRAME_CREATED,
    175176    LAST_SIGNAL
    176177};
     
    24482449            WEBKIT_TYPE_WEB_FRAME);
    24492450
     2451    /*
     2452     * WebKitWebView::frame-created
     2453     * @web_view: the object which received the signal
     2454     * @web_frame: the #WebKitWebFrame which was just created.
     2455     *
     2456     * Emitted when a WebKitWebView has created a new frame. This signal will
     2457     * be emitted for all sub-frames created during page load. It will not be
     2458     * emitted for the main frame, which originates in the WebKitWebView constructor
     2459     * and may be accessed at any time using webkit_web_view_get_main_frame.
     2460     *
     2461     * Since: 1.3.4
     2462     */
     2463    webkit_web_view_signals[FRAME_CREATED] = g_signal_new("frame-created",
     2464            G_TYPE_FROM_CLASS(webViewClass),
     2465            (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
     2466            0,
     2467            NULL, NULL,
     2468            g_cclosure_marshal_VOID__OBJECT,
     2469            G_TYPE_NONE, 1,
     2470            WEBKIT_TYPE_WEB_FRAME);
    24502471
    24512472    /*
Note: See TracChangeset for help on using the changeset viewer.