webengine/osswebengine/WebKitTools/GtkLauncher/main.cpp
changeset 0 dd21522fd290
equal deleted inserted replaced
-1:000000000000 0:dd21522fd290
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  
       
    15 *
       
    16 */
       
    17 
       
    18 #include "webkitgtkpage.h"
       
    19 #include "webkitgtkglobal.h"
       
    20 
       
    21 #include <gtk/gtk.h>
       
    22 
       
    23 #include <string.h>
       
    24 
       
    25 static GtkWidget* gURLBarEntry;
       
    26 static GtkWidget* gTopLevelWindow;
       
    27 static GtkStatusbar* gStatusbar;
       
    28 static WebKitPage* gPage;
       
    29 static gchar* gTitle;
       
    30 static gint gProgress;
       
    31 static guint gStatusbarContextId;
       
    32 
       
    33 static bool stringIsEqual(const char* str1, const char* str2)
       
    34 {
       
    35     return 0 == strcmp(str1, str2);
       
    36 }
       
    37 
       
    38 static gchar* autocorrectURL(const gchar* url)
       
    39 {
       
    40     if (strncmp("http://", url, 7) != 0 && strncmp("https://", url, 8) != 0 && strncmp("file://", url, 7) != 0 && strncmp("ftp://", url, 6) != 0) {
       
    41         GString* string = g_string_new("http://");
       
    42         g_string_append(string, url);
       
    43         return g_string_free(string, FALSE);
       
    44     }
       
    45     
       
    46     return g_strdup(url);
       
    47 }
       
    48 
       
    49 static void goToURLBarText(GtkWidget* urlBarEntry)
       
    50 {
       
    51     const gchar* url = gtk_entry_get_text(GTK_ENTRY(urlBarEntry));
       
    52     if (!url || strlen(url) == 0)
       
    53         return;
       
    54 
       
    55     gchar* parsedURL = autocorrectURL(url);
       
    56     webkit_page_open(gPage, parsedURL);
       
    57     g_free(parsedURL);
       
    58 }
       
    59 
       
    60 static void goButtonClickedCallback(GtkWidget*, GtkWidget* entry)
       
    61 {
       
    62     goToURLBarText(entry);
       
    63 }
       
    64 
       
    65 static void urlBarEnterCallback(GtkWidget*, GtkWidget* entry)
       
    66 {
       
    67     goToURLBarText(entry);
       
    68 }
       
    69 
       
    70 static void updateWindowTitle()
       
    71 {
       
    72     GString* string = g_string_new(NULL);
       
    73     g_string_printf(string, "GtkLauncher %s  (%d/100)", gTitle, gProgress);
       
    74     gchar* title = g_string_free(string, FALSE);
       
    75     gtk_window_set_title(GTK_WINDOW(gTopLevelWindow), title);
       
    76     g_free(title);
       
    77 }
       
    78 
       
    79 static void hoveringOverLink(WebKitPage*, const gchar*, const gchar* link, void*)
       
    80 {
       
    81     // underflow is allowed
       
    82     gtk_statusbar_pop(gStatusbar, gStatusbarContextId);
       
    83     if (link)
       
    84         gtk_statusbar_push(gStatusbar, gStatusbarContextId, link);
       
    85 }
       
    86 
       
    87 static void titleChanged(WebKitPage*, const gchar* title, const gchar* url, WebKitPage*)
       
    88 {
       
    89     gtk_entry_set_text(GTK_ENTRY(gURLBarEntry), url);
       
    90 
       
    91     if (gTitle)
       
    92         g_free(gTitle);
       
    93     gTitle = g_strdup(title);
       
    94     updateWindowTitle();
       
    95 }
       
    96 
       
    97 static void progressChanged(WebKitPage*, gint progress, WebKitPage*)
       
    98 {
       
    99     gProgress = progress;
       
   100     updateWindowTitle();
       
   101 }
       
   102 
       
   103 static void frameDestroyCallback(GtkWidget*, gpointer)
       
   104 {
       
   105     gtk_main_quit();
       
   106 }
       
   107 
       
   108 static void menuMainBackCallback(gpointer data)
       
   109 {
       
   110     g_assert(!data);
       
   111     webkit_page_go_backward(gPage);
       
   112 }
       
   113 
       
   114 static void menuMainForwardCallback(gpointer data)
       
   115 {
       
   116     g_assert(!data);
       
   117     webkit_page_go_forward(gPage);
       
   118 }
       
   119 
       
   120 static void menuMainQuitCallback(gpointer)
       
   121 {
       
   122     gtk_main_quit();
       
   123 }
       
   124 
       
   125 int main(int argc, char* argv[]) 
       
   126 {
       
   127     gtk_init(&argc, &argv);
       
   128     webkit_init();
       
   129 
       
   130     gchar* url = "http://www.google.com";
       
   131     bool exitAfterLoading = false;
       
   132     bool dumpRenderTree = false;
       
   133     for (int argPos = 1; argPos < argc; ++argPos) {
       
   134         char *currArg = argv[argPos];
       
   135         if (stringIsEqual(currArg, "-exit-after-loading"))
       
   136             exitAfterLoading = true;
       
   137         else if (stringIsEqual(currArg, "-exitafterloading"))
       
   138             exitAfterLoading = true;
       
   139         else if (stringIsEqual(currArg, "-exitafterload"))
       
   140             exitAfterLoading = true;
       
   141         else if (stringIsEqual(currArg, "-exit-after-load"))
       
   142             exitAfterLoading = true;
       
   143         else if (stringIsEqual(currArg, "-drt"))
       
   144             dumpRenderTree = true;
       
   145         else if (stringIsEqual(currArg, "-dump-render-tree"))
       
   146             dumpRenderTree = true;
       
   147         else if (stringIsEqual(currArg, "-dumprendertree"))
       
   148             dumpRenderTree = true;
       
   149         else
       
   150             url = autocorrectURL(currArg);
       
   151     }
       
   152 
       
   153     GtkWidget* menuMain = gtk_menu_new();
       
   154     GtkWidget* menuMainBack = gtk_menu_item_new_with_label("Back");
       
   155     gtk_menu_shell_append(GTK_MENU_SHELL(menuMain), menuMainBack);
       
   156     g_signal_connect_swapped(G_OBJECT(menuMainBack), "activate", G_CALLBACK(menuMainBackCallback), NULL);
       
   157     gtk_widget_show(menuMainBack);
       
   158 
       
   159     GtkWidget* menuMainForward = gtk_menu_item_new_with_label("Forward");
       
   160     gtk_menu_shell_append(GTK_MENU_SHELL(menuMain), menuMainForward);
       
   161     g_signal_connect_swapped(G_OBJECT(menuMainForward), "activate", G_CALLBACK(menuMainForwardCallback), NULL);
       
   162     gtk_widget_show(menuMainForward);
       
   163 
       
   164     GtkWidget* menuMainQuit = gtk_menu_item_new_with_label("Quit");
       
   165     gtk_menu_shell_append(GTK_MENU_SHELL(menuMain), menuMainQuit);
       
   166     g_signal_connect_swapped(G_OBJECT(menuMainQuit), "activate", G_CALLBACK(menuMainQuitCallback), NULL);
       
   167     gtk_widget_show(menuMainQuit);
       
   168 
       
   169     GtkWidget* menuMainRoot = gtk_menu_item_new_with_label("Main");
       
   170     gtk_widget_show(menuMainRoot);
       
   171     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuMainRoot), menuMain);
       
   172 
       
   173     GtkWidget* menuBar = gtk_menu_bar_new();
       
   174     gtk_menu_shell_append(GTK_MENU_SHELL(menuBar), menuMainRoot);
       
   175 
       
   176     gTopLevelWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
       
   177     gtk_window_set_default_size(GTK_WINDOW(gTopLevelWindow), 800, 600);
       
   178     gtk_widget_set_name(gTopLevelWindow, "GtkLauncher");
       
   179     GtkWidget* vbox = gtk_vbox_new(FALSE, 0);
       
   180     gtk_container_add(GTK_CONTAINER(gTopLevelWindow), vbox);
       
   181     g_signal_connect(G_OBJECT(gTopLevelWindow), "destroy", G_CALLBACK(frameDestroyCallback), NULL);
       
   182 
       
   183     GtkWidget* hbox = gtk_hbox_new(FALSE, 2);
       
   184     gtk_box_pack_start(GTK_BOX(vbox), menuBar, FALSE, FALSE, 0);
       
   185     gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
       
   186 
       
   187     gURLBarEntry = gtk_entry_new();
       
   188     g_signal_connect(G_OBJECT(gURLBarEntry), "activate", G_CALLBACK(urlBarEnterCallback), (gpointer)gURLBarEntry);
       
   189     gtk_box_pack_start(GTK_BOX(hbox), gURLBarEntry, TRUE, TRUE, 0);
       
   190 
       
   191     GtkWidget* urlBarSubmitButton = gtk_button_new_with_label("Go");  
       
   192     gtk_box_pack_start(GTK_BOX(hbox), urlBarSubmitButton, FALSE, FALSE, 0);
       
   193     g_signal_connect(G_OBJECT(urlBarSubmitButton), "clicked", G_CALLBACK(goButtonClickedCallback), (gpointer)gURLBarEntry);
       
   194     gtk_widget_show(vbox);
       
   195 
       
   196     GtkWidget* scrolledWindow = gtk_scrolled_window_new(NULL,NULL);
       
   197     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow),
       
   198                                    GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
       
   199     gPage = WEBKIT_PAGE(webkit_page_new());
       
   200     gtk_container_add(GTK_CONTAINER(scrolledWindow), GTK_WIDGET(gPage));
       
   201     gtk_box_pack_start(GTK_BOX(vbox), scrolledWindow, TRUE, TRUE, 0);
       
   202 
       
   203     gStatusbar = GTK_STATUSBAR(gtk_statusbar_new());
       
   204     gStatusbarContextId = gtk_statusbar_get_context_id(gStatusbar, "Link Hover");
       
   205     gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(gStatusbar), FALSE, FALSE, 0); 
       
   206     
       
   207     g_signal_connect(gPage, "title-changed", G_CALLBACK(titleChanged), gPage);
       
   208     g_signal_connect(gPage, "load-progress-changed", G_CALLBACK(progressChanged), gPage);
       
   209     g_signal_connect(gPage, "hovering-over-link", G_CALLBACK(hoveringOverLink), gPage);
       
   210     webkit_page_open(gPage, url);
       
   211 
       
   212     gtk_widget_show_all(gTopLevelWindow);
       
   213     gtk_main();
       
   214     return 0;
       
   215 }
       
   216