2
* The contents of this file are subject to the Mozilla Public
3
* License Version 1.1 (the "License"); you may not use this file
4
* except in compliance with the License. You may obtain a copy of
5
* the License at http://www.mozilla.org/MPL/
7
* Software distributed under the License is distributed on an "AS
8
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9
* implied. See the License for the specific language governing
10
* rights and limitations under the License.
12
* The Original Code is mozilla.org code.
14
* The Initial Developer of the Original Code is Christopher Blizzard.
15
* Portions created by Christopher Blizzard are Copyright (C)
16
* Christopher Blizzard. All Rights Reserved.
19
* Christopher Blizzard <blizzard@mozilla.org>
22
#include "gtkmozembed.h"
28
// mozilla specific headers
29
#include "nsIDOMKeyEvent.h"
30
#include "nsIDOMMouseEvent.h"
33
#ifdef NS_TRACE_MALLOC
34
#include "nsTraceMalloc.h"
41
typedef struct _TestGtkBrowser {
42
GtkWidget *topLevelWindow;
43
GtkWidget *topLevelVBox;
45
GtkWidget *fileMenuItem;
47
GtkWidget *fileOpenNewBrowser;
48
GtkWidget *fileStream;
51
GtkWidget *toolbarHBox;
53
GtkWidget *backButton;
54
GtkWidget *stopButton;
55
GtkWidget *forwardButton;
56
GtkWidget *reloadButton;
59
GtkWidget *progressAreaHBox;
60
GtkWidget *progressBar;
61
GtkWidget *statusAlign;
63
const char *statusMessage;
70
gboolean locationBarOn;
75
// the list of browser windows currently open
76
GList *browser_list = g_list_alloc();
78
static TestGtkBrowser *new_gtk_browser (guint32 chromeMask);
79
static void set_browser_visibility (TestGtkBrowser *browser,
82
static int num_browsers = 0;
84
// callbacks from the UI
85
static void back_clicked_cb (GtkButton *button,
86
TestGtkBrowser *browser);
87
static void stop_clicked_cb (GtkButton *button,
88
TestGtkBrowser *browser);
89
static void forward_clicked_cb (GtkButton *button,
90
TestGtkBrowser *browser);
91
static void reload_clicked_cb (GtkButton *button,
92
TestGtkBrowser *browser);
93
static void url_activate_cb (GtkEditable *widget,
94
TestGtkBrowser *browser);
95
static void menu_open_new_cb (GtkMenuItem *menuitem,
96
TestGtkBrowser *browser);
97
static void menu_stream_cb (GtkMenuItem *menuitem,
98
TestGtkBrowser *browser);
99
static void menu_close_cb (GtkMenuItem *menuitem,
100
TestGtkBrowser *browser);
101
static void menu_quit_cb (GtkMenuItem *menuitem,
102
TestGtkBrowser *browser);
103
static gboolean delete_cb (GtkWidget *widget, GdkEventAny *event,
104
TestGtkBrowser *browser);
105
static void destroy_cb (GtkWidget *widget,
106
TestGtkBrowser *browser);
108
// callbacks from the widget
109
static void location_changed_cb (GtkMozEmbed *embed, TestGtkBrowser *browser);
110
static void title_changed_cb (GtkMozEmbed *embed, TestGtkBrowser *browser);
111
static void load_started_cb (GtkMozEmbed *embed, TestGtkBrowser *browser);
112
static void load_finished_cb (GtkMozEmbed *embed, TestGtkBrowser *browser);
113
static void net_state_change_cb (GtkMozEmbed *embed, gint flags,
114
guint status, TestGtkBrowser *browser);
115
static void net_state_change_all_cb (GtkMozEmbed *embed, const char *uri,
116
gint flags, guint status,
117
TestGtkBrowser *browser);
118
static void progress_change_cb (GtkMozEmbed *embed, gint cur, gint max,
119
TestGtkBrowser *browser);
120
static void progress_change_all_cb (GtkMozEmbed *embed, const char *uri,
122
TestGtkBrowser *browser);
123
static void link_message_cb (GtkMozEmbed *embed, TestGtkBrowser *browser);
124
static void js_status_cb (GtkMozEmbed *embed, TestGtkBrowser *browser);
125
static void new_window_cb (GtkMozEmbed *embed,
126
GtkMozEmbed **retval, guint chromemask,
127
TestGtkBrowser *browser);
128
static void visibility_cb (GtkMozEmbed *embed,
130
TestGtkBrowser *browser);
131
static void destroy_brsr_cb (GtkMozEmbed *embed, TestGtkBrowser *browser);
132
static gint open_uri_cb (GtkMozEmbed *embed, const char *uri,
133
TestGtkBrowser *browser);
134
static void size_to_cb (GtkMozEmbed *embed, gint width,
135
gint height, TestGtkBrowser *browser);
136
static gint dom_key_down_cb (GtkMozEmbed *embed, nsIDOMKeyEvent *event,
137
TestGtkBrowser *browser);
138
static gint dom_key_press_cb (GtkMozEmbed *embed, nsIDOMKeyEvent *event,
139
TestGtkBrowser *browser);
140
static gint dom_key_up_cb (GtkMozEmbed *embed, nsIDOMKeyEvent *event,
141
TestGtkBrowser *browser);
142
static gint dom_mouse_down_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
143
TestGtkBrowser *browser);
144
static gint dom_mouse_up_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
145
TestGtkBrowser *browser);
146
static gint dom_mouse_click_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
147
TestGtkBrowser *browser);
148
static gint dom_mouse_dbl_click_cb (GtkMozEmbed *embed,
149
nsIDOMMouseEvent *event,
150
TestGtkBrowser *browser);
151
static gint dom_mouse_over_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
152
TestGtkBrowser *browser);
153
static gint dom_mouse_out_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
154
TestGtkBrowser *browser);
156
// callbacks from the singleton object
157
static void new_window_orphan_cb (GtkMozEmbedSingle *embed,
158
GtkMozEmbed **retval, guint chromemask,
161
// some utility functions
162
static void update_status_bar_text (TestGtkBrowser *browser);
163
static void update_temp_message (TestGtkBrowser *browser,
164
const char *message);
165
static void update_nav_buttons (TestGtkBrowser *browser);
168
main(int argc, char **argv)
170
#ifdef NS_TRACE_MALLOC
171
argc = NS_TraceMallocStartupArgs(argc, argv);
175
gtk_init(&argc, &argv);
178
setupProfilingStuff();
183
home_path = PR_GetEnv("HOME");
185
fprintf(stderr, "Failed to get HOME\n");
189
full_path = g_strdup_printf("%s/%s", home_path, ".TestGtkEmbed");
191
gtk_moz_embed_set_profile_path(full_path, "TestGtkEmbed");
193
TestGtkBrowser *browser = new_gtk_browser(GTK_MOZ_EMBED_FLAG_DEFAULTCHROME);
195
// set our minimum size
196
gtk_widget_set_usize(browser->mozEmbed, 400, 400);
198
set_browser_visibility(browser, TRUE);
201
gtk_moz_embed_load_url(GTK_MOZ_EMBED(browser->mozEmbed), argv[1]);
203
// get the singleton object and hook up to its new window callback
204
// so we can create orphaned windows.
206
GtkMozEmbedSingle *single;
208
single = gtk_moz_embed_single_get();
210
fprintf(stderr, "Failed to get singleton embed object!\n");
214
gtk_signal_connect(GTK_OBJECT(single), "new_window_orphan",
215
GTK_SIGNAL_FUNC(new_window_orphan_cb), NULL);
220
static TestGtkBrowser *
221
new_gtk_browser(guint32 chromeMask)
223
guint32 actualChromeMask = chromeMask;
224
TestGtkBrowser *browser = 0;
228
browser = g_new0(TestGtkBrowser, 1);
230
browser_list = g_list_prepend(browser_list, browser);
232
browser->menuBarOn = FALSE;
233
browser->toolBarOn = FALSE;
234
browser->locationBarOn = FALSE;
235
browser->statusBarOn = FALSE;
237
g_print("new_gtk_browser\n");
239
if (chromeMask == GTK_MOZ_EMBED_FLAG_DEFAULTCHROME)
240
actualChromeMask = GTK_MOZ_EMBED_FLAG_ALLCHROME;
242
if (actualChromeMask & GTK_MOZ_EMBED_FLAG_MENUBARON)
244
browser->menuBarOn = TRUE;
245
g_print("\tmenu bar\n");
247
if (actualChromeMask & GTK_MOZ_EMBED_FLAG_TOOLBARON)
249
browser->toolBarOn = TRUE;
250
g_print("\ttool bar\n");
252
if (actualChromeMask & GTK_MOZ_EMBED_FLAG_LOCATIONBARON)
254
browser->locationBarOn = TRUE;
255
g_print("\tlocation bar\n");
257
if (actualChromeMask & GTK_MOZ_EMBED_FLAG_STATUSBARON)
259
browser->statusBarOn = TRUE;
260
g_print("\tstatus bar\n");
263
// create our new toplevel window
264
browser->topLevelWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
266
browser->topLevelVBox = gtk_vbox_new(FALSE, 0);
267
// add it to the toplevel window
268
gtk_container_add(GTK_CONTAINER(browser->topLevelWindow),
269
browser->topLevelVBox);
270
// create our menu bar
271
browser->menuBar = gtk_menu_bar_new();
272
// create the file menu
273
browser->fileMenuItem = gtk_menu_item_new_with_label("File");
274
browser->fileMenu = gtk_menu_new();
275
gtk_menu_item_set_submenu (GTK_MENU_ITEM(browser->fileMenuItem),
278
browser->fileOpenNewBrowser =
279
gtk_menu_item_new_with_label("Open New Browser");
280
gtk_menu_append(GTK_MENU(browser->fileMenu),
281
browser->fileOpenNewBrowser);
283
browser->fileStream =
284
gtk_menu_item_new_with_label("Test Stream");
285
gtk_menu_append(GTK_MENU(browser->fileMenu),
286
browser->fileStream);
289
gtk_menu_item_new_with_label("Close");
290
gtk_menu_append(GTK_MENU(browser->fileMenu),
294
gtk_menu_item_new_with_label("Quit");
295
gtk_menu_append(GTK_MENU(browser->fileMenu),
299
gtk_menu_bar_append(GTK_MENU_BAR(browser->menuBar), browser->fileMenuItem);
301
// add it to the vbox
302
gtk_box_pack_start(GTK_BOX(browser->topLevelVBox),
307
// create the hbox that will contain the toolbar and the url text entry bar
308
browser->toolbarHBox = gtk_hbox_new(FALSE, 0);
309
// add that hbox to the vbox
310
gtk_box_pack_start(GTK_BOX(browser->topLevelVBox),
311
browser->toolbarHBox,
315
// new horiz toolbar with buttons + icons
316
#ifdef MOZ_WIDGET_GTK
317
browser->toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL,
319
#endif /* MOZ_WIDGET_GTK */
321
#ifdef MOZ_WIDGET_GTK2
322
browser->toolbar = gtk_toolbar_new();
323
gtk_toolbar_set_orientation(GTK_TOOLBAR(browser->toolbar),
324
GTK_ORIENTATION_HORIZONTAL);
325
gtk_toolbar_set_style(GTK_TOOLBAR(browser->toolbar),
327
#endif /* MOZ_WIDGET_GTK2 */
329
// add it to the hbox
330
gtk_box_pack_start(GTK_BOX(browser->toolbarHBox), browser->toolbar,
335
browser->backButton =
336
gtk_toolbar_append_item(GTK_TOOLBAR(browser->toolbar),
340
0, // XXX replace with icon
341
GTK_SIGNAL_FUNC(back_clicked_cb),
344
browser->stopButton =
345
gtk_toolbar_append_item(GTK_TOOLBAR(browser->toolbar),
349
0, // XXX replace with icon
350
GTK_SIGNAL_FUNC(stop_clicked_cb),
352
// new forward button
353
browser->forwardButton =
354
gtk_toolbar_append_item(GTK_TOOLBAR(browser->toolbar),
358
0, // XXX replace with icon
359
GTK_SIGNAL_FUNC(forward_clicked_cb),
362
browser->reloadButton =
363
gtk_toolbar_append_item(GTK_TOOLBAR(browser->toolbar),
367
0, // XXX replace with icon
368
GTK_SIGNAL_FUNC(reload_clicked_cb),
370
// create the url text entry
371
browser->urlEntry = gtk_entry_new();
372
// add it to the hbox
373
gtk_box_pack_start(GTK_BOX(browser->toolbarHBox), browser->urlEntry,
377
// create our new gtk moz embed widget
378
browser->mozEmbed = gtk_moz_embed_new();
379
// add it to the toplevel vbox
380
gtk_box_pack_start(GTK_BOX(browser->topLevelVBox), browser->mozEmbed,
384
// create the new hbox for the progress area
385
browser->progressAreaHBox = gtk_hbox_new(FALSE, 0);
386
// add it to the vbox
387
gtk_box_pack_start(GTK_BOX(browser->topLevelVBox), browser->progressAreaHBox,
391
// create our new progress bar
392
browser->progressBar = gtk_progress_bar_new();
393
// add it to the hbox
394
gtk_box_pack_start(GTK_BOX(browser->progressAreaHBox), browser->progressBar,
399
// create our status area and the alignment object that will keep it
401
browser->statusAlign = gtk_alignment_new(0, 0, 1, 1);
402
gtk_widget_set_usize(browser->statusAlign, 1, -1);
403
// create the status bar
404
browser->statusBar = gtk_statusbar_new();
405
gtk_container_add(GTK_CONTAINER(browser->statusAlign), browser->statusBar);
406
// add it to the hbox
407
gtk_box_pack_start(GTK_BOX(browser->progressAreaHBox), browser->statusAlign,
411
// by default none of the buttons are marked as sensitive.
412
gtk_widget_set_sensitive(browser->backButton, FALSE);
413
gtk_widget_set_sensitive(browser->stopButton, FALSE);
414
gtk_widget_set_sensitive(browser->forwardButton, FALSE);
415
gtk_widget_set_sensitive(browser->reloadButton, FALSE);
417
// catch the destruction of the toplevel window
418
gtk_signal_connect(GTK_OBJECT(browser->topLevelWindow), "delete_event",
419
GTK_SIGNAL_FUNC(delete_cb), browser);
421
// hook up the activate signal to the right callback
422
gtk_signal_connect(GTK_OBJECT(browser->urlEntry), "activate",
423
GTK_SIGNAL_FUNC(url_activate_cb), browser);
425
// hook up to the open new browser activation
426
gtk_signal_connect(GTK_OBJECT(browser->fileOpenNewBrowser), "activate",
427
GTK_SIGNAL_FUNC(menu_open_new_cb), browser);
428
// hook up to the stream test
429
gtk_signal_connect(GTK_OBJECT(browser->fileStream), "activate",
430
GTK_SIGNAL_FUNC(menu_stream_cb), browser);
432
gtk_signal_connect(GTK_OBJECT(browser->fileClose), "activate",
433
GTK_SIGNAL_FUNC(menu_close_cb), browser);
434
// quit the application
435
gtk_signal_connect(GTK_OBJECT(browser->fileQuit), "activate",
436
GTK_SIGNAL_FUNC(menu_quit_cb), browser);
438
// hook up the location change to update the urlEntry
439
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "location",
440
GTK_SIGNAL_FUNC(location_changed_cb), browser);
441
// hook up the title change to update the window title
442
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "title",
443
GTK_SIGNAL_FUNC(title_changed_cb), browser);
444
// hook up the start and stop signals
445
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "net_start",
446
GTK_SIGNAL_FUNC(load_started_cb), browser);
447
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "net_stop",
448
GTK_SIGNAL_FUNC(load_finished_cb), browser);
449
// hook up to the change in network status
450
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "net_state",
451
GTK_SIGNAL_FUNC(net_state_change_cb), browser);
452
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "net_state_all",
453
GTK_SIGNAL_FUNC(net_state_change_all_cb), browser);
454
// hookup to changes in progress
455
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "progress",
456
GTK_SIGNAL_FUNC(progress_change_cb), browser);
457
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "progress_all",
458
GTK_SIGNAL_FUNC(progress_change_all_cb), browser);
459
// hookup to changes in over-link message
460
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "link_message",
461
GTK_SIGNAL_FUNC(link_message_cb), browser);
462
// hookup to changes in js status message
463
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "js_status",
464
GTK_SIGNAL_FUNC(js_status_cb), browser);
465
// hookup to see whenever a new window is requested
466
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "new_window",
467
GTK_SIGNAL_FUNC(new_window_cb), browser);
468
// hookup to any requested visibility changes
469
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "visibility",
470
GTK_SIGNAL_FUNC(visibility_cb), browser);
471
// hookup to the signal that says that the browser requested to be
473
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "destroy_browser",
474
GTK_SIGNAL_FUNC(destroy_brsr_cb), browser);
475
// hookup to the signal that is called when someone clicks on a link
477
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "open_uri",
478
GTK_SIGNAL_FUNC(open_uri_cb), browser);
479
// this signal is emitted when there's a request to change the
480
// containing browser window to a certain height, like with width
481
// and height args for a window.open in javascript
482
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "size_to",
483
GTK_SIGNAL_FUNC(size_to_cb), browser);
485
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "dom_key_down",
486
GTK_SIGNAL_FUNC(dom_key_down_cb), browser);
487
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "dom_key_press",
488
GTK_SIGNAL_FUNC(dom_key_press_cb), browser);
489
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "dom_key_up",
490
GTK_SIGNAL_FUNC(dom_key_up_cb), browser);
491
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "dom_mouse_down",
492
GTK_SIGNAL_FUNC(dom_mouse_down_cb), browser);
493
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "dom_mouse_up",
494
GTK_SIGNAL_FUNC(dom_mouse_up_cb), browser);
495
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "dom_mouse_click",
496
GTK_SIGNAL_FUNC(dom_mouse_click_cb), browser);
497
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "dom_mouse_dbl_click",
498
GTK_SIGNAL_FUNC(dom_mouse_dbl_click_cb), browser);
499
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "dom_mouse_over",
500
GTK_SIGNAL_FUNC(dom_mouse_over_cb), browser);
501
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "dom_mouse_out",
502
GTK_SIGNAL_FUNC(dom_mouse_out_cb), browser);
503
// hookup to when the window is destroyed
504
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "destroy",
505
GTK_SIGNAL_FUNC(destroy_cb), browser);
507
// set the chrome type so it's stored in the object
508
gtk_moz_embed_set_chrome_mask(GTK_MOZ_EMBED(browser->mozEmbed),
515
set_browser_visibility (TestGtkBrowser *browser, gboolean visibility)
519
gtk_widget_hide(browser->topLevelWindow);
523
if (browser->menuBarOn)
524
gtk_widget_show_all(browser->menuBar);
526
gtk_widget_hide_all(browser->menuBar);
528
// since they are on the same line here...
529
if (browser->toolBarOn || browser->locationBarOn)
530
gtk_widget_show_all(browser->toolbarHBox);
532
gtk_widget_hide_all(browser->toolbarHBox);
534
if (browser->statusBarOn)
535
gtk_widget_show_all(browser->progressAreaHBox);
537
gtk_widget_hide_all(browser->progressAreaHBox);
539
gtk_widget_show(browser->mozEmbed);
540
gtk_widget_show(browser->topLevelVBox);
541
gtk_widget_show(browser->topLevelWindow);
545
back_clicked_cb (GtkButton *button, TestGtkBrowser *browser)
547
gtk_moz_embed_go_back(GTK_MOZ_EMBED(browser->mozEmbed));
551
stop_clicked_cb (GtkButton *button, TestGtkBrowser *browser)
553
g_print("stop_clicked_cb\n");
554
gtk_moz_embed_stop_load(GTK_MOZ_EMBED(browser->mozEmbed));
558
forward_clicked_cb (GtkButton *button, TestGtkBrowser *browser)
560
g_print("forward_clicked_cb\n");
561
gtk_moz_embed_go_forward(GTK_MOZ_EMBED(browser->mozEmbed));
565
reload_clicked_cb (GtkButton *button, TestGtkBrowser *browser)
567
g_print("reload_clicked_cb\n");
568
GdkModifierType state = (GdkModifierType)0;
570
gdk_window_get_pointer(NULL, &x, &y, &state);
572
gtk_moz_embed_reload(GTK_MOZ_EMBED(browser->mozEmbed),
573
(state & GDK_SHIFT_MASK) ?
574
GTK_MOZ_EMBED_FLAG_RELOADBYPASSCACHE :
575
GTK_MOZ_EMBED_FLAG_RELOADNORMAL);
579
stream_clicked_cb (GtkButton *button, TestGtkBrowser *browser)
584
data2 = " there</html>\n";
585
g_print("stream_clicked_cb\n");
586
gtk_moz_embed_open_stream(GTK_MOZ_EMBED(browser->mozEmbed),
587
"file://", "text/html");
588
gtk_moz_embed_append_data(GTK_MOZ_EMBED(browser->mozEmbed),
590
gtk_moz_embed_append_data(GTK_MOZ_EMBED(browser->mozEmbed),
591
data2, strlen(data2));
592
gtk_moz_embed_close_stream(GTK_MOZ_EMBED(browser->mozEmbed));
596
url_activate_cb (GtkEditable *widget, TestGtkBrowser *browser)
598
gchar *text = gtk_editable_get_chars(widget, 0, -1);
599
g_print("loading url %s\n", text);
600
gtk_moz_embed_load_url(GTK_MOZ_EMBED(browser->mozEmbed), text);
605
menu_open_new_cb (GtkMenuItem *menuitem, TestGtkBrowser *browser)
607
g_print("opening new browser.\n");
608
TestGtkBrowser *newBrowser =
609
new_gtk_browser(GTK_MOZ_EMBED_FLAG_DEFAULTCHROME);
610
gtk_widget_set_usize(newBrowser->mozEmbed, 400, 400);
611
set_browser_visibility(newBrowser, TRUE);
615
menu_stream_cb (GtkMenuItem *menuitem, TestGtkBrowser *browser)
617
g_print("menu_stream_cb\n");
621
data2 = " there</html>\n";
622
g_print("stream_clicked_cb\n");
623
gtk_moz_embed_open_stream(GTK_MOZ_EMBED(browser->mozEmbed),
624
"file://", "text/html");
625
gtk_moz_embed_append_data(GTK_MOZ_EMBED(browser->mozEmbed),
627
gtk_moz_embed_append_data(GTK_MOZ_EMBED(browser->mozEmbed),
628
data2, strlen(data2));
629
gtk_moz_embed_close_stream(GTK_MOZ_EMBED(browser->mozEmbed));
633
menu_close_cb (GtkMenuItem *menuitem, TestGtkBrowser *browser)
635
gtk_widget_destroy(browser->topLevelWindow);
639
menu_quit_cb (GtkMenuItem *menuitem, TestGtkBrowser *browser)
641
TestGtkBrowser *tmpBrowser;
642
GList *tmp_list = browser_list;
643
tmpBrowser = (TestGtkBrowser *)tmp_list->data;
645
tmp_list = tmp_list->next;
646
gtk_widget_destroy(tmpBrowser->topLevelWindow);
647
tmpBrowser = (TestGtkBrowser *)tmp_list->data;
652
delete_cb(GtkWidget *widget, GdkEventAny *event, TestGtkBrowser *browser)
654
g_print("delete_cb\n");
655
gtk_widget_destroy(widget);
660
destroy_cb (GtkWidget *widget, TestGtkBrowser *browser)
663
g_print("destroy_cb\n");
665
tmp_list = g_list_find(browser_list, browser);
666
browser_list = g_list_remove_link(browser_list, tmp_list);
667
if (browser->tempMessage)
668
g_free(browser->tempMessage);
669
if (num_browsers == 0)
674
location_changed_cb (GtkMozEmbed *embed, TestGtkBrowser *browser)
678
g_print("location_changed_cb\n");
679
newLocation = gtk_moz_embed_get_location(embed);
682
gtk_editable_delete_text(GTK_EDITABLE(browser->urlEntry), 0, -1);
683
gtk_editable_insert_text(GTK_EDITABLE(browser->urlEntry),
684
newLocation, strlen(newLocation), &newPosition);
688
g_print("failed to get location!\n");
689
// always make sure to clear the tempMessage. it might have been
690
// set from the link before a click and we wouldn't have gotten the
691
// callback to unset it.
692
update_temp_message(browser, 0);
693
// update the nav buttons on a location change
694
update_nav_buttons(browser);
698
title_changed_cb (GtkMozEmbed *embed, TestGtkBrowser *browser)
701
g_print("title_changed_cb\n");
702
newTitle = gtk_moz_embed_get_title(embed);
705
gtk_window_set_title(GTK_WINDOW(browser->topLevelWindow), newTitle);
712
load_started_cb (GtkMozEmbed *embed, TestGtkBrowser *browser)
714
g_print("load_started_cb\n");
715
gtk_widget_set_sensitive(browser->stopButton, TRUE);
716
gtk_widget_set_sensitive(browser->reloadButton, FALSE);
717
browser->loadPercent = 0;
718
browser->bytesLoaded = 0;
719
browser->maxBytesLoaded = 0;
720
update_status_bar_text(browser);
724
load_finished_cb (GtkMozEmbed *embed, TestGtkBrowser *browser)
726
g_print("load_finished_cb\n");
727
gtk_widget_set_sensitive(browser->stopButton, FALSE);
728
gtk_widget_set_sensitive(browser->reloadButton, TRUE);
729
browser->loadPercent = 0;
730
browser->bytesLoaded = 0;
731
browser->maxBytesLoaded = 0;
732
update_status_bar_text(browser);
733
gtk_progress_set_percentage(GTK_PROGRESS(browser->progressBar), 0);
738
net_state_change_cb (GtkMozEmbed *embed, gint flags, guint status,
739
TestGtkBrowser *browser)
741
g_print("net_state_change_cb %d\n", flags);
742
if (flags & GTK_MOZ_EMBED_FLAG_IS_REQUEST) {
743
if (flags & GTK_MOZ_EMBED_FLAG_REDIRECTING)
744
browser->statusMessage = "Redirecting to site...";
745
else if (flags & GTK_MOZ_EMBED_FLAG_TRANSFERRING)
746
browser->statusMessage = "Transferring data from site...";
747
else if (flags & GTK_MOZ_EMBED_FLAG_NEGOTIATING)
748
browser->statusMessage = "Waiting for authorization...";
751
if (status == GTK_MOZ_EMBED_STATUS_FAILED_DNS)
752
browser->statusMessage = "Site not found.";
753
else if (status == GTK_MOZ_EMBED_STATUS_FAILED_CONNECT)
754
browser->statusMessage = "Failed to connect to site.";
755
else if (status == GTK_MOZ_EMBED_STATUS_FAILED_TIMEOUT)
756
browser->statusMessage = "Failed due to connection timeout.";
757
else if (status == GTK_MOZ_EMBED_STATUS_FAILED_USERCANCELED)
758
browser->statusMessage = "User canceled connecting to site.";
760
if (flags & GTK_MOZ_EMBED_FLAG_IS_DOCUMENT) {
761
if (flags & GTK_MOZ_EMBED_FLAG_START)
762
browser->statusMessage = "Loading site...";
763
else if (flags & GTK_MOZ_EMBED_FLAG_STOP)
764
browser->statusMessage = "Done.";
767
update_status_bar_text(browser);
771
void net_state_change_all_cb (GtkMozEmbed *embed, const char *uri,
772
gint flags, guint status,
773
TestGtkBrowser *browser)
775
// g_print("net_state_change_all_cb %s %d %d\n", uri, flags, status);
778
void progress_change_cb (GtkMozEmbed *embed, gint cur, gint max,
779
TestGtkBrowser *browser)
781
g_print("progress_change_cb cur %d max %d\n", cur, max);
783
// avoid those pesky divide by zero errors
786
gtk_progress_set_activity_mode(GTK_PROGRESS(browser->progressBar), FALSE);
787
browser->loadPercent = 0;
788
browser->bytesLoaded = cur;
789
browser->maxBytesLoaded = 0;
790
update_status_bar_text(browser);
794
browser->bytesLoaded = cur;
795
browser->maxBytesLoaded = max;
797
browser->loadPercent = 100;
799
browser->loadPercent = (cur * 100) / max;
800
update_status_bar_text(browser);
801
gtk_progress_set_percentage(GTK_PROGRESS(browser->progressBar), browser->loadPercent / 100.0);
806
void progress_change_all_cb (GtkMozEmbed *embed, const char *uri,
808
TestGtkBrowser *browser)
810
//g_print("progress_change_all_cb %s cur %d max %d\n", uri, cur, max);
814
link_message_cb (GtkMozEmbed *embed, TestGtkBrowser *browser)
817
g_print("link_message_cb\n");
818
message = gtk_moz_embed_get_link_message(embed);
819
if (!message || !*message)
820
update_temp_message(browser, 0);
822
update_temp_message(browser, message);
828
js_status_cb (GtkMozEmbed *embed, TestGtkBrowser *browser)
831
g_print("js_status_cb\n");
832
message = gtk_moz_embed_get_js_status(embed);
833
if (!message || !*message)
834
update_temp_message(browser, 0);
836
update_temp_message(browser, message);
842
new_window_cb (GtkMozEmbed *embed, GtkMozEmbed **newEmbed, guint chromemask, TestGtkBrowser *browser)
844
g_print("new_window_cb\n");
845
g_print("embed is %p chromemask is %d\n", (void *)embed, chromemask);
846
TestGtkBrowser *newBrowser = new_gtk_browser(chromemask);
847
gtk_widget_set_usize(newBrowser->mozEmbed, 400, 400);
848
*newEmbed = GTK_MOZ_EMBED(newBrowser->mozEmbed);
849
g_print("new browser is %p\n", (void *)*newEmbed);
853
visibility_cb (GtkMozEmbed *embed, gboolean visibility, TestGtkBrowser *browser)
855
g_print("visibility_cb %d\n", visibility);
856
set_browser_visibility(browser, visibility);
860
destroy_brsr_cb (GtkMozEmbed *embed, TestGtkBrowser *browser)
862
g_print("destroy_brsr_cb\n");
863
gtk_widget_destroy(browser->topLevelWindow);
867
open_uri_cb (GtkMozEmbed *embed, const char *uri, TestGtkBrowser *browser)
869
g_print("open_uri_cb %s\n", uri);
871
// interrupt this test load
872
if (!strcmp(uri, "http://people.redhat.com/blizzard/monkeys.txt"))
874
// don't interrupt anything
879
size_to_cb (GtkMozEmbed *embed, gint width, gint height,
880
TestGtkBrowser *browser)
882
g_print("*** size_to_cb %d %d\n", width, height);
883
gtk_widget_set_usize(browser->mozEmbed, width, height);
886
gint dom_key_down_cb (GtkMozEmbed *embed, nsIDOMKeyEvent *event,
887
TestGtkBrowser *browser)
889
PRUint32 keyCode = 0;
890
// g_print("dom_key_down_cb\n");
891
event->GetKeyCode(&keyCode);
892
// g_print("key code is %d\n", keyCode);
896
gint dom_key_press_cb (GtkMozEmbed *embed, nsIDOMKeyEvent *event,
897
TestGtkBrowser *browser)
899
PRUint32 keyCode = 0;
900
// g_print("dom_key_press_cb\n");
901
event->GetCharCode(&keyCode);
902
// g_print("char code is %d\n", keyCode);
906
gint dom_key_up_cb (GtkMozEmbed *embed, nsIDOMKeyEvent *event,
907
TestGtkBrowser *browser)
909
PRUint32 keyCode = 0;
910
// g_print("dom_key_up_cb\n");
911
event->GetKeyCode(&keyCode);
912
// g_print("key code is %d\n", keyCode);
916
gint dom_mouse_down_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
917
TestGtkBrowser *browser)
919
// g_print("dom_mouse_down_cb\n");
923
gint dom_mouse_up_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
924
TestGtkBrowser *browser)
926
// g_print("dom_mouse_up_cb\n");
930
gint dom_mouse_click_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
931
TestGtkBrowser *browser)
933
// g_print("dom_mouse_click_cb\n");
935
event->GetButton(&button);
936
printf("button was %d\n", button);
940
gint dom_mouse_dbl_click_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
941
TestGtkBrowser *browser)
943
// g_print("dom_mouse_dbl_click_cb\n");
947
gint dom_mouse_over_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
948
TestGtkBrowser *browser)
950
//g_print("dom_mouse_over_cb\n");
954
gint dom_mouse_out_cb (GtkMozEmbed *embed, nsIDOMMouseEvent *event,
955
TestGtkBrowser *browser)
957
//g_print("dom_mouse_out_cb\n");
961
void new_window_orphan_cb (GtkMozEmbedSingle *embed,
962
GtkMozEmbed **retval, guint chromemask,
965
g_print("new_window_orphan_cb\n");
966
g_print("chromemask is %d\n", chromemask);
967
TestGtkBrowser *newBrowser = new_gtk_browser(chromemask);
968
*retval = GTK_MOZ_EMBED(newBrowser->mozEmbed);
969
g_print("new browser is %p\n", (void *)*retval);
975
update_status_bar_text(TestGtkBrowser *browser)
979
gtk_statusbar_pop(GTK_STATUSBAR(browser->statusBar), 1);
980
if (browser->tempMessage)
981
gtk_statusbar_push(GTK_STATUSBAR(browser->statusBar), 1, browser->tempMessage);
984
if (browser->loadPercent)
986
g_snprintf(message, 255, "%s (%d%% complete, %d bytes of %d loaded)", browser->statusMessage, browser->loadPercent, browser->bytesLoaded, browser->maxBytesLoaded);
988
else if (browser->bytesLoaded)
990
g_snprintf(message, 255, "%s (%d bytes loaded)", browser->statusMessage, browser->bytesLoaded);
992
else if (browser->statusMessage == NULL)
994
g_snprintf(message, 255, " ");
998
g_snprintf(message, 255, "%s", browser->statusMessage);
1000
gtk_statusbar_push(GTK_STATUSBAR(browser->statusBar), 1, message);
1005
update_temp_message(TestGtkBrowser *browser, const char *message)
1007
if (browser->tempMessage)
1008
g_free(browser->tempMessage);
1010
browser->tempMessage = g_strdup(message);
1012
browser->tempMessage = 0;
1013
// now that we've updated the temp message, redraw the status bar
1014
update_status_bar_text(browser);
1019
update_nav_buttons (TestGtkBrowser *browser)
1021
gboolean can_go_back;
1022
gboolean can_go_forward;
1023
can_go_back = gtk_moz_embed_can_go_back(GTK_MOZ_EMBED(browser->mozEmbed));
1024
can_go_forward = gtk_moz_embed_can_go_forward(GTK_MOZ_EMBED(browser->mozEmbed));
1026
gtk_widget_set_sensitive(browser->backButton, TRUE);
1028
gtk_widget_set_sensitive(browser->backButton, FALSE);
1030
gtk_widget_set_sensitive(browser->forwardButton, TRUE);
1032
gtk_widget_set_sensitive(browser->forwardButton, FALSE);