⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webkitwebview.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        break;    case PROP_CUSTOM_ENCODING:        webkit_web_view_set_custom_encoding(webView, g_value_get_string(value));        break;    default:        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);    }}static bool shouldCoalesce(GdkRectangle rect, GdkRectangle* rects, int count){    const int cRectThreshold = 10;    const float cWastedSpaceThreshold = 0.75f;    bool useUnionedRect = (count <= 1) || (count > cRectThreshold);    if (!useUnionedRect) {        // Attempt to guess whether or not we should use the unioned rect or the individual rects.        // We do this by computing the percentage of "wasted space" in the union.  If that wasted space        // is too large, then we will do individual rect painting instead.        float unionPixels = (rect.width * rect.height);        float singlePixels = 0;        for (int i = 0; i < count; ++i)            singlePixels += rects[i].width * rects[i].height;        float wastedSpace = 1 - (singlePixels / unionPixels);        if (wastedSpace <= cWastedSpaceThreshold)            useUnionedRect = true;    }    return useUnionedRect;}static gboolean webkit_web_view_expose_event(GtkWidget* widget, GdkEventExpose* event){    WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);    WebKitWebViewPrivate* priv = webView->priv;    Frame* frame = core(webView)->mainFrame();    if (frame->contentRenderer() && frame->view()) {        frame->view()->layoutIfNeededRecursive();        cairo_t* cr = gdk_cairo_create(event->window);        GraphicsContext ctx(cr);        cairo_destroy(cr);        ctx.setGdkExposeEvent(event);        GOwnPtr<GdkRectangle> rects;        int rectCount;        gdk_region_get_rectangles(event->region, &rects.outPtr(), &rectCount);        // Avoid recursing into the render tree excessively        bool coalesce = shouldCoalesce(event->area, rects.get(), rectCount);        if (coalesce) {            IntRect rect = event->area;            ctx.clip(rect);            if (priv->transparent)                ctx.clearRect(rect);            frame->view()->paint(&ctx, rect);        } else {            for (int i = 0; i < rectCount; i++) {                IntRect rect = rects.get()[i];                ctx.save();                ctx.clip(rect);                if (priv->transparent)                    ctx.clearRect(rect);                frame->view()->paint(&ctx, rect);                ctx.restore();            }        }    }    return FALSE;}static gboolean webkit_web_view_key_press_event(GtkWidget* widget, GdkEventKey* event){    WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);    Frame* frame = core(webView)->focusController()->focusedOrMainFrame();    PlatformKeyboardEvent keyboardEvent(event);    if (!frame->view())        return FALSE;    if (frame->eventHandler()->keyEvent(keyboardEvent))        return TRUE;    FrameView* view = frame->view();    SelectionController::EAlteration alteration;    if (event->state & GDK_SHIFT_MASK)        alteration = SelectionController::EXTEND;    else        alteration = SelectionController::MOVE;    // TODO: We probably want to use GTK+ key bindings here and perhaps take an    // approach more like the Win and Mac ports for key handling.    switch (event->keyval) {    case GDK_Down:        view->scrollBy(IntSize(0, cScrollbarPixelsPerLineStep));        return TRUE;    case GDK_Up:        view->scrollBy(IntSize(0, -cScrollbarPixelsPerLineStep));        return TRUE;    case GDK_Right:        view->scrollBy(IntSize(cScrollbarPixelsPerLineStep, 0));        return TRUE;    case GDK_Left:        view->scrollBy(IntSize(-cScrollbarPixelsPerLineStep, 0));        return TRUE;    case GDK_Home:        frame->selection()->modify(alteration, SelectionController::BACKWARD, DocumentBoundary, true);        return TRUE;    case GDK_End:        frame->selection()->modify(alteration, SelectionController::FORWARD, DocumentBoundary, true);        return TRUE;    }    /* Chain up to our parent class for binding activation */    return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->key_press_event(widget, event);}static gboolean webkit_web_view_key_release_event(GtkWidget* widget, GdkEventKey* event){    WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);    Frame* frame = core(webView)->focusController()->focusedOrMainFrame();    if (!frame->view())        return FALSE;    PlatformKeyboardEvent keyboardEvent(event);    if (frame->eventHandler()->keyEvent(keyboardEvent))        return TRUE;    /* Chain up to our parent class for binding activation */    return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->key_release_event(widget, event);}static gboolean webkit_web_view_button_press_event(GtkWidget* widget, GdkEventButton* event){    WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);    // FIXME: need to keep track of subframe focus for key events    gtk_widget_grab_focus(widget);    if (event->button == 3)        return webkit_web_view_forward_context_menu_event(webView, PlatformMouseEvent(event));    Frame* frame = core(webView)->mainFrame();    if (!frame->view())        return FALSE;    return frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event));}static gboolean webkit_web_view_button_release_event(GtkWidget* widget, GdkEventButton* event){    WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);    Frame* focusedFrame = core(webView)->focusController()->focusedFrame();    if (focusedFrame && focusedFrame->editor()->canEdit()) {#ifdef MAEMO_CHANGES        WebKitWebViewPrivate* priv = webView->priv;        hildon_gtk_im_context_filter_event(priv->imContext, (GdkEvent*)event);#endif    }    Frame* mainFrame = core(webView)->mainFrame();    if (mainFrame->view())        mainFrame->eventHandler()->handleMouseReleaseEvent(PlatformMouseEvent(event));    /* We always return FALSE here because WebKit can, for the same click, decide     * to not handle press-event but handle release-event, which can totally confuse     * some GTK+ containers when there are no other events in between. This way we     * guarantee that this case never happens, and that if press-event goes through     * release-event also goes through.     */    return FALSE;}static gboolean webkit_web_view_motion_event(GtkWidget* widget, GdkEventMotion* event){    WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);    Frame* frame = core(webView)->mainFrame();    if (!frame->view())        return FALSE;    return frame->eventHandler()->mouseMoved(PlatformMouseEvent(event));}static gboolean webkit_web_view_scroll_event(GtkWidget* widget, GdkEventScroll* event){    WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);    Frame* frame = core(webView)->mainFrame();    if (!frame->view())        return FALSE;    PlatformWheelEvent wheelEvent(event);    return frame->eventHandler()->handleWheelEvent(wheelEvent);}static void webkit_web_view_size_allocate(GtkWidget* widget, GtkAllocation* allocation){    GTK_WIDGET_CLASS(webkit_web_view_parent_class)->size_allocate(widget,allocation);    WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);    Frame* frame = core(webView)->mainFrame();    if (!frame->view())        return;    frame->view()->resize(allocation->width, allocation->height);    frame->view()->forceLayout();    frame->view()->adjustViewSize();}static gboolean webkit_web_view_focus_in_event(GtkWidget* widget, GdkEventFocus* event){    // TODO: Improve focus handling as suggested in    // http://bugs.webkit.org/show_bug.cgi?id=16910    GtkWidget* toplevel = gtk_widget_get_toplevel(widget);    if (GTK_WIDGET_TOPLEVEL(toplevel) && gtk_window_has_toplevel_focus(GTK_WINDOW(toplevel))) {        WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);        Frame* frame = core(webView)->mainFrame();        core(webView)->focusController()->setActive(frame);    }    return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->focus_in_event(widget, event);}static gboolean webkit_web_view_focus_out_event(GtkWidget* widget, GdkEventFocus* event){    WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);    core(webView)->focusController()->setActive(false);    return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->focus_out_event(widget, event);}static void webkit_web_view_realize(GtkWidget* widget){    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);    GdkWindowAttr attributes;    attributes.window_type = GDK_WINDOW_CHILD;    attributes.x = widget->allocation.x;    attributes.y = widget->allocation.y;    attributes.width = widget->allocation.width;    attributes.height = widget->allocation.height;    attributes.wclass = GDK_INPUT_OUTPUT;    attributes.visual = gtk_widget_get_visual (widget);    attributes.colormap = gtk_widget_get_colormap (widget);    attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK                            | GDK_EXPOSURE_MASK                            | GDK_BUTTON_PRESS_MASK                            | GDK_BUTTON_RELEASE_MASK                            | GDK_POINTER_MOTION_MASK                            | GDK_KEY_PRESS_MASK                            | GDK_KEY_RELEASE_MASK                            | GDK_BUTTON_MOTION_MASK                            | GDK_BUTTON1_MOTION_MASK                            | GDK_BUTTON2_MOTION_MASK                            | GDK_BUTTON3_MOTION_MASK;    gint attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;    widget->window = gdk_window_new(gtk_widget_get_parent_window (widget), &attributes, attributes_mask);    gdk_window_set_user_data(widget->window, widget);    widget->style = gtk_style_attach(widget->style, widget->window);    gdk_window_set_background(widget->window, &widget->style->base[GTK_WIDGET_STATE(widget)]);    WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);    WebKitWebViewPrivate* priv = webView->priv;    gtk_im_context_set_client_window(priv->imContext, widget->window);}static void webkit_web_view_set_scroll_adjustments(WebKitWebView* webView, GtkAdjustment* hadj, GtkAdjustment* vadj){    if (!core(webView))        return;    FrameView* view = core(webkit_web_view_get_main_frame(webView))->view();    if (hadj)        g_object_ref(hadj);    if (vadj)        g_object_ref(vadj);    WebKitWebViewPrivate* priv = webView->priv;    if (priv->horizontalAdjustment)        g_object_unref(priv->horizontalAdjustment);    if (priv->verticalAdjustment)        g_object_unref(priv->verticalAdjustment);    priv->horizontalAdjustment = hadj;    priv->verticalAdjustment = vadj;    if (!view)        return;    view->setGtkAdjustments(hadj, vadj);}static void webkit_web_view_container_add(GtkContainer* container, GtkWidget* widget){    WebKitWebView* webView = WEBKIT_WEB_VIEW(container);    WebKitWebViewPrivate* priv = webView->priv;    priv->children.add(widget);    if (GTK_WIDGET_REALIZED(container))        gtk_widget_set_parent_window(widget, GTK_WIDGET(webView)->window);    gtk_widget_set_parent(widget, GTK_WIDGET(container));}static void webkit_web_view_container_remove(GtkContainer* container, GtkWidget* widget){    WebKitWebView* webView = WEBKIT_WEB_VIEW(container);    WebKitWebViewPrivate* priv = webView->priv;    if (priv->children.contains(widget)) {        gtk_widget_unparent(widget);        priv->children.remove(widget);    }}static void webkit_web_view_container_forall(GtkContainer* container, gboolean, GtkCallback callback, gpointer callbackData){    WebKitWebView* webView = WEBKIT_WEB_VIEW(container);    WebKitWebViewPrivate* priv = webView->priv;    HashSet<GtkWidget*> children = priv->children;    HashSet<GtkWidget*>::const_iterator end = children.end();    for (HashSet<GtkWidget*>::const_iterator current = children.begin(); current != end; ++current)        (*callback)(*current, callbackData);}static WebKitWebView* webkit_web_view_real_create_web_view(WebKitWebView*, WebKitWebFrame*){    return 0;}static gboolean webkit_web_view_real_web_view_ready(WebKitWebView*)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -