summaryrefslogtreecommitdiff
path: root/Tools/MiniBrowser
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-10-15 16:08:57 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-15 16:08:57 +0200
commit5466563f4b5b6b86523e3f89bb7f77e5b5270c78 (patch)
tree8caccf7cd03a15207cde3ba282c88bf132482a91 /Tools/MiniBrowser
parent33b26980cb24288b5a9f2590ccf32a949281bb79 (diff)
downloadqtwebkit-5466563f4b5b6b86523e3f89bb7f77e5b5270c78.tar.gz
Imported WebKit commit 0dc6cd75e1d4836eaffbb520be96fac4847cc9d2 (http://svn.webkit.org/repository/webkit/trunk@131300)
WebKit update which introduces the QtWebKitWidgets module that contains the WK1 widgets based API. (In fact it renames QtWebKit to QtWebKitWidgets while we're working on completing the entire split as part of https://bugs.webkit.org/show_bug.cgi?id=99314
Diffstat (limited to 'Tools/MiniBrowser')
-rw-r--r--Tools/MiniBrowser/MiniBrowser.xcodeproj/project.pbxproj24
-rw-r--r--Tools/MiniBrowser/efl/CMakeLists.txt9
-rw-r--r--Tools/MiniBrowser/efl/main.c603
-rw-r--r--Tools/MiniBrowser/gtk/BrowserWindow.c37
-rw-r--r--Tools/MiniBrowser/gtk/main.c8
-rw-r--r--Tools/MiniBrowser/mac/AppDelegate.m21
-rw-r--r--Tools/MiniBrowser/mac/BrowserWindowController.h50
-rw-r--r--Tools/MiniBrowser/mac/BrowserWindowController.m762
-rw-r--r--Tools/MiniBrowser/mac/MainMenu.xib279
-rw-r--r--Tools/MiniBrowser/mac/WK1BrowserWindowController.h35
-rw-r--r--Tools/MiniBrowser/mac/WK1BrowserWindowController.m244
-rw-r--r--Tools/MiniBrowser/mac/WK2BrowserWindowController.h36
-rw-r--r--Tools/MiniBrowser/mac/WK2BrowserWindowController.m809
-rw-r--r--Tools/MiniBrowser/qt/MiniBrowser.pro2
-rw-r--r--Tools/MiniBrowser/qt/raw/Target.pri2
15 files changed, 1879 insertions, 1042 deletions
diff --git a/Tools/MiniBrowser/MiniBrowser.xcodeproj/project.pbxproj b/Tools/MiniBrowser/MiniBrowser.xcodeproj/project.pbxproj
index 0e0cc502e..68dadb51d 100644
--- a/Tools/MiniBrowser/MiniBrowser.xcodeproj/project.pbxproj
+++ b/Tools/MiniBrowser/MiniBrowser.xcodeproj/project.pbxproj
@@ -9,12 +9,14 @@
/* Begin PBXBuildFile section */
0F7EB6E3134113C300F4D865 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F7EB6E2134113C300F4D865 /* WebKit.framework */; };
0F7EB879134113F200F4D865 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F7EB6E2134113C300F4D865 /* WebKit.framework */; };
+ 0FE643A1161FA8940059E3FF /* BrowserWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FE643A0161FA8940059E3FF /* BrowserWindowController.m */; };
+ 0FE643A4161FAC660059E3FF /* WK1BrowserWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FE643A3161FAC660059E3FF /* WK1BrowserWindowController.m */; };
256AC3DA0F4B6AC300CF3369 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 256AC3D90F4B6AC300CF3369 /* AppDelegate.m */; };
51E244FA11EFCE07008228D1 /* MBToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 51E244F911EFCE07008228D1 /* MBToolbarItem.m */; };
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
BC20545E11C96C92008F3375 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
BC329487116A92E2008635D0 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BC329486116A92E2008635D0 /* main.m */; };
- BC329498116A941B008635D0 /* BrowserWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC329497116A941B008635D0 /* BrowserWindowController.m */; };
+ BC329498116A941B008635D0 /* WK2BrowserWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC329497116A941B008635D0 /* WK2BrowserWindowController.m */; };
BC72B89511E57E07001EB4EA /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58150DA1D0A300B32029 /* MainMenu.xib */; };
BC72B89611E57E0F001EB4EA /* BrowserWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC3294A2116A9852008635D0 /* BrowserWindow.xib */; };
BC8FB5A8116AA1FE0080D413 /* WebKit2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC8FB5A7116AA1FE0080D413 /* WebKit2.framework */; };
@@ -49,6 +51,10 @@
/* Begin PBXFileReference section */
0F7EB6E2134113C300F4D865 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = WebKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 0FE6439F161FA8940059E3FF /* BrowserWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BrowserWindowController.h; path = mac/BrowserWindowController.h; sourceTree = "<group>"; };
+ 0FE643A0161FA8940059E3FF /* BrowserWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BrowserWindowController.m; path = mac/BrowserWindowController.m; sourceTree = "<group>"; };
+ 0FE643A2161FAC660059E3FF /* WK1BrowserWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WK1BrowserWindowController.h; path = mac/WK1BrowserWindowController.h; sourceTree = "<group>"; };
+ 0FE643A3161FAC660059E3FF /* WK1BrowserWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WK1BrowserWindowController.m; path = mac/WK1BrowserWindowController.m; sourceTree = "<group>"; };
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
1DDD58150DA1D0A300B32029 /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainMenu.xib; path = mac/MainMenu.xib; sourceTree = "<group>"; };
256AC3D80F4B6AC300CF3369 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = mac/AppDelegate.h; sourceTree = "<group>"; };
@@ -60,8 +66,8 @@
51E244F911EFCE07008228D1 /* MBToolbarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBToolbarItem.m; sourceTree = "<group>"; };
8D1107320486CEB800E47090 /* MiniBrowser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MiniBrowser.app; sourceTree = BUILT_PRODUCTS_DIR; };
BC329486116A92E2008635D0 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = mac/main.m; sourceTree = "<group>"; };
- BC329496116A941B008635D0 /* BrowserWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BrowserWindowController.h; path = mac/BrowserWindowController.h; sourceTree = "<group>"; };
- BC329497116A941B008635D0 /* BrowserWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BrowserWindowController.m; path = mac/BrowserWindowController.m; sourceTree = "<group>"; };
+ BC329496116A941B008635D0 /* WK2BrowserWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WK2BrowserWindowController.h; path = mac/WK2BrowserWindowController.h; sourceTree = "<group>"; };
+ BC329497116A941B008635D0 /* WK2BrowserWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WK2BrowserWindowController.m; path = mac/WK2BrowserWindowController.m; sourceTree = "<group>"; };
BC3294A2116A9852008635D0 /* BrowserWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = BrowserWindow.xib; path = mac/BrowserWindow.xib; sourceTree = "<group>"; };
BC72B89711E57E6E001EB4EA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
BC72B89A11E57E8A001EB4EA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = mac/Info.plist; sourceTree = "<group>"; };
@@ -105,8 +111,12 @@
BC329486116A92E2008635D0 /* main.m */,
256AC3D80F4B6AC300CF3369 /* AppDelegate.h */,
256AC3D90F4B6AC300CF3369 /* AppDelegate.m */,
- BC329496116A941B008635D0 /* BrowserWindowController.h */,
- BC329497116A941B008635D0 /* BrowserWindowController.m */,
+ 0FE6439F161FA8940059E3FF /* BrowserWindowController.h */,
+ 0FE643A0161FA8940059E3FF /* BrowserWindowController.m */,
+ 0FE643A2161FAC660059E3FF /* WK1BrowserWindowController.h */,
+ 0FE643A3161FAC660059E3FF /* WK1BrowserWindowController.m */,
+ BC329496116A941B008635D0 /* WK2BrowserWindowController.h */,
+ BC329497116A941B008635D0 /* WK2BrowserWindowController.m */,
51E244F811EFCE07008228D1 /* MBToolbarItem.h */,
51E244F911EFCE07008228D1 /* MBToolbarItem.m */,
);
@@ -285,8 +295,10 @@
files = (
256AC3DA0F4B6AC300CF3369 /* AppDelegate.m in Sources */,
BC329487116A92E2008635D0 /* main.m in Sources */,
- BC329498116A941B008635D0 /* BrowserWindowController.m in Sources */,
+ BC329498116A941B008635D0 /* WK2BrowserWindowController.m in Sources */,
51E244FA11EFCE07008228D1 /* MBToolbarItem.m in Sources */,
+ 0FE643A1161FA8940059E3FF /* BrowserWindowController.m in Sources */,
+ 0FE643A4161FAC660059E3FF /* WK1BrowserWindowController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/Tools/MiniBrowser/efl/CMakeLists.txt b/Tools/MiniBrowser/efl/CMakeLists.txt
index 22295a548..e39d9115c 100644
--- a/Tools/MiniBrowser/efl/CMakeLists.txt
+++ b/Tools/MiniBrowser/efl/CMakeLists.txt
@@ -1,7 +1,6 @@
SET(MiniBrowser_DIR "${TOOLS_DIR}/MiniBrowser/efl")
SET(MiniBrowser_SOURCES
- ${TOOLS_DIR}/EWebLauncher/url_bar.c
${TOOLS_DIR}/EWebLauncher/url_utils.c
${MiniBrowser_DIR}/main.c
)
@@ -12,7 +11,12 @@ SET(MiniBrowser_INCLUDE_DIRECTORIES
${ECORE_EVAS_INCLUDE_DIRS}
${ECORE_FILE_INCLUDE_DIRS}
${EDJE_INCLUDE_DIRS}
+ ${EET_INCLUDE_DIRS}
+ ${DBUS_INCLUDE_DIRS}
+ ${E_DBUS_INCLUDE_DIRS}
+ ${EFREET_INCLUDE_DIRS}
${EINA_INCLUDE_DIRS}
+ ${ELEMENTARY_INCLUDE_DIRS}
${EVAS_INCLUDE_DIRS}
${TOOLS_DIR}/EWebLauncher
${WEBKIT2_DIR}/UIProcess/API/efl
@@ -30,6 +34,7 @@ SET(MiniBrowser_LIBRARIES
${ECORE_FILE_LIBRARIES}
${EDJE_LIBRARIES}
${EINA_LIBRARIES}
+ ${ELEMENTARY_LIBRARIES}
${EVAS_LIBRARIES}
${FONTCONFIG_LIBRARIES}
${LIBSOUP_LIBRARIES}
@@ -53,5 +58,3 @@ INCLUDE_DIRECTORIES(${MiniBrowser_INCLUDE_DIRECTORIES})
ADD_EXECUTABLE(MiniBrowser ${MiniBrowser_SOURCES})
TARGET_LINK_LIBRARIES(MiniBrowser ${MiniBrowser_LIBRARIES})
SET_TARGET_PROPERTIES(MiniBrowser PROPERTIES FOLDER "Tools")
-
-ADD_DEPENDENCIES(MiniBrowser ThemeControl)
diff --git a/Tools/MiniBrowser/efl/main.c b/Tools/MiniBrowser/efl/main.c
index b44e514a1..ee03b8857 100644
--- a/Tools/MiniBrowser/efl/main.c
+++ b/Tools/MiniBrowser/efl/main.c
@@ -18,17 +18,19 @@
*/
#include "EWebKit2.h"
-#include "url_bar.h"
#include "url_utils.h"
#include <Ecore.h>
#include <Ecore_Evas.h>
#include <Eina.h>
+#include <Elementary.h>
#include <Evas.h>
static const int DEFAULT_WIDTH = 800;
static const int DEFAULT_HEIGHT = 600;
static const char DEFAULT_URL[] = "http://www.google.com/";
static const char APP_NAME[] = "EFL MiniBrowser";
+static const int TOOL_BAR_ICON_SIZE = 24;
+static const int TOOL_BAR_BUTTON_SIZE = 32;
#define info(format, args...) \
do { \
@@ -36,16 +38,24 @@ static const char APP_NAME[] = "EFL MiniBrowser";
printf(format, ##args); \
} while (0)
-static int verbose = 0;
+static int verbose = 1;
+static Eina_List *windows = NULL;
+static char *evas_engine_name = NULL;
+static Eina_Bool frame_flattening_enabled = EINA_FALSE;
-typedef struct _MiniBrowser {
- Ecore_Evas *ee;
- Evas *evas;
- Evas_Object *browser;
- Url_Bar *url_bar;
-} MiniBrowser;
+static Ewk_View_Smart_Class* miniBrowserViewSmartClass()
+{
+ static Ewk_View_Smart_Class ewkViewClass = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("MiniBrowser_View");
+ return &ewkViewClass;
+}
-MiniBrowser *browser;
+typedef struct _Browser_Window {
+ Evas_Object *window;
+ Evas_Object *webview;
+ Evas_Object *url_bar;
+ Evas_Object *back_button;
+ Evas_Object *forward_button;
+} Browser_Window;
static const Ecore_Getopt options = {
"MiniBrowser",
@@ -60,6 +70,8 @@ static const Ecore_Getopt options = {
ECORE_GETOPT_CALLBACK_NOARGS
('E', "list-engines", "list ecore-evas engines.",
ecore_getopt_callback_ecore_evas_list_engines, NULL),
+ ECORE_GETOPT_STORE_DEF_BOOL
+ ('f', "flattening", "frame flattening.", EINA_FALSE),
ECORE_GETOPT_VERSION
('V', "version"),
ECORE_GETOPT_COPYRIGHT
@@ -70,30 +82,55 @@ static const Ecore_Getopt options = {
}
};
-static Eina_Bool main_signal_exit(void *data, int ev_type, void *ev)
+static Browser_Window *window_create(const char *url);
+
+static Browser_Window *browser_window_find(Evas_Object *window)
{
- ecore_main_loop_quit();
- return EINA_TRUE;
+ Eina_List *l;
+ void *data;
+
+ if (!window)
+ return NULL;
+
+ EINA_LIST_FOREACH(windows, l, data) {
+ Browser_Window *browser_window = (Browser_Window *)data;
+ if (browser_window->window == window)
+ return browser_window;
+ }
+ return NULL;
}
-static void closeWindow(Ecore_Evas *ee)
+static Browser_Window *browser_view_find(Evas_Object *view)
{
- ecore_main_loop_quit();
+ Eina_List *l;
+ void *data;
+
+ if (!view)
+ return NULL;
+
+ EINA_LIST_FOREACH(windows, l, data) {
+ Browser_Window *browser_window = (Browser_Window *)data;
+ if (browser_window->webview == view)
+ return browser_window;
+ }
+ return NULL;
}
-static void on_ecore_evas_resize(Ecore_Evas *ee)
+static void window_free(Browser_Window *window)
{
- Evas_Object *webview;
- int w, h;
-
- ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
+ evas_object_del(window->webview);
+ /* The elm_win will take care of freeing its children */
+ evas_object_del(window->window);
+ free(window);
+}
- /* Resize URL bar */
- url_bar_width_set(browser->url_bar, w);
+static void window_close(Browser_Window *window)
+{
+ windows = eina_list_remove(windows, window);
+ window_free(window);
- webview = evas_object_name_find(ecore_evas_get(ee), "browser");
- evas_object_move(webview, 0, URL_BAR_HEIGHT);
- evas_object_resize(webview, w, h - URL_BAR_HEIGHT);
+ if (!windows)
+ elm_exit();
}
static void
@@ -106,6 +143,8 @@ on_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
NULL
};
static int currentEncoding = -1;
+ Eina_Bool ctrlPressed = evas_key_modifier_is_set(evas_key_modifier_get(e), "Control");
+
if (!strcmp(ev->key, "F1")) {
info("Back (F1) was pressed\n");
if (!ewk_view_back(obj))
@@ -119,32 +158,53 @@ on_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
info("Set encoding (F3) pressed. New encoding to %s", encodings[currentEncoding]);
ewk_view_setting_encoding_custom_set(obj, encodings[currentEncoding]);
} else if (!strcmp(ev->key, "F5")) {
- info("Reload (F5) was pressed, reloading.\n");
- ewk_view_reload(obj);
+ info("Reload (F5) was pressed, reloading.\n");
+ ewk_view_reload(obj);
} else if (!strcmp(ev->key, "F6")) {
- info("Stop (F6) was pressed, stop loading.\n");
- ewk_view_stop(obj);
+ info("Stop (F6) was pressed, stop loading.\n");
+ ewk_view_stop(obj);
+ } else if (!strcmp(ev->key, "n") && ctrlPressed) {
+ info("Create new window (Ctrl+n) was pressed.\n");
+ Browser_Window *window = window_create(DEFAULT_URL);
+ windows = eina_list_append(windows, window);
+ } else if (!strcmp(ev->key, "i") && ctrlPressed) {
+ info("Show Inspector (Ctrl+i) was pressed.\n");
+ ewk_view_inspector_show(obj);
}
}
static void
-on_mouse_down(void *data, Evas *e, Evas_Object *webview, void *event_info)
+view_focus_set(Browser_Window *window, Eina_Bool focus)
+{
+ /* We steal focus away from elm's focus model and start to do things
+ * manually here, so elm now has no clue what's up. Tell elm that its
+ * toplevel widget is to be unfocused so elm gives up the focus */
+ elm_object_focus_set(elm_object_top_widget_get(window->window), EINA_FALSE);
+ evas_object_focus_set(window->webview, focus);
+}
+
+static void
+on_mouse_down(void *user_data, Evas *e, Evas_Object *webview, void *event_info)
{
+ Browser_Window *window = (Browser_Window *)user_data;
Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info;
+ /* Clear selection from the URL bar */
+ elm_entry_select_none(window->url_bar);
+
if (ev->button == 1)
- evas_object_focus_set(webview, EINA_TRUE);
+ view_focus_set(window, EINA_TRUE);
else if (ev->button == 2)
- evas_object_focus_set(webview, !evas_object_focus_get(webview));
+ view_focus_set(window, !evas_object_focus_get(webview));
}
static void
-title_set(Ecore_Evas *ee, const char *title, int progress)
+title_set(Evas_Object *window, const char *title, int progress)
{
- Eina_Strbuf* buffer;
+ Eina_Strbuf *buffer;
if (!title || !*title) {
- ecore_evas_title_set(ee, APP_NAME);
+ elm_win_title_set(window, APP_NAME);
return;
}
@@ -154,53 +214,119 @@ title_set(Ecore_Evas *ee, const char *title, int progress)
else
eina_strbuf_append_printf(buffer, "%s - %s", title, APP_NAME);
- ecore_evas_title_set(ee, eina_strbuf_string_get(buffer));
+ elm_win_title_set(window, eina_strbuf_string_get(buffer));
eina_strbuf_free(buffer);
}
static void
on_title_changed(void *user_data, Evas_Object *webview, void *event_info)
{
- MiniBrowser *app = (MiniBrowser *)user_data;
+ Browser_Window *window = (Browser_Window *)user_data;
const char *title = (const char *)event_info;
- title_set(app->ee, title, 100);
+ title_set(window->window, title, 100);
}
static void
on_url_changed(void *user_data, Evas_Object *webview, void *event_info)
{
- MiniBrowser *app = (MiniBrowser *)user_data;
- url_bar_url_set(app->url_bar, ewk_view_uri_get(app->browser));
+ Browser_Window *window = (Browser_Window *)user_data;
+ elm_entry_entry_set(window->url_bar, ewk_view_url_get(window->webview));
+}
+
+static void
+on_back_forward_list_changed(void *user_data, Evas_Object *webview, void *event_info)
+{
+ Browser_Window *window = (Browser_Window *)user_data;
+
+ /* Update navigation buttons state */
+ elm_object_disabled_set(window->back_button, !ewk_view_back_possible(webview));
+ elm_object_disabled_set(window->forward_button, !ewk_view_forward_possible(webview));
+}
+
+static void
+on_new_window(void *user_data, Evas_Object *webview, void *event_info)
+{
+ Evas_Object **new_view = (Evas_Object **)event_info;
+ Browser_Window *window = window_create(NULL);
+ *new_view = window->webview;
+ windows = eina_list_append(windows, window);
+}
+
+static void
+on_close_window(void *user_data, Evas_Object *webview, void *event_info)
+{
+ window_close((Browser_Window *)user_data);
}
static void
on_progress(void *user_data, Evas_Object *webview, void *event_info)
{
- MiniBrowser *app = (MiniBrowser *)user_data;
+ Browser_Window *window = (Browser_Window *)user_data;
double progress = *(double *)event_info;
- title_set(app->ee, ewk_view_title_get(app->browser), progress * 100);
+ title_set(window->window, ewk_view_title_get(window->webview), progress * 100);
}
static void
on_error(void *user_data, Evas_Object *webview, void *event_info)
{
Eina_Strbuf* buffer;
- const Ewk_Web_Error *error = (const Ewk_Web_Error *)event_info;
+ const Ewk_Error *error = (const Ewk_Error *)event_info;
+
+ /* This is a cancellation, do not display the error page */
+ if (ewk_error_cancellation_get(error))
+ return;
buffer = eina_strbuf_new();
eina_strbuf_append_printf(buffer, "<html><body><div style=\"color:#ff0000\">ERROR!</div><br><div>Code: %d<br>Description: %s<br>URL: %s</div></body</html>",
- ewk_web_error_code_get(error), ewk_web_error_description_get(error), ewk_web_error_url_get(error));
+ ewk_error_code_get(error), ewk_error_description_get(error), ewk_error_url_get(error));
- ewk_view_html_string_load(webview, eina_strbuf_string_get(buffer), 0, ewk_web_error_url_get(error));
+ ewk_view_html_string_load(webview, eina_strbuf_string_get(buffer), 0, ewk_error_url_get(error));
eina_strbuf_free(buffer);
}
+static void
+on_download_request(void *user_data, Evas_Object *webview, void *event_info)
+{
+ Ewk_Download_Job *download = (Ewk_Download_Job *)event_info;
+
+ // FIXME: The destination folder should be selected by the user but we set it to '/tmp' for now.
+ Eina_Strbuf *destination_path = eina_strbuf_new();
+
+ const char *suggested_name = ewk_download_job_suggested_filename_get(download);
+ if (suggested_name && *suggested_name)
+ eina_strbuf_append_printf(destination_path, "/tmp/%s", suggested_name);
+ else {
+ // Generate a unique file name since no name was suggested.
+ char unique_path[] = "/tmp/downloaded-file.XXXXXX";
+ mktemp(unique_path);
+ eina_strbuf_append(destination_path, unique_path);
+ }
+
+ ewk_download_job_destination_set(download, eina_strbuf_string_get(destination_path));
+ info("Downloading: %s\n", eina_strbuf_string_get(destination_path));
+ eina_strbuf_free(destination_path);
+}
+
+static void
+on_download_finished(void *user_data, Evas_Object *webview, void *event_info)
+{
+ Ewk_Download_Job *download = (Ewk_Download_Job *)event_info;
+ info("Download finished: %s\n", ewk_download_job_destination_get(download));
+}
+
+static void
+on_download_failed(void *user_data, Evas_Object *webview, void *event_info)
+{
+ info("Download failed!\n");
+}
+
static int
quit(Eina_Bool success, const char *msg)
{
ewk_shutdown();
+ elm_shutdown();
if (msg)
fputs(msg, (success) ? stdout : stderr);
@@ -211,57 +337,362 @@ quit(Eina_Bool success, const char *msg)
return EXIT_SUCCESS;
}
-static MiniBrowser *browserCreate(const char *url, const char *engine)
+static void
+on_url_bar_activated(void *user_data, Evas_Object *url_bar, void *event_info)
{
- MiniBrowser *app = malloc(sizeof(MiniBrowser));
+ Browser_Window *app_data = (Browser_Window *)user_data;
- app->ee = ecore_evas_new(engine, 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT, 0);
- if (!app->ee)
- return 0;
+ const char *user_url = elm_entry_entry_get(url_bar);
+ char *url = url_from_user_input(user_url);
+ ewk_view_url_set(app_data->webview, url);
+ free(url);
- ecore_evas_title_set(app->ee, APP_NAME);
- ecore_evas_callback_resize_set(app->ee, on_ecore_evas_resize);
- ecore_evas_borderless_set(app->ee, 0);
- ecore_evas_show(app->ee);
- ecore_evas_callback_delete_request_set(app->ee, closeWindow);
+ /* Give focus back to the view */
+ view_focus_set(app_data, EINA_TRUE);
+}
- app->evas = ecore_evas_get(app->ee);
+static void
+on_url_bar_clicked(void *user_data, Evas_Object *url_bar, void *event_info)
+{
+ Browser_Window *app_data = (Browser_Window *)user_data;
- /* Create webview */
- app->browser = ewk_view_add(app->evas);
- ewk_view_theme_set(app->browser, THEME_DIR"/default.edj");
- evas_object_name_set(app->browser, "browser");
+ /* Grab focus from the view */
+ evas_object_focus_set(app_data->webview, EINA_FALSE);
+ elm_object_focus_set(url_bar, EINA_TRUE);
+}
+
+static void
+on_back_button_clicked(void *user_data, Evas_Object *back_button, void *event_info)
+{
+ Browser_Window *app_data = (Browser_Window *)user_data;
- evas_object_smart_callback_add(app->browser, "load,error", on_error, app);
- evas_object_smart_callback_add(app->browser, "load,progress", on_progress, app);
- evas_object_smart_callback_add(app->browser, "title,changed", on_title_changed, app);
- evas_object_smart_callback_add(app->browser, "uri,changed", on_url_changed, app);
+ ewk_view_back(app_data->webview);
+ /* Update back button state */
+ elm_object_disabled_set(back_button, !ewk_view_back_possible(app_data->webview));
+}
+
+static void
+on_forward_button_clicked(void *user_data, Evas_Object *forward_button, void *event_info)
+{
+ Browser_Window *app_data = (Browser_Window *)user_data;
- evas_object_event_callback_add(app->browser, EVAS_CALLBACK_KEY_DOWN, on_key_down, app);
- evas_object_event_callback_add(app->browser, EVAS_CALLBACK_MOUSE_DOWN, on_mouse_down, app);
+ ewk_view_forward(app_data->webview);
+ /* Update forward button state */
+ elm_object_disabled_set(forward_button, !ewk_view_forward_possible(app_data->webview));
+}
+
+static void
+on_refresh_button_clicked(void *user_data, Evas_Object *refresh_button, void *event_info)
+{
+ Browser_Window *app_data = (Browser_Window *)user_data;
+
+ Evas *evas = evas_object_evas_get(refresh_button);
+ Eina_Bool ctrlPressed = evas_key_modifier_is_set(evas_key_modifier_get(evas), "Control");
+ if (ctrlPressed) {
+ info("Reloading and bypassing cache...\n");
+ ewk_view_reload_bypass_cache(app_data->webview);
+ } else {
+ info("Reloading...\n");
+ ewk_view_reload(app_data->webview);
+ }
+}
- evas_object_size_hint_weight_set(app->browser, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- evas_object_move(app->browser, 0, URL_BAR_HEIGHT);
- evas_object_resize(app->browser, DEFAULT_WIDTH, DEFAULT_HEIGHT - URL_BAR_HEIGHT);
- evas_object_show(app->browser);
- evas_object_focus_set(app->browser, EINA_TRUE);
+static void
+quit_event_loop(void *user_data, Evas_Object *obj, void *event_info)
+{
+ ecore_main_loop_quit();
+}
- app->url_bar = url_bar_add(app->browser, DEFAULT_WIDTH);
+static void
+on_ok_clicked(void *user_data, Evas_Object *obj, void *event_info)
+{
+ Eina_Bool *confirmed = (Eina_Bool *)user_data;
+ *confirmed = EINA_TRUE;
+
+ ecore_main_loop_quit();
+}
+
+static void
+on_javascript_alert(Ewk_View_Smart_Data *smartData, const char *message)
+{
+ Browser_Window *window = browser_view_find(smartData->self);
+
+ Evas_Object *alert_popup = elm_popup_add(window->window);
+ evas_object_size_hint_weight_set(alert_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_text_set(alert_popup, message);
+ elm_object_part_text_set(alert_popup, "title,text", "Alert");
+
+ /* Popup buttons */
+ Evas_Object *button = elm_button_add(alert_popup);
+ elm_object_text_set(button, "OK");
+ elm_object_part_content_set(alert_popup, "button1", button);
+ evas_object_smart_callback_add(button, "clicked", quit_event_loop, NULL);
+ evas_object_show(alert_popup);
+
+ /* Make modal */
+ ecore_main_loop_begin();
+
+ evas_object_del(alert_popup);
+}
+
+static Eina_Bool
+on_javascript_confirm(Ewk_View_Smart_Data *smartData, const char *message)
+{
+ Browser_Window *window = browser_view_find(smartData->self);
+
+ Eina_Bool ok = EINA_FALSE;
+
+ Evas_Object *confirm_popup = elm_popup_add(window->window);
+ evas_object_size_hint_weight_set(confirm_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_text_set(confirm_popup, message);
+ elm_object_part_text_set(confirm_popup, "title,text", "Confirmation");
+
+ /* Popup buttons */
+ Evas_Object *cancel_button = elm_button_add(confirm_popup);
+ elm_object_text_set(cancel_button, "Cancel");
+ elm_object_part_content_set(confirm_popup, "button1", cancel_button);
+ evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL);
+ Evas_Object *ok_button = elm_button_add(confirm_popup);
+ elm_object_text_set(ok_button, "OK");
+ elm_object_part_content_set(confirm_popup, "button2", ok_button);
+ evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok);
+ evas_object_show(confirm_popup);
+
+ /* Make modal */
+ ecore_main_loop_begin();
- ewk_view_uri_set(app->browser, url);
+ evas_object_del(confirm_popup);
- return app;
+ return ok;
}
-int main(int argc, char *argv[])
+static const char *
+on_javascript_prompt(Ewk_View_Smart_Data *smartData, const char *message, const char *default_value)
+{
+ Browser_Window *window = browser_view_find(smartData->self);
+
+ Eina_Bool ok = EINA_FALSE;
+
+ Evas_Object *prompt_popup = elm_popup_add(window->window);
+ evas_object_size_hint_weight_set(prompt_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_part_text_set(prompt_popup, "title,text", "Prompt");
+
+ /* Popup Content */
+ Evas_Object *box = elm_box_add(window->window);
+ elm_box_padding_set(box, 0, 4);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(box);
+
+ Evas_Object *prompt = elm_label_add(window->window);
+ elm_object_text_set(prompt, message);
+ evas_object_size_hint_weight_set(prompt, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(prompt, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(box, prompt);
+ evas_object_show(prompt);
+
+ Evas_Object *entry = elm_entry_add(window->window);
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ elm_entry_text_style_user_push(entry, "DEFAULT='font_size=18'");
+ elm_entry_entry_set(entry, default_value ? default_value : "");
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(box, entry);
+ evas_object_show(entry);
+
+ elm_object_content_set(prompt_popup, box);
+
+ /* Popup buttons */
+ Evas_Object *cancel_button = elm_button_add(prompt_popup);
+ elm_object_text_set(cancel_button, "Cancel");
+ elm_object_part_content_set(prompt_popup, "button1", cancel_button);
+ evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL);
+ Evas_Object *ok_button = elm_button_add(prompt_popup);
+ elm_object_text_set(ok_button, "OK");
+ elm_object_part_content_set(prompt_popup, "button2", ok_button);
+ evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok);
+ evas_object_show(prompt_popup);
+
+ /* Make modal */
+ ecore_main_loop_begin();
+
+ /* The return string need to be stringshared */
+ const char *prompt_text = ok ? eina_stringshare_add(elm_entry_entry_get(entry)) : NULL;
+ evas_object_del(prompt_popup);
+
+ return prompt_text;
+}
+
+static void
+on_home_button_clicked(void *user_data, Evas_Object *home_button, void *event_info)
+{
+ Browser_Window *app_data = (Browser_Window *)user_data;
+
+ ewk_view_url_set(app_data->webview, DEFAULT_URL);
+}
+
+static void
+on_window_deletion(void *user_data, Evas_Object *window, void *event_info)
+{
+ window_close(browser_window_find(window));
+}
+
+static Evas_Object *
+create_toolbar_button(Evas_Object *window, const char *icon_name)
+{
+ Evas_Object *button = elm_button_add(window);
+
+ Evas_Object *icon = elm_icon_add(window);
+ elm_icon_standard_set(icon, icon_name);
+ evas_object_size_hint_max_set(icon, TOOL_BAR_ICON_SIZE, TOOL_BAR_ICON_SIZE);
+ evas_object_color_set(icon, 44, 44, 102, 128);
+ evas_object_show(icon);
+ elm_object_part_content_set(button, "icon", icon);
+ evas_object_size_hint_min_set(button, TOOL_BAR_BUTTON_SIZE, TOOL_BAR_BUTTON_SIZE);
+
+ return button;
+}
+
+static Browser_Window *window_create(const char *url)
+{
+ Browser_Window *app_data = malloc(sizeof(Browser_Window));
+ if (!app_data) {
+ info("ERROR: could not create browser window.\n");
+ return NULL;
+ }
+
+ /* Create window */
+ app_data->window = elm_win_add(NULL, "minibrowser-window", ELM_WIN_BASIC);
+ elm_win_title_set(app_data->window, APP_NAME);
+ evas_object_smart_callback_add(app_data->window, "delete,request", on_window_deletion, &app_data);
+
+ /* Create window background */
+ Evas_Object *bg = elm_bg_add(app_data->window);
+ elm_bg_color_set(bg, 193, 192, 191);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(app_data->window, bg);
+ evas_object_show(bg);
+
+ /* Create vertical layout */
+ Evas_Object *vertical_layout = elm_box_add(app_data->window);
+ elm_box_padding_set(vertical_layout, 0, 2);
+ evas_object_size_hint_weight_set(vertical_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(app_data->window, vertical_layout);
+ evas_object_show(vertical_layout);
+
+ /* Create horizontal layout for top bar */
+ Evas_Object *horizontal_layout = elm_box_add(app_data->window);
+ elm_box_horizontal_set(horizontal_layout, EINA_TRUE);
+ evas_object_size_hint_weight_set(horizontal_layout, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(horizontal_layout, EVAS_HINT_FILL, 0.0);
+ elm_box_pack_end(vertical_layout, horizontal_layout);
+ evas_object_show(horizontal_layout);
+
+ /* Create Back button */
+ app_data->back_button = create_toolbar_button(app_data->window, "arrow_left");
+ evas_object_smart_callback_add(app_data->back_button, "clicked", on_back_button_clicked, app_data);
+ elm_object_disabled_set(app_data->back_button, EINA_TRUE);
+ evas_object_size_hint_weight_set(app_data->back_button, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(app_data->back_button, 0.0, 0.5);
+ elm_box_pack_end(horizontal_layout, app_data->back_button);
+ evas_object_show(app_data->back_button);
+
+ /* Create Forward button */
+ app_data->forward_button = create_toolbar_button(app_data->window, "arrow_right");
+ evas_object_smart_callback_add(app_data->forward_button, "clicked", on_forward_button_clicked, app_data);
+ elm_object_disabled_set(app_data->forward_button, EINA_TRUE);
+ evas_object_size_hint_weight_set(app_data->forward_button, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(app_data->forward_button, 0.0, 0.5);
+ elm_box_pack_end(horizontal_layout, app_data->forward_button);
+ evas_object_show(app_data->forward_button);
+
+ /* Create URL bar */
+ app_data->url_bar = elm_entry_add(app_data->window);
+ elm_entry_scrollable_set(app_data->url_bar, EINA_TRUE);
+ elm_entry_single_line_set(app_data->url_bar, EINA_TRUE);
+ elm_entry_cnp_mode_set(app_data->url_bar, ELM_CNP_MODE_PLAINTEXT);
+ elm_entry_text_style_user_push(app_data->url_bar, "DEFAULT='font_size=18'");
+ evas_object_smart_callback_add(app_data->url_bar, "activated", on_url_bar_activated, app_data);
+ evas_object_smart_callback_add(app_data->url_bar, "clicked", on_url_bar_clicked, app_data);
+ evas_object_size_hint_weight_set(app_data->url_bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(app_data->url_bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(horizontal_layout, app_data->url_bar);
+ evas_object_show(app_data->url_bar);
+
+ /* Create Refresh button */
+ Evas_Object *refresh_button = create_toolbar_button(app_data->window, "refresh");
+ evas_object_smart_callback_add(refresh_button, "clicked", on_refresh_button_clicked, app_data);
+ evas_object_size_hint_weight_set(refresh_button, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(refresh_button, 1.0, 0.5);
+ elm_box_pack_end(horizontal_layout, refresh_button);
+ evas_object_show(refresh_button);
+
+ /* Create Home button */
+ Evas_Object *home_button = create_toolbar_button(app_data->window, "home");
+ evas_object_smart_callback_add(home_button, "clicked", on_home_button_clicked, app_data);
+ evas_object_size_hint_weight_set(home_button, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(home_button, 1.0, 0.5);
+ elm_box_pack_end(horizontal_layout, home_button);
+ evas_object_show(home_button);
+
+ /* Create webview */
+ Ewk_View_Smart_Class *ewkViewClass = miniBrowserViewSmartClass();
+ ewkViewClass->run_javascript_alert = on_javascript_alert;
+ ewkViewClass->run_javascript_confirm = on_javascript_confirm;
+ ewkViewClass->run_javascript_prompt = on_javascript_prompt;
+
+ Evas *evas = evas_object_evas_get(app_data->window);
+ Evas_Smart *smart = evas_smart_class_new(&ewkViewClass->sc);
+ app_data->webview = ewk_view_smart_add(evas, smart, ewk_context_default_get());
+ ewk_view_theme_set(app_data->webview, THEME_DIR "/default.edj");
+
+ Ewk_Settings *settings = ewk_view_settings_get(app_data->webview);
+ ewk_settings_file_access_from_file_urls_allowed_set(settings, EINA_TRUE);
+ ewk_settings_frame_flattening_enabled_set(settings, frame_flattening_enabled);
+ ewk_settings_developer_extras_enabled_set(settings, EINA_TRUE);
+
+ evas_object_smart_callback_add(app_data->webview, "close,window", on_close_window, app_data);
+ evas_object_smart_callback_add(app_data->webview, "create,window", on_new_window, app_data);
+ evas_object_smart_callback_add(app_data->webview, "download,failed", on_download_failed, app_data);
+ evas_object_smart_callback_add(app_data->webview, "download,finished", on_download_finished, app_data);
+ evas_object_smart_callback_add(app_data->webview, "download,request", on_download_request, app_data);
+ evas_object_smart_callback_add(app_data->webview, "load,error", on_error, app_data);
+ evas_object_smart_callback_add(app_data->webview, "load,progress", on_progress, app_data);
+ evas_object_smart_callback_add(app_data->webview, "title,changed", on_title_changed, app_data);
+ evas_object_smart_callback_add(app_data->webview, "url,changed", on_url_changed, app_data);
+ evas_object_smart_callback_add(app_data->webview, "back,forward,list,changed", on_back_forward_list_changed, app_data);
+
+ evas_object_event_callback_add(app_data->webview, EVAS_CALLBACK_KEY_DOWN, on_key_down, app_data);
+ evas_object_event_callback_add(app_data->webview, EVAS_CALLBACK_MOUSE_DOWN, on_mouse_down, app_data);
+
+ evas_object_size_hint_weight_set(app_data->webview, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(app_data->webview, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_pack_end(vertical_layout, app_data->webview);
+ evas_object_show(app_data->webview);
+
+ if (url)
+ ewk_view_url_set(app_data->webview, url);
+
+ evas_object_resize(app_data->window, DEFAULT_WIDTH, DEFAULT_HEIGHT);
+ evas_object_show(app_data->window);
+
+ view_focus_set(app_data, EINA_TRUE);
+
+ return app_data;
+}
+
+EAPI_MAIN int
+elm_main(int argc, char *argv[])
{
int args = 1;
- char *engine = NULL;
unsigned char quitOption = 0;
+ Browser_Window *window;
Ecore_Getopt_Value values[] = {
- ECORE_GETOPT_VALUE_STR(engine),
+ ECORE_GETOPT_VALUE_STR(evas_engine_name),
ECORE_GETOPT_VALUE_BOOL(quitOption),
+ ECORE_GETOPT_VALUE_BOOL(frame_flattening_enabled),
ECORE_GETOPT_VALUE_BOOL(quitOption),
ECORE_GETOPT_VALUE_BOOL(quitOption),
ECORE_GETOPT_VALUE_BOOL(quitOption),
@@ -271,6 +702,8 @@ int main(int argc, char *argv[])
if (!ewk_init())
return EXIT_FAILURE;
+ ewk_view_smart_class_set(miniBrowserViewSmartClass());
+
ecore_app_args_set(argc, (const char **) argv);
args = ecore_getopt_parse(&options, values, argc, argv);
@@ -282,22 +715,18 @@ int main(int argc, char *argv[])
if (args < argc) {
char *url = url_from_user_input(argv[args]);
- browser = browserCreate(url, engine);
+ window = window_create(url);
free(url);
} else
- browser = browserCreate(DEFAULT_URL, engine);
-
- if (!browser)
- return quit(EINA_FALSE, "ERROR: could not create browser.\n");
+ window = window_create(DEFAULT_URL);
- Ecore_Event_Handler *handle = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, main_signal_exit, 0);
+ if (!window)
+ return quit(EINA_FALSE, "ERROR: could not create browser window.\n");
- ecore_main_loop_begin();
+ windows = eina_list_append(windows, window);
- url_bar_del(browser->url_bar);
- ecore_event_handler_del(handle);
- ecore_evas_free(browser->ee);
- free(browser);
+ elm_run();
return quit(EINA_TRUE, NULL);
}
+ELM_MAIN()
diff --git a/Tools/MiniBrowser/gtk/BrowserWindow.c b/Tools/MiniBrowser/gtk/BrowserWindow.c
index 6ed2ff6a2..86b04461d 100644
--- a/Tools/MiniBrowser/gtk/BrowserWindow.c
+++ b/Tools/MiniBrowser/gtk/BrowserWindow.c
@@ -51,6 +51,7 @@ struct _BrowserWindow {
GtkWidget *settingsDialog;
WebKitWebView *webView;
GtkWidget *downloadsBar;
+ GdkPixbuf *favicon;
};
struct _BrowserWindowClass {
@@ -348,6 +349,33 @@ static void webViewZoomLevelChanged(GObject *object, GParamSpec *paramSpec, Brow
browserWindowUpdateZoomActions(window);
}
+static void updateUriEntryIcon(BrowserWindow *window)
+{
+ GtkEntry *entry = GTK_ENTRY(window->uriEntry);
+ if (window->favicon)
+ gtk_entry_set_icon_from_pixbuf(entry, GTK_ENTRY_ICON_PRIMARY, window->favicon);
+ else
+ gtk_entry_set_icon_from_stock(entry, GTK_ENTRY_ICON_PRIMARY, GTK_STOCK_NEW);
+}
+
+static void faviconChanged(GObject *object, GParamSpec *paramSpec, BrowserWindow *window)
+{
+ GdkPixbuf *favicon = NULL;
+ cairo_surface_t *surface = webkit_web_view_get_favicon(window->webView);
+
+ if (surface) {
+ int width = cairo_image_surface_get_width(surface);
+ int height = cairo_image_surface_get_height(surface);
+ favicon = gdk_pixbuf_get_from_surface(surface, 0, 0, width, height);
+ }
+
+ if (window->favicon)
+ g_object_unref(window->favicon);
+ window->favicon = favicon;
+
+ updateUriEntryIcon(window);
+}
+
static void zoomInCallback(BrowserWindow *window)
{
gdouble zoomLevel = webkit_web_view_get_zoom_level(window->webView) * zoomStep;
@@ -362,6 +390,12 @@ static void zoomOutCallback(BrowserWindow *window)
static void browserWindowFinalize(GObject *gObject)
{
+ BrowserWindow *window = BROWSER_WINDOW(gObject);
+ if (window->favicon) {
+ g_object_unref(window->favicon);
+ window->favicon = NULL;
+ }
+
G_OBJECT_CLASS(browser_window_parent_class)->finalize(gObject);
if (g_atomic_int_dec_and_test(&windowCount))
@@ -403,6 +437,8 @@ static void browser_window_init(BrowserWindow *window)
window->uriEntry = gtk_entry_new();
g_signal_connect_swapped(window->uriEntry, "activate", G_CALLBACK(activateUriEntryCallback), (gpointer)window);
+ gtk_entry_set_icon_activatable(GTK_ENTRY(window->uriEntry), GTK_ENTRY_ICON_PRIMARY, FALSE);
+ updateUriEntryIcon(window);
GtkWidget *toolbar = gtk_toolbar_new();
window->toolbar = toolbar;
@@ -476,6 +512,7 @@ static void browserWindowConstructed(GObject *gObject)
g_signal_connect(window->webView, "permission-request", G_CALLBACK(webViewDecidePermissionRequest), window);
g_signal_connect(window->webView, "mouse-target-changed", G_CALLBACK(webViewMouseTargetChanged), window);
g_signal_connect(window->webView, "notify::zoom-level", G_CALLBACK(webViewZoomLevelChanged), window);
+ g_signal_connect(window->webView, "notify::favicon", G_CALLBACK(faviconChanged), window);
g_signal_connect(webkit_web_view_get_context(window->webView), "download-started", G_CALLBACK(downloadStarted), window);
diff --git a/Tools/MiniBrowser/gtk/main.c b/Tools/MiniBrowser/gtk/main.c
index 988e39696..c7367df9c 100644
--- a/Tools/MiniBrowser/gtk/main.c
+++ b/Tools/MiniBrowser/gtk/main.c
@@ -207,6 +207,7 @@ int main(int argc, char *argv[])
g_option_context_add_group(context, gtk_get_option_group(TRUE));
WebKitSettings *webkitSettings = webkit_settings_new();
+ webkit_settings_set_enable_developer_extras(webkitSettings, TRUE);
if (!addSettingsGroupToContext(context, webkitSettings)) {
g_object_unref(webkitSettings);
webkitSettings = 0;
@@ -222,6 +223,13 @@ int main(int argc, char *argv[])
}
g_option_context_free (context);
+#ifdef WEBKIT_EXEC_PATH
+ g_setenv("WEBKIT_INSPECTOR_PATH", WEBKIT_EXEC_PATH "resources/inspector", FALSE);
+#endif /* WEBKIT_EXEC_PATH */
+
+ // Enable the favicon database, by specifying the default directory.
+ webkit_web_context_set_favicon_database_directory(webkit_web_context_get_default(), NULL);
+
if (uriArguments) {
int i;
diff --git a/Tools/MiniBrowser/mac/AppDelegate.m b/Tools/MiniBrowser/mac/AppDelegate.m
index 285736175..3bde3d1f5 100644
--- a/Tools/MiniBrowser/mac/AppDelegate.m
+++ b/Tools/MiniBrowser/mac/AppDelegate.m
@@ -25,7 +25,8 @@
#import "AppDelegate.h"
-#import "BrowserWindowController.h"
+#import "WK1BrowserWindowController.h"
+#import "WK2BrowserWindowController.h"
#import <WebKit2/WKContextPrivate.h>
#import <WebKit2/WKStringCF.h>
@@ -33,6 +34,11 @@
static NSString *defaultURL = @"http://www.webkit.org/";
+enum {
+ WebKit1NewWindowTag = 1,
+ WebKit2NewWindowTag = 2
+};
+
@implementation BrowserAppDelegate
void didReceiveMessageFromInjectedBundle(WKContextRef context, WKStringRef messageName, WKTypeRef messageBody, const void *clientInfo)
@@ -152,7 +158,16 @@ static void populateVisitedLinks(WKContextRef context, const void *clientInfo)
- (IBAction)newWindow:(id)sender
{
- BrowserWindowController *controller = [[BrowserWindowController alloc] initWithContext:_processContext pageGroup:_pageGroup];
+ BrowserWindowController *controller = nil;
+
+ if (![sender respondsToSelector:@selector(tag)] || [sender tag] == WebKit1NewWindowTag)
+ controller = [[WK1BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"];
+ else if ([sender tag] == WebKit2NewWindowTag)
+ controller = [[WK2BrowserWindowController alloc] initWithContext:_processContext pageGroup:_pageGroup];
+
+ if (!controller)
+ return;
+
[[controller window] makeKeyAndOrderFront:sender];
[_browserWindows addObject:[controller window]];
@@ -217,7 +232,7 @@ static void populateVisitedLinks(WKContextRef context, const void *clientInfo)
BrowserWindowController *controller = [self frontmostBrowserWindowController];
if (!controller) {
- controller = [[BrowserWindowController alloc] initWithContext:_processContext pageGroup:_pageGroup];
+ controller = [[WK2BrowserWindowController alloc] initWithContext:_processContext pageGroup:_pageGroup]; // FIXME: add a way to open in WK1 also.
[[controller window] makeKeyAndOrderFront:self];
}
diff --git a/Tools/MiniBrowser/mac/BrowserWindowController.h b/Tools/MiniBrowser/mac/BrowserWindowController.h
index 84c9f0afe..7ee89197b 100644
--- a/Tools/MiniBrowser/mac/BrowserWindowController.h
+++ b/Tools/MiniBrowser/mac/BrowserWindowController.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -23,22 +23,10 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-@interface BrowserWindowController : NSWindowController {
- IBOutlet NSProgressIndicator *progressIndicator;
- IBOutlet NSButton *reloadButton;
- IBOutlet NSButton *backButton;
- IBOutlet NSButton *forwardButton;
- IBOutlet NSToolbar *toolbar;
- IBOutlet NSTextField *urlText;
- IBOutlet NSView *containerView;
-
- IBOutlet NSWindow *findPanelWindow;
-
- WKContextRef _context;
- WKPageGroupRef _pageGroup;
- WKView *_webView;
- BOOL _zoomTextOnly;
-}
+#import <Cocoa/Cocoa.h>
+
+@protocol BrowserController
+
- (IBAction)fetch:(id)sender;
- (IBAction)reload:(id)sender;
- (IBAction)forceRepaint:(id)sender;
@@ -48,10 +36,6 @@
- (IBAction)showHideWebView:(id)sender;
- (IBAction)removeReinsertWebView:(id)sender;
-- (id)initWithContext:(WKContextRef)context pageGroup:(WKPageGroupRef)pageGroup;
-- (void)loadURLString:(NSString *)urlString;
-- (void)applicationTerminating;
-
- (IBAction)zoomIn:(id)sender;
- (IBAction)zoomOut:(id)sender;
- (IBAction)resetZoom:(id)sender;
@@ -67,3 +51,27 @@
- (IBAction)find:(id)sender;
@end
+
+@interface BrowserWindowController : NSWindowController {
+ IBOutlet NSProgressIndicator *progressIndicator;
+ IBOutlet NSButton *reloadButton;
+ IBOutlet NSButton *backButton;
+ IBOutlet NSButton *forwardButton;
+ IBOutlet NSToolbar *toolbar;
+ IBOutlet NSTextField *urlText;
+ IBOutlet NSView *containerView;
+
+ IBOutlet NSWindow *findPanelWindow;
+
+ BOOL _zoomTextOnly;
+}
+
+- (void)loadURLString:(NSString *)urlString;
+- (NSString *)addProtocolIfNecessary:(NSString *)address;
+
+- (void)applicationTerminating;
+
+- (IBAction)openLocation:(id)sender;
+
+@end
+
diff --git a/Tools/MiniBrowser/mac/BrowserWindowController.m b/Tools/MiniBrowser/mac/BrowserWindowController.m
index 0adb7e2d2..ba38d2563 100644
--- a/Tools/MiniBrowser/mac/BrowserWindowController.m
+++ b/Tools/MiniBrowser/mac/BrowserWindowController.m
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -25,779 +25,45 @@
#import "BrowserWindowController.h"
-#import "AppDelegate.h"
-#import <WebKit2/WKPagePrivate.h>
-#import <WebKit2/WKStringCF.h>
-#import <WebKit2/WKURLCF.h>
-#import <WebKit2/WKViewPrivate.h>
-
@interface BrowserWindowController ()
-- (void)didStartProgress;
-- (void)didChangeProgress:(double)value;
-- (void)didFinishProgress;
-- (void)didStartProvisionalLoadForFrame:(WKFrameRef)frame;
-- (void)didCommitLoadForFrame:(WKFrameRef)frame;
-- (void)didReceiveServerRedirectForProvisionalLoadForFrame:(WKFrameRef)frame;
-- (void)didFailProvisionalLoadWithErrorForFrame:(WKFrameRef)frame;
-- (void)didFailLoadWithErrorForFrame:(WKFrameRef)frame;
-- (void)didSameDocumentNavigationForFrame:(WKFrameRef)frame;
-- (BOOL)isPaginated;
+
@end
@implementation BrowserWindowController
-- (id)initWithContext:(WKContextRef)context pageGroup:(WKPageGroupRef)pageGroup
+- (id)initWithWindow:(NSWindow *)window
{
- if ((self = [super initWithWindowNibName:@"BrowserWindow"])) {
- _context = WKRetain(context);
- _pageGroup = WKRetain(pageGroup);
- _zoomTextOnly = NO;
+ self = [super initWithWindow:window];
+ if (self) {
}
return self;
}
-- (void)dealloc
-{
- WKRelease(_context);
- WKRelease(_pageGroup);
- [_webView release];
-
- [super dealloc];
-}
-
-- (IBAction)fetch:(id)sender
-{
- CFURLRef cfURL = CFURLCreateWithString(0, (CFStringRef)[urlText stringValue], 0);
- if (!cfURL)
- return;
-
- WKURLRef url = WKURLCreateWithCFURL(cfURL);
- CFRelease(cfURL);
-
- WKPageLoadURL(_webView.pageRef, url);
- WKRelease(url);
-}
-
-- (IBAction)showHideWebView:(id)sender
-{
- BOOL hidden = ![_webView isHidden];
-
- [_webView setHidden:hidden];
-}
-
-- (IBAction)removeReinsertWebView:(id)sender
-{
- if ([_webView window]) {
- [_webView retain];
- [_webView removeFromSuperview];
- } else {
- [containerView addSubview:_webView];
- [_webView release];
- }
-}
-
-- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
-{
- SEL action = [menuItem action];
-
- if (action == @selector(zoomIn:))
- return [self canZoomIn];
- if (action == @selector(zoomOut:))
- return [self canZoomOut];
- if (action == @selector(resetZoom:))
- return [self canResetZoom];
-
- if (action == @selector(showHideWebView:))
- [menuItem setTitle:[_webView isHidden] ? @"Show Web View" : @"Hide Web View"];
- else if (action == @selector(removeReinsertWebView:))
- [menuItem setTitle:[_webView window] ? @"Remove Web View" : @"Insert Web View"];
- else if (action == @selector(toggleZoomMode:))
- [menuItem setState:_zoomTextOnly ? NSOnState : NSOffState];
- else if ([menuItem action] == @selector(togglePaginationMode:))
- [menuItem setState:[self isPaginated] ? NSOnState : NSOffState];
-
- return YES;
-}
-
-- (IBAction)reload:(id)sender
-{
- WKPageReload(_webView.pageRef);
-}
-
-- (IBAction)forceRepaint:(id)sender
-{
- [_webView setNeedsDisplay:YES];
-}
-
-- (IBAction)goBack:(id)sender
-{
- WKPageGoBack(_webView.pageRef);
-}
-
-- (IBAction)goForward:(id)sender
-{
- WKPageGoForward(_webView.pageRef);
-}
-
-- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
-{
- SEL action = [item action];
-
- if (action == @selector(goBack:))
- return _webView && WKPageCanGoBack(_webView.pageRef);
-
- if (action == @selector(goForward:))
- return _webView && WKPageCanGoForward(_webView.pageRef);
-
- return YES;
-}
-
-- (void)validateToolbar
-{
- [toolbar validateVisibleItems];
-}
-
-- (BOOL)windowShouldClose:(id)sender
-{
- LOG(@"windowShouldClose");
- BOOL canCloseImmediately = WKPageTryClose(_webView.pageRef);
- return canCloseImmediately;
-}
-
-- (void)windowWillClose:(NSNotification *)notification
-{
- [(BrowserAppDelegate *)[NSApp delegate] browserWindowWillClose:[self window]];
- [self autorelease];
-}
-
-- (void)applicationTerminating
-{
- // FIXME: Why are we bothering to close the page? This doesn't even prevent LEAK output.
- WKPageClose(_webView.pageRef);
-}
-
-#define DefaultMinimumZoomFactor (.5)
-#define DefaultMaximumZoomFactor (3.0)
-#define DefaultZoomFactorRatio (1.2)
-
-- (double)currentZoomFactor
-{
- return _zoomTextOnly ? WKPageGetTextZoomFactor(_webView.pageRef) : WKPageGetPageZoomFactor(_webView.pageRef);
-}
-
-- (void)setCurrentZoomFactor:(double)factor
-{
- _zoomTextOnly ? WKPageSetTextZoomFactor(_webView.pageRef, factor) : WKPageSetPageZoomFactor(_webView.pageRef, factor);
-}
-
-- (BOOL)canZoomIn
-{
- return [self currentZoomFactor] * DefaultZoomFactorRatio < DefaultMaximumZoomFactor;
-}
-
-- (void)zoomIn:(id)sender
-{
- if (![self canZoomIn])
- return;
-
- double factor = [self currentZoomFactor] * DefaultZoomFactorRatio;
- [self setCurrentZoomFactor:factor];
-}
-
-- (BOOL)canZoomOut
-{
- return [self currentZoomFactor] / DefaultZoomFactorRatio > DefaultMinimumZoomFactor;
-}
-
-- (void)zoomOut:(id)sender
-{
- if (![self canZoomIn])
- return;
-
- double factor = [self currentZoomFactor] / DefaultZoomFactorRatio;
- [self setCurrentZoomFactor:factor];
-}
-
-- (BOOL)canResetZoom
-{
- return _zoomTextOnly ? (WKPageGetTextZoomFactor(_webView.pageRef) != 1) : (WKPageGetPageZoomFactor(_webView.pageRef) != 1);
-}
-
-- (void)resetZoom:(id)sender
-{
- if (![self canResetZoom])
- return;
-
- if (_zoomTextOnly)
- WKPageSetTextZoomFactor(_webView.pageRef, 1);
- else
- WKPageSetPageZoomFactor(_webView.pageRef, 1);
-}
-
-- (IBAction)toggleZoomMode:(id)sender
-{
- if (_zoomTextOnly) {
- _zoomTextOnly = NO;
- double currentTextZoom = WKPageGetTextZoomFactor(_webView.pageRef);
- WKPageSetPageAndTextZoomFactors(_webView.pageRef, currentTextZoom, 1);
- } else {
- _zoomTextOnly = YES;
- double currentPageZoom = WKPageGetPageZoomFactor(_webView.pageRef);
- WKPageSetPageAndTextZoomFactors(_webView.pageRef, 1, currentPageZoom);
- }
-}
-
-- (BOOL)isPaginated
-{
- return WKPageGetPaginationMode(_webView.pageRef) != kWKPaginationModeUnpaginated;
-}
-
-- (IBAction)togglePaginationMode:(id)sender
-{
- if ([self isPaginated])
- WKPageSetPaginationMode(_webView.pageRef, kWKPaginationModeUnpaginated);
- else {
- WKPageSetPaginationMode(_webView.pageRef, kWKPaginationModeLeftToRight);
- WKPageSetPageLength(_webView.pageRef, _webView.bounds.size.width / 2);
- WKPageSetGapBetweenPages(_webView.pageRef, 10);
- }
-}
-
-- (IBAction)dumpSourceToConsole:(id)sender
-{
- WKPageGetSourceForFrame_b(_webView.pageRef, WKPageGetMainFrame(_webView.pageRef), ^(WKStringRef result, WKErrorRef error) {
- CFStringRef cfResult = WKStringCopyCFString(0, result);
- LOG(@"Main frame source\n \"%@\"", (NSString *)cfResult);
- CFRelease(cfResult);
- });
-}
-
-// MARK: Loader Client Callbacks
-
-static void didStartProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- [(BrowserWindowController *)clientInfo didStartProvisionalLoadForFrame:frame];
-}
-
-static void didReceiveServerRedirectForProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- [(BrowserWindowController *)clientInfo didReceiveServerRedirectForProvisionalLoadForFrame:frame];
-}
-
-static void didFailProvisionalLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, WKErrorRef error, WKTypeRef userData, const void *clientInfo)
-{
- [(BrowserWindowController *)clientInfo didFailProvisionalLoadWithErrorForFrame:frame];
-}
-
-static void didCommitLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- [(BrowserWindowController *)clientInfo didCommitLoadForFrame:frame];
-}
-
-static void didFinishDocumentLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- LOG(@"didFinishDocumentLoadForFrame");
-}
-
-static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- LOG(@"didFinishLoadForFrame");
-}
-
-static void didFailLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, WKErrorRef error, WKTypeRef userData, const void *clientInfo)
-{
- [(BrowserWindowController *)clientInfo didFailLoadWithErrorForFrame:frame];
-}
-
-static void didSameDocumentNavigationForFrame(WKPageRef page, WKFrameRef frame, WKSameDocumentNavigationType type, WKTypeRef userData, const void *clientInfo)
-{
- [(BrowserWindowController *)clientInfo didSameDocumentNavigationForFrame:frame];
-}
-
-static void didReceiveTitleForFrame(WKPageRef page, WKStringRef title, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- CFStringRef cfTitle = WKStringCopyCFString(0, title);
- LOG(@"didReceiveTitleForFrame \"%@\"", (NSString *)cfTitle);
- CFRelease(cfTitle);
-}
-
-static void didFirstLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- LOG(@"didFirstLayoutForFrame");
-}
-
-static void didFirstVisuallyNonEmptyLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- LOG(@"didFirstVisuallyNonEmptyLayoutForFrame");
-}
-
-static void didRemoveFrameFromHierarchy(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- LOG(@"didRemoveFrameFromHierarchy");
-}
-
-static void didDisplayInsecureContentForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- LOG(@"didDisplayInsecureContentForFrame");
-}
-
-static void didRunInsecureContentForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- LOG(@"didRunInsecureContentForFrame");
-}
-
-static void didDetectXSSForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
-{
- LOG(@"didDetectXSSForFrame");
-}
-
-static void didStartProgress(WKPageRef page, const void *clientInfo)
-{
- [(BrowserWindowController *)clientInfo didStartProgress];
-}
-
-static void didChangeProgress(WKPageRef page, const void *clientInfo)
-{
- [(BrowserWindowController *)clientInfo didChangeProgress:WKPageGetEstimatedProgress(page)];
-}
-
-static void didFinishProgress(WKPageRef page, const void *clientInfo)
-{
- [(BrowserWindowController *)clientInfo didFinishProgress];
-}
-
-static void didBecomeUnresponsive(WKPageRef page, const void *clientInfo)
-{
- LOG(@"didBecomeUnresponsive");
-}
-
-static void didBecomeResponsive(WKPageRef page, const void *clientInfo)
-{
- LOG(@"didBecomeResponsive");
-}
-
-static void processDidExit(WKPageRef page, const void *clientInfo)
-{
- LOG(@"processDidExit");
-}
-
-static void didChangeBackForwardList(WKPageRef page, WKBackForwardListItemRef addedItem, WKArrayRef removedItems, const void *clientInfo)
-{
- [(BrowserWindowController *)clientInfo validateToolbar];
-}
-
-// MARK: Policy Client Callbacks
-
-static void decidePolicyForNavigationAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
-{
- LOG(@"decidePolicyForNavigationAction");
- WKFramePolicyListenerUse(listener);
-}
-
-static void decidePolicyForNewWindowAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKStringRef frameName, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
-{
- LOG(@"decidePolicyForNewWindowAction");
- WKFramePolicyListenerUse(listener);
-}
-
-static void decidePolicyForResponse(WKPageRef page, WKFrameRef frame, WKURLResponseRef response, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
-{
- WKFramePolicyListenerUse(listener);
-}
-
-// MARK: UI Client Callbacks
-
-static WKPageRef createNewPage(WKPageRef page, WKURLRequestRef request, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton button, const void* clientInfo)
-{
- LOG(@"createNewPage");
- BrowserWindowController *controller = [[BrowserWindowController alloc] initWithContext:WKPageGetContext(page) pageGroup:WKPageGetPageGroup(page)];
- [controller loadWindow];
-
- return WKRetain(controller->_webView.pageRef);
-}
-
-static void showPage(WKPageRef page, const void *clientInfo)
-{
- LOG(@"showPage");
- [[(BrowserWindowController *)clientInfo window] orderFront:nil];
-}
-
-static void closePage(WKPageRef page, const void *clientInfo)
-{
- LOG(@"closePage");
- WKPageClose(page);
- [[(BrowserWindowController *)clientInfo window] close];
-}
-
-static void runJavaScriptAlert(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
-{
- NSAlert* alert = [[NSAlert alloc] init];
-
- WKURLRef wkURL = WKFrameCopyURL(frame);
- CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
- WKRelease(wkURL);
-
- [alert setMessageText:[NSString stringWithFormat:@"JavaScript alert dialog from %@.", [(NSURL *)cfURL absoluteString]]];
- CFRelease(cfURL);
-
- CFStringRef cfMessage = WKStringCopyCFString(0, message);
- [alert setInformativeText:(NSString *)cfMessage];
- CFRelease(cfMessage);
-
- [alert addButtonWithTitle:@"OK"];
-
- [alert runModal];
- [alert release];
-}
-
-static bool runJavaScriptConfirm(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
-{
- NSAlert* alert = [[NSAlert alloc] init];
-
- WKURLRef wkURL = WKFrameCopyURL(frame);
- CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
- WKRelease(wkURL);
-
- [alert setMessageText:[NSString stringWithFormat:@"JavaScript confirm dialog from %@.", [(NSURL *)cfURL absoluteString]]];
- CFRelease(cfURL);
-
- CFStringRef cfMessage = WKStringCopyCFString(0, message);
- [alert setInformativeText:(NSString *)cfMessage];
- CFRelease(cfMessage);
-
- [alert addButtonWithTitle:@"OK"];
- [alert addButtonWithTitle:@"Cancel"];
-
- NSInteger button = [alert runModal];
- [alert release];
-
- return button == NSAlertFirstButtonReturn;
-}
-
-static WKStringRef runJavaScriptPrompt(WKPageRef page, WKStringRef message, WKStringRef defaultValue, WKFrameRef frame, const void* clientInfo)
-{
- NSAlert* alert = [[NSAlert alloc] init];
-
- WKURLRef wkURL = WKFrameCopyURL(frame);
- CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
- WKRelease(wkURL);
-
- [alert setMessageText:[NSString stringWithFormat:@"JavaScript prompt dialog from %@.", [(NSURL *)cfURL absoluteString]]];
- CFRelease(cfURL);
-
- CFStringRef cfMessage = WKStringCopyCFString(0, message);
- [alert setInformativeText:(NSString *)cfMessage];
- CFRelease(cfMessage);
-
- [alert addButtonWithTitle:@"OK"];
- [alert addButtonWithTitle:@"Cancel"];
-
- NSTextField* input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)];
- CFStringRef cfDefaultValue = WKStringCopyCFString(0, defaultValue);
- [input setStringValue:(NSString *)cfDefaultValue];
- CFRelease(cfDefaultValue);
-
- [alert setAccessoryView:input];
-
- NSInteger button = [alert runModal];
-
- NSString* result = nil;
- if (button == NSAlertFirstButtonReturn) {
- [input validateEditing];
- result = [input stringValue];
- }
-
- [alert release];
-
- if (!result)
- return 0;
- return WKStringCreateWithCFString((CFStringRef)result);
-}
-
-static void setStatusText(WKPageRef page, WKStringRef text, const void* clientInfo)
+- (void)windowDidLoad
{
- LOG(@"setStatusText");
+ [super windowDidLoad];
}
-static void mouseDidMoveOverElement(WKPageRef page, WKHitTestResultRef hitTestResult, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo)
-{
- LOG(@"mouseDidMoveOverElement");
-}
-
-static WKRect getWindowFrame(WKPageRef page, const void* clientInfo)
-{
- NSRect rect = [[(BrowserWindowController *)clientInfo window] frame];
- WKRect wkRect;
- wkRect.origin.x = rect.origin.x;
- wkRect.origin.y = rect.origin.y;
- wkRect.size.width = rect.size.width;
- wkRect.size.height = rect.size.height;
- return wkRect;
-}
-
-static void setWindowFrame(WKPageRef page, WKRect rect, const void* clientInfo)
-{
- [[(BrowserWindowController *)clientInfo window] setFrame:NSMakeRect(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height) display:YES];
-}
-
-static bool runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
-{
- NSAlert *alert = [[NSAlert alloc] init];
-
- WKURLRef wkURL = WKFrameCopyURL(frame);
- CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
- WKRelease(wkURL);
-
- [alert setMessageText:[NSString stringWithFormat:@"BeforeUnload confirm dialog from %@.", [(NSURL *)cfURL absoluteString]]];
- CFRelease(cfURL);
-
- CFStringRef cfMessage = WKStringCopyCFString(0, message);
- [alert setInformativeText:(NSString *)cfMessage];
- CFRelease(cfMessage);
-
- [alert addButtonWithTitle:@"OK"];
- [alert addButtonWithTitle:@"Cancel"];
-
- NSInteger button = [alert runModal];
- [alert release];
-
- return button == NSAlertFirstButtonReturn;
-}
-
-static void runOpenPanel(WKPageRef page, WKFrameRef frame, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void* clientInfo)
-{
- NSOpenPanel *openPanel = [NSOpenPanel openPanel];
- [openPanel setAllowsMultipleSelection:WKOpenPanelParametersGetAllowsMultipleFiles(parameters)];
-
- WKRetain(listener);
-
- [openPanel beginSheetModalForWindow:[(BrowserWindowController *)clientInfo window] completionHandler:^(NSInteger result) {
- if (result == NSFileHandlingPanelOKButton) {
- WKMutableArrayRef fileURLs = WKMutableArrayCreate();
-
- NSURL *nsURL;
- for (nsURL in [openPanel URLs]) {
- WKURLRef wkURL = WKURLCreateWithCFURL((CFURLRef)nsURL);
- WKArrayAppendItem(fileURLs, wkURL);
- WKRelease(wkURL);
- }
-
- WKOpenPanelResultListenerChooseFiles(listener, fileURLs);
-
- WKRelease(fileURLs);
- } else
- WKOpenPanelResultListenerCancel(listener);
-
- WKRelease(listener);
- }];
-}
-
-- (void)awakeFromNib
-{
- _webView = [[WKView alloc] initWithFrame:[containerView bounds] contextRef:_context pageGroupRef:_pageGroup];
-
- [_webView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
- [containerView addSubview:_webView];
-
- WKPageLoaderClient loadClient = {
- kWKPageLoaderClientCurrentVersion,
- self, /* clientInfo */
- didStartProvisionalLoadForFrame,
- didReceiveServerRedirectForProvisionalLoadForFrame,
- didFailProvisionalLoadWithErrorForFrame,
- didCommitLoadForFrame,
- didFinishDocumentLoadForFrame,
- didFinishLoadForFrame,
- didFailLoadWithErrorForFrame,
- didSameDocumentNavigationForFrame,
- didReceiveTitleForFrame,
- didFirstLayoutForFrame,
- didFirstVisuallyNonEmptyLayoutForFrame,
- didRemoveFrameFromHierarchy,
- didDisplayInsecureContentForFrame,
- didRunInsecureContentForFrame,
- 0, // canAuthenticateAgainstProtectionSpaceInFrame
- 0, // didReceiveAuthenticationChallengeInFrame
- didStartProgress,
- didChangeProgress,
- didFinishProgress,
- didBecomeUnresponsive,
- didBecomeResponsive,
- processDidExit,
- didChangeBackForwardList,
- 0, // shouldGoToBackForwardItem
- 0, // didFailToInitializePlugin
- didDetectXSSForFrame,
- 0, // didNewFirstVisuallyNonEmptyLayout
- 0, // willGoToBackForwardListItem
- 0, // interactionOccurredWhileProcessUnresponsive
- 0, // pluginDidFail
- 0, // didReceiveIntentForFrame
- 0, // registerIntentServiceForFrame
- 0, // didLayout
- };
- WKPageSetPageLoaderClient(_webView.pageRef, &loadClient);
-
- WKPagePolicyClient policyClient = {
- kWKPagePolicyClientCurrentVersion,
- self, /* clientInfo */
- decidePolicyForNavigationAction,
- decidePolicyForNewWindowAction,
- decidePolicyForResponse,
- 0 /* unableToImplementPolicy */
- };
- WKPageSetPagePolicyClient(_webView.pageRef, &policyClient);
-
- WKPageUIClient uiClient = {
- kWKPageUIClientCurrentVersion,
- self, /* clientInfo */
- 0, /* createNewPage_deprecatedForUseWithV0 */
- showPage,
- closePage,
- 0, /* takeFocus */
- 0, /* focus */
- 0, /* unfocus */
- runJavaScriptAlert,
- runJavaScriptConfirm,
- runJavaScriptPrompt,
- setStatusText,
- 0, /* mouseDidMoveOverElement_deprecatedForUseWithV0 */
- 0, /* missingPluginButtonClicked */
- 0, /* didNotHandleKeyEvent */
- 0, /* didNotHandleWheelEvent */
- 0, /* toolbarsAreVisible */
- 0, /* setToolbarsAreVisible */
- 0, /* menuBarIsVisible */
- 0, /* setMenuBarIsVisible */
- 0, /* statusBarIsVisible */
- 0, /* setStatusBarIsVisible */
- 0, /* isResizable */
- 0, /* setIsResizable */
- getWindowFrame,
- setWindowFrame,
- runBeforeUnloadConfirmPanel,
- 0, /* didDraw */
- 0, /* pageDidScroll */
- 0, /* exceededDatabaseQuota */
- runOpenPanel,
- 0, /* decidePolicyForGeolocationPermissionRequest */
- 0, // headerHeight
- 0, // footerHeight
- 0, // drawHeader
- 0, // drawFooter
- 0, // printFrame
- 0, // showModal
- 0, // didCompleteRubberBandForMainFrame
- 0, // saveDataToFileInDownloadsFolder
- 0, // shouldInterruptJavaScript
- createNewPage,
- mouseDidMoveOverElement,
- 0, // decidePolicyForNotificationPermissionRequest
- 0, // unavailablePluginButtonClicked
- 0, // showColorPicker
- 0, // hideColorPicker
- };
- WKPageSetPageUIClient(_webView.pageRef, &uiClient);
-}
-
-- (void)didStartProgress
-{
- [progressIndicator setDoubleValue:0.0];
- [progressIndicator setHidden:NO];
-}
-
-- (void)didChangeProgress:(double)value
-{
- [progressIndicator setDoubleValue:value];
-}
-
-- (void)didFinishProgress
-{
- [progressIndicator setHidden:YES];
- [progressIndicator setDoubleValue:1.0];
-}
-
-- (void)updateProvisionalURLForFrame:(WKFrameRef)frame
-{
- static WKURLRef emptyURL = 0;
- if (!emptyURL)
- emptyURL = WKURLCreateWithUTF8CString("");
-
- WKURLRef url = WKFrameCopyProvisionalURL(frame);
-
- if (!url)
- return;
-
- if (WKURLIsEqual(url, emptyURL)) {
- WKRelease(url);
- return;
- }
-
- CFURLRef cfSourceURL = WKURLCopyCFURL(0, url);
- WKRelease(url);
-
- [urlText setStringValue:(NSString*)CFURLGetString(cfSourceURL)];
- CFRelease(cfSourceURL);
-}
-
-- (void)didStartProvisionalLoadForFrame:(WKFrameRef)frame
-{
- if (!WKFrameIsMainFrame(frame))
- return;
-
- [self updateProvisionalURLForFrame:frame];
-}
-
-- (void)didReceiveServerRedirectForProvisionalLoadForFrame:(WKFrameRef)frame
-{
- if (!WKFrameIsMainFrame(frame))
- return;
-
- [self updateProvisionalURLForFrame:frame];
-}
-
-- (void)didFailProvisionalLoadWithErrorForFrame:(WKFrameRef)frame
-{
- if (!WKFrameIsMainFrame(frame))
- return;
-
- [self updateProvisionalURLForFrame:frame];
-}
-
-- (void)didFailLoadWithErrorForFrame:(WKFrameRef)frame
-{
- if (!WKFrameIsMainFrame(frame))
- return;
-
- [self updateProvisionalURLForFrame:frame];
-}
-
-- (void)didSameDocumentNavigationForFrame:(WKFrameRef)frame
-{
-}
-
-- (void)didCommitLoadForFrame:(WKFrameRef)frame
+- (IBAction)openLocation:(id)sender
{
+ [[self window] makeFirstResponder:urlText];
}
- (void)loadURLString:(NSString *)urlString
{
- // FIXME: We shouldn't have to set the url text here.
- [urlText setStringValue:urlString];
- [self fetch:nil];
}
-- (IBAction)performFindPanelAction:(id)sender
+- (void)applicationTerminating
{
- [findPanelWindow makeKeyAndOrderFront:sender];
}
-- (IBAction)find:(id)sender
+- (NSString *)addProtocolIfNecessary:(NSString *)address
{
- WKStringRef string = WKStringCreateWithCFString((CFStringRef)[sender stringValue]);
+ if ([address rangeOfString:@"://"].length > 0)
+ return address;
- WKPageFindString(_webView.pageRef, string, kWKFindOptionsCaseInsensitive | kWKFindOptionsWrapAround | kWKFindOptionsShowFindIndicator | kWKFindOptionsShowOverlay, 100);
+ return [@"http://" stringByAppendingString:address];
}
@end
diff --git a/Tools/MiniBrowser/mac/MainMenu.xib b/Tools/MiniBrowser/mac/MainMenu.xib
index 164dba466..b713a00f5 100644
--- a/Tools/MiniBrowser/mac/MainMenu.xib
+++ b/Tools/MiniBrowser/mac/MainMenu.xib
@@ -2,13 +2,13 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1080</int>
- <string key="IBDocument.SystemVersion">12A256</string>
- <string key="IBDocument.InterfaceBuilderVersion">2547</string>
- <string key="IBDocument.AppKitVersion">1185</string>
- <string key="IBDocument.HIToolboxVersion">622.00</string>
+ <string key="IBDocument.SystemVersion">12C52</string>
+ <string key="IBDocument.InterfaceBuilderVersion">4109</string>
+ <string key="IBDocument.AppKitVersion">1187.34</string>
+ <string key="IBDocument.HIToolboxVersion">625.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="NS.object.0">2547</string>
+ <string key="NS.object.0">4109</string>
</object>
<object class="NSArray" key="IBDocument.IntegratedClassDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -191,12 +191,34 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSMenuItem" id="705341025">
<reference key="NSMenu" ref="720053764"/>
- <string key="NSTitle">New Window</string>
+ <string key="NSTitle">Open Location </string>
+ <string key="NSKeyEquiv">l</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="35465992"/>
+ <reference key="NSMixedImage" ref="502551668"/>
+ <int key="NSTag">1</int>
+ </object>
+ <object class="NSMenuItem" id="552626760">
+ <reference key="NSMenu" ref="720053764"/>
+ <string key="NSTitle">New WebKit1 Window</string>
<string key="NSKeyEquiv">n</string>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="35465992"/>
<reference key="NSMixedImage" ref="502551668"/>
+ <int key="NSTag">1</int>
+ </object>
+ <object class="NSMenuItem" id="632566413">
+ <reference key="NSMenu" ref="720053764"/>
+ <bool key="NSIsAlternate">YES</bool>
+ <string key="NSTitle">New WebKit2 Window</string>
+ <string key="NSKeyEquiv">n</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="35465992"/>
+ <reference key="NSMixedImage" ref="502551668"/>
+ <int key="NSTag">2</int>
</object>
<object class="NSMenuItem" id="722745758">
<reference key="NSMenu" ref="720053764"/>
@@ -1352,14 +1374,6 @@
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
- <string key="label">newWindow:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="705341025"/>
- </object>
- <int key="connectionID">533</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
<string key="label">forceRepaint:</string>
<reference key="source" ref="1014"/>
<reference key="destination" ref="878165919"/>
@@ -1430,6 +1444,30 @@
</object>
<int key="connectionID">570</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">newWindow:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="632566413"/>
+ </object>
+ <int key="connectionID">572</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">newWindow:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="552626760"/>
+ </object>
+ <int key="connectionID">574</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">openLocation:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="705341025"/>
+ </object>
+ <int key="connectionID">575</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -1527,6 +1565,8 @@
<reference ref="425164168"/>
<reference ref="579971712"/>
<reference ref="1010469920"/>
+ <reference ref="632566413"/>
+ <reference ref="552626760"/>
</object>
<reference key="parent" ref="379814623"/>
</object>
@@ -2165,6 +2205,16 @@
<reference key="object" ref="15772092"/>
<reference key="parent" ref="865232259"/>
</object>
+ <object class="IBObjectRecord">
+ <int key="objectID">571</int>
+ <reference key="object" ref="632566413"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">573</int>
+ <reference key="object" ref="552626760"/>
+ <reference key="parent" ref="720053764"/>
+ </object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@@ -2265,6 +2315,8 @@
<string>568.IBPluginDependency</string>
<string>569.IBPluginDependency</string>
<string>57.IBPluginDependency</string>
+ <string>571.IBPluginDependency</string>
+ <string>573.IBPluginDependency</string>
<string>58.IBPluginDependency</string>
<string>72.IBPluginDependency</string>
<string>73.IBPluginDependency</string>
@@ -2388,6 +2440,8 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</object>
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
@@ -2402,7 +2456,7 @@
<reference key="dict.values" ref="0"/>
</object>
<nil key="sourceID"/>
- <int key="maxID">570</int>
+ <int key="maxID">575</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -2419,119 +2473,14 @@
<string key="className">BrowserWindowController</string>
<string key="superclassName">NSWindowController</string>
<object class="NSMutableDictionary" key="actions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>dumpSourceToConsole:</string>
- <string>fetch:</string>
- <string>find:</string>
- <string>forceRepaint:</string>
- <string>goBack:</string>
- <string>goForward:</string>
- <string>reload:</string>
- <string>removeReinsertWebView:</string>
- <string>resetZoom:</string>
- <string>showHideWebView:</string>
- <string>togglePaginationMode:</string>
- <string>toggleZoomMode:</string>
- <string>zoomIn:</string>
- <string>zoomOut:</string>
- </object>
- <object class="NSArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- </object>
+ <string key="NS.key.0">openLocation:</string>
+ <string key="NS.object.0">id</string>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>dumpSourceToConsole:</string>
- <string>fetch:</string>
- <string>find:</string>
- <string>forceRepaint:</string>
- <string>goBack:</string>
- <string>goForward:</string>
- <string>reload:</string>
- <string>removeReinsertWebView:</string>
- <string>resetZoom:</string>
- <string>showHideWebView:</string>
- <string>togglePaginationMode:</string>
- <string>toggleZoomMode:</string>
- <string>zoomIn:</string>
- <string>zoomOut:</string>
- </object>
- <object class="NSArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBActionInfo">
- <string key="name">dumpSourceToConsole:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">fetch:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">find:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">forceRepaint:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">goBack:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">goForward:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">reload:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">removeReinsertWebView:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">resetZoom:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">showHideWebView:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">togglePaginationMode:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">toggleZoomMode:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">zoomIn:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">zoomOut:</string>
- <string key="candidateClassName">id</string>
- </object>
+ <string key="NS.key.0">openLocation:</string>
+ <object class="IBActionInfo" key="NS.object.0">
+ <string key="name">openLocation:</string>
+ <string key="candidateClassName">id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
@@ -2653,17 +2602,33 @@
</object>
</object>
<object class="IBPartialClassDescription">
- <string key="className">NSDocument</string>
+ <string key="className">NSDocumentController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <string key="NS.key.0">_openRecentDocument:</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <string key="NS.key.0">_openRecentDocument:</string>
+ <object class="IBActionInfo" key="NS.object.0">
+ <string key="name">_openRecentDocument:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">./Classes/NSDocumentController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">WebView</string>
<object class="NSMutableDictionary" key="actions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
- <string>printDocument:</string>
- <string>revertDocumentToSaved:</string>
- <string>runPageLayout:</string>
- <string>saveDocument:</string>
- <string>saveDocumentAs:</string>
- <string>saveDocumentTo:</string>
+ <string>reloadFromOrigin:</string>
+ <string>resetPageZoom:</string>
+ <string>zoomPageIn:</string>
+ <string>zoomPageOut:</string>
</object>
<object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -2671,70 +2636,40 @@
<string>id</string>
<string>id</string>
<string>id</string>
- <string>id</string>
- <string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
- <string>printDocument:</string>
- <string>revertDocumentToSaved:</string>
- <string>runPageLayout:</string>
- <string>saveDocument:</string>
- <string>saveDocumentAs:</string>
- <string>saveDocumentTo:</string>
+ <string>reloadFromOrigin:</string>
+ <string>resetPageZoom:</string>
+ <string>zoomPageIn:</string>
+ <string>zoomPageOut:</string>
</object>
<object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBActionInfo">
- <string key="name">printDocument:</string>
+ <string key="name">reloadFromOrigin:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
- <string key="name">revertDocumentToSaved:</string>
+ <string key="name">resetPageZoom:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
- <string key="name">runPageLayout:</string>
+ <string key="name">zoomPageIn:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
- <string key="name">saveDocument:</string>
+ <string key="name">zoomPageOut:</string>
<string key="candidateClassName">id</string>
</object>
- <object class="IBActionInfo">
- <string key="name">saveDocumentAs:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo">
- <string key="name">saveDocumentTo:</string>
- <string key="candidateClassName">id</string>
- </object>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/NSDocument.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSDocumentController</string>
- <object class="NSMutableDictionary" key="actions">
- <string key="NS.key.0">_openRecentDocument:</string>
- <string key="NS.object.0">id</string>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <string key="NS.key.0">_openRecentDocument:</string>
- <object class="IBActionInfo" key="NS.object.0">
- <string key="name">_openRecentDocument:</string>
- <string key="candidateClassName">id</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/NSDocumentController.h</string>
+ <string key="minorKey">./Classes/WebView.h</string>
</object>
</object>
</object>
diff --git a/Tools/MiniBrowser/mac/WK1BrowserWindowController.h b/Tools/MiniBrowser/mac/WK1BrowserWindowController.h
new file mode 100644
index 000000000..fdae2ca27
--- /dev/null
+++ b/Tools/MiniBrowser/mac/WK1BrowserWindowController.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "BrowserWindowController.h"
+
+@class WebView;
+
+@interface WK1BrowserWindowController : BrowserWindowController<BrowserController> {
+ WebView *_webView;
+}
+
+
+@end
diff --git a/Tools/MiniBrowser/mac/WK1BrowserWindowController.m b/Tools/MiniBrowser/mac/WK1BrowserWindowController.m
new file mode 100644
index 000000000..6ec612ffb
--- /dev/null
+++ b/Tools/MiniBrowser/mac/WK1BrowserWindowController.m
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "WK1BrowserWindowController.h"
+
+#import <WebKit/WebKit.h>
+#import "AppDelegate.h"
+
+@interface WK1BrowserWindowController ()
+@end
+
+@implementation WK1BrowserWindowController
+
+- (void)awakeFromNib
+{
+ _webView = [[WebView alloc] initWithFrame:[containerView bounds]];
+ [_webView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
+
+ // Set the WebView delegates
+ [_webView setFrameLoadDelegate:self];
+ [_webView setUIDelegate:self];
+ [_webView setResourceLoadDelegate:self];
+
+ [containerView addSubview:_webView];
+}
+
+- (void)dealloc
+{
+ [_webView release];
+
+ [super dealloc];
+}
+
+- (void)loadURLString:(NSString *)urlString
+{
+ // FIXME: We shouldn't have to set the url text here.
+ [urlText setStringValue:urlString];
+ [self fetch:nil];
+}
+
+- (IBAction)fetch:(id)sender
+{
+ [urlText setStringValue:[self addProtocolIfNecessary:[urlText stringValue]]];
+ NSURL *url = [NSURL URLWithString:[urlText stringValue]];
+ [[_webView mainFrame] loadRequest:[NSURLRequest requestWithURL:url]];
+}
+
+- (IBAction)showHideWebView:(id)sender
+{
+ BOOL hidden = ![_webView isHidden];
+
+ [_webView setHidden:hidden];
+}
+
+- (IBAction)removeReinsertWebView:(id)sender
+{
+ if ([_webView window]) {
+ [_webView retain];
+ [_webView removeFromSuperview];
+ } else {
+ [containerView addSubview:_webView];
+ [_webView release];
+ }
+}
+
+- (IBAction)reload:(id)sender
+{
+ [_webView reload:sender];
+}
+
+- (IBAction)forceRepaint:(id)sender
+{
+ [_webView setNeedsDisplay:YES];
+}
+
+- (IBAction)goBack:(id)sender
+{
+ [_webView goBack:sender];
+}
+
+- (IBAction)goForward:(id)sender
+{
+ [_webView goForward:sender];
+}
+
+- (BOOL)isPaginated
+{
+ return NO;
+}
+
+- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
+{
+ SEL action = [menuItem action];
+
+ if (action == @selector(zoomIn:))
+ return [self canZoomIn];
+ if (action == @selector(zoomOut:))
+ return [self canZoomOut];
+ if (action == @selector(resetZoom:))
+ return [self canResetZoom];
+
+ if (action == @selector(showHideWebView:))
+ [menuItem setTitle:[_webView isHidden] ? @"Show Web View" : @"Hide Web View"];
+ else if (action == @selector(removeReinsertWebView:))
+ [menuItem setTitle:[_webView window] ? @"Remove Web View" : @"Insert Web View"];
+ else if (action == @selector(toggleZoomMode:))
+ [menuItem setState:_zoomTextOnly ? NSOnState : NSOffState];
+ else if ([menuItem action] == @selector(togglePaginationMode:))
+ [menuItem setState:[self isPaginated] ? NSOnState : NSOffState];
+
+ return YES;
+}
+
+- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
+{
+ SEL action = [item action];
+
+ if (action == @selector(goBack:))
+ return [_webView canGoBack];
+
+ if (action == @selector(goForward:))
+ return [_webView canGoForward];
+
+ return YES;
+}
+
+- (void)validateToolbar
+{
+ [toolbar validateVisibleItems];
+}
+
+- (BOOL)windowShouldClose:(id)sender
+{
+ return YES;
+}
+
+- (void)windowWillClose:(NSNotification *)notification
+{
+ [(BrowserAppDelegate *)[NSApp delegate] browserWindowWillClose:[self window]];
+ [self autorelease];
+}
+
+- (void)applicationTerminating
+{
+}
+
+- (double)currentZoomFactor
+{
+ return 1;
+}
+
+- (BOOL)canZoomIn
+{
+ return [_webView canMakeTextLarger];
+}
+
+- (void)zoomIn:(id)sender
+{
+ if (![self canZoomIn])
+ return;
+
+ [_webView makeTextLarger:sender];
+}
+
+- (BOOL)canZoomOut
+{
+ return [_webView canMakeTextSmaller];
+}
+
+- (void)zoomOut:(id)sender
+{
+ if (![self canZoomIn])
+ return;
+
+ [_webView makeTextSmaller:sender];
+}
+
+- (BOOL)canResetZoom
+{
+ return [_webView canMakeTextStandardSize];
+}
+
+- (void)resetZoom:(id)sender
+{
+ if (![self canResetZoom])
+ return;
+
+ [_webView makeTextStandardSize:sender];
+}
+
+- (IBAction)toggleZoomMode:(id)sender
+{
+ // FIXME: non-text zoom not implemented.
+ _zoomTextOnly = !_zoomTextOnly;
+}
+
+- (IBAction)togglePaginationMode:(id)sender
+{
+}
+
+- (IBAction)find:(id)sender
+{
+}
+
+- (IBAction)dumpSourceToConsole:(id)sender
+{
+}
+
+// WebFrameLoadDelegate Methods
+- (void)webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame
+{
+}
+
+- (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame
+{
+ if (frame != [sender mainFrame])
+ return;
+
+ [[self window] setTitle:[title stringByAppendingString:@" [WK1]"]];
+}
+
+@end
diff --git a/Tools/MiniBrowser/mac/WK2BrowserWindowController.h b/Tools/MiniBrowser/mac/WK2BrowserWindowController.h
new file mode 100644
index 000000000..840f08273
--- /dev/null
+++ b/Tools/MiniBrowser/mac/WK2BrowserWindowController.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "BrowserWindowController.h"
+
+@interface WK2BrowserWindowController : BrowserWindowController<BrowserController> {
+ WKContextRef _context;
+ WKPageGroupRef _pageGroup;
+ WKView *_webView;
+}
+
+- (id)initWithContext:(WKContextRef)context pageGroup:(WKPageGroupRef)pageGroup;
+
+@end
diff --git a/Tools/MiniBrowser/mac/WK2BrowserWindowController.m b/Tools/MiniBrowser/mac/WK2BrowserWindowController.m
new file mode 100644
index 000000000..8db9a2408
--- /dev/null
+++ b/Tools/MiniBrowser/mac/WK2BrowserWindowController.m
@@ -0,0 +1,809 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "WK2BrowserWindowController.h"
+
+#import "AppDelegate.h"
+#import <WebKit2/WKPagePrivate.h>
+#import <WebKit2/WKStringCF.h>
+#import <WebKit2/WKURLCF.h>
+#import <WebKit2/WKViewPrivate.h>
+
+@interface WK2BrowserWindowController ()
+- (void)didStartProgress;
+- (void)didChangeProgress:(double)value;
+- (void)didFinishProgress;
+- (void)didStartProvisionalLoadForFrame:(WKFrameRef)frame;
+- (void)didCommitLoadForFrame:(WKFrameRef)frame;
+- (void)didReceiveServerRedirectForProvisionalLoadForFrame:(WKFrameRef)frame;
+- (void)didFailProvisionalLoadWithErrorForFrame:(WKFrameRef)frame;
+- (void)didFailLoadWithErrorForFrame:(WKFrameRef)frame;
+- (void)didSameDocumentNavigationForFrame:(WKFrameRef)frame;
+- (BOOL)isPaginated;
+@end
+
+@implementation WK2BrowserWindowController
+
+- (id)initWithContext:(WKContextRef)context pageGroup:(WKPageGroupRef)pageGroup
+{
+ if ((self = [super initWithWindowNibName:@"BrowserWindow"])) {
+ _context = WKRetain(context);
+ _pageGroup = WKRetain(pageGroup);
+ _zoomTextOnly = NO;
+ }
+
+ return self;
+}
+
+- (void)dealloc
+{
+ WKRelease(_context);
+ WKRelease(_pageGroup);
+ [_webView release];
+
+ [super dealloc];
+}
+
+- (IBAction)fetch:(id)sender
+{
+ [urlText setStringValue:[self addProtocolIfNecessary:[urlText stringValue]]];
+
+ CFURLRef cfURL = CFURLCreateWithString(0, (CFStringRef)[urlText stringValue], 0);
+ if (!cfURL)
+ return;
+
+ WKURLRef url = WKURLCreateWithCFURL(cfURL);
+ CFRelease(cfURL);
+
+ WKPageLoadURL(_webView.pageRef, url);
+ WKRelease(url);
+}
+
+- (IBAction)showHideWebView:(id)sender
+{
+ BOOL hidden = ![_webView isHidden];
+
+ [_webView setHidden:hidden];
+}
+
+- (IBAction)removeReinsertWebView:(id)sender
+{
+ if ([_webView window]) {
+ [_webView retain];
+ [_webView removeFromSuperview];
+ } else {
+ [containerView addSubview:_webView];
+ [_webView release];
+ }
+}
+
+- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
+{
+ SEL action = [menuItem action];
+
+ if (action == @selector(zoomIn:))
+ return [self canZoomIn];
+ if (action == @selector(zoomOut:))
+ return [self canZoomOut];
+ if (action == @selector(resetZoom:))
+ return [self canResetZoom];
+
+ if (action == @selector(showHideWebView:))
+ [menuItem setTitle:[_webView isHidden] ? @"Show Web View" : @"Hide Web View"];
+ else if (action == @selector(removeReinsertWebView:))
+ [menuItem setTitle:[_webView window] ? @"Remove Web View" : @"Insert Web View"];
+ else if (action == @selector(toggleZoomMode:))
+ [menuItem setState:_zoomTextOnly ? NSOnState : NSOffState];
+ else if ([menuItem action] == @selector(togglePaginationMode:))
+ [menuItem setState:[self isPaginated] ? NSOnState : NSOffState];
+
+ return YES;
+}
+
+- (IBAction)reload:(id)sender
+{
+ WKPageReload(_webView.pageRef);
+}
+
+- (IBAction)forceRepaint:(id)sender
+{
+ [_webView setNeedsDisplay:YES];
+}
+
+- (IBAction)goBack:(id)sender
+{
+ WKPageGoBack(_webView.pageRef);
+}
+
+- (IBAction)goForward:(id)sender
+{
+ WKPageGoForward(_webView.pageRef);
+}
+
+- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
+{
+ SEL action = [item action];
+
+ if (action == @selector(goBack:))
+ return _webView && WKPageCanGoBack(_webView.pageRef);
+
+ if (action == @selector(goForward:))
+ return _webView && WKPageCanGoForward(_webView.pageRef);
+
+ return YES;
+}
+
+- (void)validateToolbar
+{
+ [toolbar validateVisibleItems];
+}
+
+- (BOOL)windowShouldClose:(id)sender
+{
+ LOG(@"windowShouldClose");
+ BOOL canCloseImmediately = WKPageTryClose(_webView.pageRef);
+ return canCloseImmediately;
+}
+
+- (void)windowWillClose:(NSNotification *)notification
+{
+ [(BrowserAppDelegate *)[NSApp delegate] browserWindowWillClose:[self window]];
+ [self autorelease];
+}
+
+- (void)applicationTerminating
+{
+ // FIXME: Why are we bothering to close the page? This doesn't even prevent LEAK output.
+ WKPageClose(_webView.pageRef);
+}
+
+#define DefaultMinimumZoomFactor (.5)
+#define DefaultMaximumZoomFactor (3.0)
+#define DefaultZoomFactorRatio (1.2)
+
+- (double)currentZoomFactor
+{
+ return _zoomTextOnly ? WKPageGetTextZoomFactor(_webView.pageRef) : WKPageGetPageZoomFactor(_webView.pageRef);
+}
+
+- (void)setCurrentZoomFactor:(double)factor
+{
+ _zoomTextOnly ? WKPageSetTextZoomFactor(_webView.pageRef, factor) : WKPageSetPageZoomFactor(_webView.pageRef, factor);
+}
+
+- (BOOL)canZoomIn
+{
+ return [self currentZoomFactor] * DefaultZoomFactorRatio < DefaultMaximumZoomFactor;
+}
+
+- (void)zoomIn:(id)sender
+{
+ if (![self canZoomIn])
+ return;
+
+ double factor = [self currentZoomFactor] * DefaultZoomFactorRatio;
+ [self setCurrentZoomFactor:factor];
+}
+
+- (BOOL)canZoomOut
+{
+ return [self currentZoomFactor] / DefaultZoomFactorRatio > DefaultMinimumZoomFactor;
+}
+
+- (void)zoomOut:(id)sender
+{
+ if (![self canZoomIn])
+ return;
+
+ double factor = [self currentZoomFactor] / DefaultZoomFactorRatio;
+ [self setCurrentZoomFactor:factor];
+}
+
+- (BOOL)canResetZoom
+{
+ return _zoomTextOnly ? (WKPageGetTextZoomFactor(_webView.pageRef) != 1) : (WKPageGetPageZoomFactor(_webView.pageRef) != 1);
+}
+
+- (void)resetZoom:(id)sender
+{
+ if (![self canResetZoom])
+ return;
+
+ if (_zoomTextOnly)
+ WKPageSetTextZoomFactor(_webView.pageRef, 1);
+ else
+ WKPageSetPageZoomFactor(_webView.pageRef, 1);
+}
+
+- (IBAction)toggleZoomMode:(id)sender
+{
+ if (_zoomTextOnly) {
+ _zoomTextOnly = NO;
+ double currentTextZoom = WKPageGetTextZoomFactor(_webView.pageRef);
+ WKPageSetPageAndTextZoomFactors(_webView.pageRef, currentTextZoom, 1);
+ } else {
+ _zoomTextOnly = YES;
+ double currentPageZoom = WKPageGetPageZoomFactor(_webView.pageRef);
+ WKPageSetPageAndTextZoomFactors(_webView.pageRef, 1, currentPageZoom);
+ }
+}
+
+- (BOOL)isPaginated
+{
+ return WKPageGetPaginationMode(_webView.pageRef) != kWKPaginationModeUnpaginated;
+}
+
+- (IBAction)togglePaginationMode:(id)sender
+{
+ if ([self isPaginated])
+ WKPageSetPaginationMode(_webView.pageRef, kWKPaginationModeUnpaginated);
+ else {
+ WKPageSetPaginationMode(_webView.pageRef, kWKPaginationModeLeftToRight);
+ WKPageSetPageLength(_webView.pageRef, _webView.bounds.size.width / 2);
+ WKPageSetGapBetweenPages(_webView.pageRef, 10);
+ }
+}
+
+- (IBAction)dumpSourceToConsole:(id)sender
+{
+ WKPageGetSourceForFrame_b(_webView.pageRef, WKPageGetMainFrame(_webView.pageRef), ^(WKStringRef result, WKErrorRef error) {
+ CFStringRef cfResult = WKStringCopyCFString(0, result);
+ LOG(@"Main frame source\n \"%@\"", (NSString *)cfResult);
+ CFRelease(cfResult);
+ });
+}
+
+// MARK: Loader Client Callbacks
+
+static void didStartProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ [(WK2BrowserWindowController *)clientInfo didStartProvisionalLoadForFrame:frame];
+}
+
+static void didReceiveServerRedirectForProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ [(WK2BrowserWindowController *)clientInfo didReceiveServerRedirectForProvisionalLoadForFrame:frame];
+}
+
+static void didFailProvisionalLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, WKErrorRef error, WKTypeRef userData, const void *clientInfo)
+{
+ [(WK2BrowserWindowController *)clientInfo didFailProvisionalLoadWithErrorForFrame:frame];
+}
+
+static void didCommitLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ [(WK2BrowserWindowController *)clientInfo didCommitLoadForFrame:frame];
+}
+
+static void didFinishDocumentLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ LOG(@"didFinishDocumentLoadForFrame");
+}
+
+static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ LOG(@"didFinishLoadForFrame");
+}
+
+static void didFailLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, WKErrorRef error, WKTypeRef userData, const void *clientInfo)
+{
+ [(WK2BrowserWindowController *)clientInfo didFailLoadWithErrorForFrame:frame];
+}
+
+static void didSameDocumentNavigationForFrame(WKPageRef page, WKFrameRef frame, WKSameDocumentNavigationType type, WKTypeRef userData, const void *clientInfo)
+{
+ [(WK2BrowserWindowController *)clientInfo didSameDocumentNavigationForFrame:frame];
+}
+
+static void didReceiveTitleForFrame(WKPageRef page, WKStringRef title, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ if (!WKFrameIsMainFrame(frame))
+ return;
+
+ WK2BrowserWindowController* controller = (WK2BrowserWindowController*)clientInfo;
+ CFStringRef cfTitle = WKStringCopyCFString(0, title);
+ [[controller window] setTitle:[(NSString *)cfTitle stringByAppendingString:@" [WK2]"]];
+ CFRelease(cfTitle);
+}
+
+static void didFirstLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ LOG(@"didFirstLayoutForFrame");
+}
+
+static void didFirstVisuallyNonEmptyLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ LOG(@"didFirstVisuallyNonEmptyLayoutForFrame");
+}
+
+static void didRemoveFrameFromHierarchy(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ LOG(@"didRemoveFrameFromHierarchy");
+}
+
+static void didDisplayInsecureContentForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ LOG(@"didDisplayInsecureContentForFrame");
+}
+
+static void didRunInsecureContentForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ LOG(@"didRunInsecureContentForFrame");
+}
+
+static void didDetectXSSForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ LOG(@"didDetectXSSForFrame");
+}
+
+static void didStartProgress(WKPageRef page, const void *clientInfo)
+{
+ [(WK2BrowserWindowController *)clientInfo didStartProgress];
+}
+
+static void didChangeProgress(WKPageRef page, const void *clientInfo)
+{
+ [(WK2BrowserWindowController *)clientInfo didChangeProgress:WKPageGetEstimatedProgress(page)];
+}
+
+static void didFinishProgress(WKPageRef page, const void *clientInfo)
+{
+ [(WK2BrowserWindowController *)clientInfo didFinishProgress];
+}
+
+static void didBecomeUnresponsive(WKPageRef page, const void *clientInfo)
+{
+ LOG(@"didBecomeUnresponsive");
+}
+
+static void didBecomeResponsive(WKPageRef page, const void *clientInfo)
+{
+ LOG(@"didBecomeResponsive");
+}
+
+static void processDidExit(WKPageRef page, const void *clientInfo)
+{
+ LOG(@"processDidExit");
+}
+
+static void didChangeBackForwardList(WKPageRef page, WKBackForwardListItemRef addedItem, WKArrayRef removedItems, const void *clientInfo)
+{
+ [(WK2BrowserWindowController *)clientInfo validateToolbar];
+}
+
+// MARK: Policy Client Callbacks
+
+static void decidePolicyForNavigationAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
+{
+ LOG(@"decidePolicyForNavigationAction");
+ WKFramePolicyListenerUse(listener);
+}
+
+static void decidePolicyForNewWindowAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKStringRef frameName, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
+{
+ LOG(@"decidePolicyForNewWindowAction");
+ WKFramePolicyListenerUse(listener);
+}
+
+static void decidePolicyForResponse(WKPageRef page, WKFrameRef frame, WKURLResponseRef response, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
+{
+ WKFramePolicyListenerUse(listener);
+}
+
+// MARK: UI Client Callbacks
+
+static WKPageRef createNewPage(WKPageRef page, WKURLRequestRef request, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton button, const void* clientInfo)
+{
+ LOG(@"createNewPage");
+ WK2BrowserWindowController *controller = [[WK2BrowserWindowController alloc] initWithContext:WKPageGetContext(page) pageGroup:WKPageGetPageGroup(page)];
+ [controller loadWindow];
+
+ return WKRetain(controller->_webView.pageRef);
+}
+
+static void showPage(WKPageRef page, const void *clientInfo)
+{
+ LOG(@"showPage");
+ [[(BrowserWindowController *)clientInfo window] orderFront:nil];
+}
+
+static void closePage(WKPageRef page, const void *clientInfo)
+{
+ LOG(@"closePage");
+ WKPageClose(page);
+ [[(BrowserWindowController *)clientInfo window] close];
+}
+
+static void runJavaScriptAlert(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
+{
+ NSAlert* alert = [[NSAlert alloc] init];
+
+ WKURLRef wkURL = WKFrameCopyURL(frame);
+ CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
+ WKRelease(wkURL);
+
+ [alert setMessageText:[NSString stringWithFormat:@"JavaScript alert dialog from %@.", [(NSURL *)cfURL absoluteString]]];
+ CFRelease(cfURL);
+
+ CFStringRef cfMessage = WKStringCopyCFString(0, message);
+ [alert setInformativeText:(NSString *)cfMessage];
+ CFRelease(cfMessage);
+
+ [alert addButtonWithTitle:@"OK"];
+
+ [alert runModal];
+ [alert release];
+}
+
+static bool runJavaScriptConfirm(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
+{
+ NSAlert* alert = [[NSAlert alloc] init];
+
+ WKURLRef wkURL = WKFrameCopyURL(frame);
+ CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
+ WKRelease(wkURL);
+
+ [alert setMessageText:[NSString stringWithFormat:@"JavaScript confirm dialog from %@.", [(NSURL *)cfURL absoluteString]]];
+ CFRelease(cfURL);
+
+ CFStringRef cfMessage = WKStringCopyCFString(0, message);
+ [alert setInformativeText:(NSString *)cfMessage];
+ CFRelease(cfMessage);
+
+ [alert addButtonWithTitle:@"OK"];
+ [alert addButtonWithTitle:@"Cancel"];
+
+ NSInteger button = [alert runModal];
+ [alert release];
+
+ return button == NSAlertFirstButtonReturn;
+}
+
+static WKStringRef runJavaScriptPrompt(WKPageRef page, WKStringRef message, WKStringRef defaultValue, WKFrameRef frame, const void* clientInfo)
+{
+ NSAlert* alert = [[NSAlert alloc] init];
+
+ WKURLRef wkURL = WKFrameCopyURL(frame);
+ CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
+ WKRelease(wkURL);
+
+ [alert setMessageText:[NSString stringWithFormat:@"JavaScript prompt dialog from %@.", [(NSURL *)cfURL absoluteString]]];
+ CFRelease(cfURL);
+
+ CFStringRef cfMessage = WKStringCopyCFString(0, message);
+ [alert setInformativeText:(NSString *)cfMessage];
+ CFRelease(cfMessage);
+
+ [alert addButtonWithTitle:@"OK"];
+ [alert addButtonWithTitle:@"Cancel"];
+
+ NSTextField* input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)];
+ CFStringRef cfDefaultValue = WKStringCopyCFString(0, defaultValue);
+ [input setStringValue:(NSString *)cfDefaultValue];
+ CFRelease(cfDefaultValue);
+
+ [alert setAccessoryView:input];
+
+ NSInteger button = [alert runModal];
+
+ NSString* result = nil;
+ if (button == NSAlertFirstButtonReturn) {
+ [input validateEditing];
+ result = [input stringValue];
+ }
+
+ [alert release];
+
+ if (!result)
+ return 0;
+ return WKStringCreateWithCFString((CFStringRef)result);
+}
+
+static void setStatusText(WKPageRef page, WKStringRef text, const void* clientInfo)
+{
+ LOG(@"setStatusText");
+}
+
+static void mouseDidMoveOverElement(WKPageRef page, WKHitTestResultRef hitTestResult, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo)
+{
+ LOG(@"mouseDidMoveOverElement");
+}
+
+static WKRect getWindowFrame(WKPageRef page, const void* clientInfo)
+{
+ NSRect rect = [[(BrowserWindowController *)clientInfo window] frame];
+ WKRect wkRect;
+ wkRect.origin.x = rect.origin.x;
+ wkRect.origin.y = rect.origin.y;
+ wkRect.size.width = rect.size.width;
+ wkRect.size.height = rect.size.height;
+ return wkRect;
+}
+
+static void setWindowFrame(WKPageRef page, WKRect rect, const void* clientInfo)
+{
+ [[(BrowserWindowController *)clientInfo window] setFrame:NSMakeRect(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height) display:YES];
+}
+
+static bool runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
+{
+ NSAlert *alert = [[NSAlert alloc] init];
+
+ WKURLRef wkURL = WKFrameCopyURL(frame);
+ CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
+ WKRelease(wkURL);
+
+ [alert setMessageText:[NSString stringWithFormat:@"BeforeUnload confirm dialog from %@.", [(NSURL *)cfURL absoluteString]]];
+ CFRelease(cfURL);
+
+ CFStringRef cfMessage = WKStringCopyCFString(0, message);
+ [alert setInformativeText:(NSString *)cfMessage];
+ CFRelease(cfMessage);
+
+ [alert addButtonWithTitle:@"OK"];
+ [alert addButtonWithTitle:@"Cancel"];
+
+ NSInteger button = [alert runModal];
+ [alert release];
+
+ return button == NSAlertFirstButtonReturn;
+}
+
+static void runOpenPanel(WKPageRef page, WKFrameRef frame, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void* clientInfo)
+{
+ NSOpenPanel *openPanel = [NSOpenPanel openPanel];
+ [openPanel setAllowsMultipleSelection:WKOpenPanelParametersGetAllowsMultipleFiles(parameters)];
+
+ WKRetain(listener);
+
+ [openPanel beginSheetModalForWindow:[(BrowserWindowController *)clientInfo window] completionHandler:^(NSInteger result) {
+ if (result == NSFileHandlingPanelOKButton) {
+ WKMutableArrayRef fileURLs = WKMutableArrayCreate();
+
+ NSURL *nsURL;
+ for (nsURL in [openPanel URLs]) {
+ WKURLRef wkURL = WKURLCreateWithCFURL((CFURLRef)nsURL);
+ WKArrayAppendItem(fileURLs, wkURL);
+ WKRelease(wkURL);
+ }
+
+ WKOpenPanelResultListenerChooseFiles(listener, fileURLs);
+
+ WKRelease(fileURLs);
+ } else
+ WKOpenPanelResultListenerCancel(listener);
+
+ WKRelease(listener);
+ }];
+}
+
+- (void)awakeFromNib
+{
+ _webView = [[WKView alloc] initWithFrame:[containerView bounds] contextRef:_context pageGroupRef:_pageGroup];
+
+ [_webView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
+ [containerView addSubview:_webView];
+
+ WKPageLoaderClient loadClient = {
+ kWKPageLoaderClientCurrentVersion,
+ self, /* clientInfo */
+ didStartProvisionalLoadForFrame,
+ didReceiveServerRedirectForProvisionalLoadForFrame,
+ didFailProvisionalLoadWithErrorForFrame,
+ didCommitLoadForFrame,
+ didFinishDocumentLoadForFrame,
+ didFinishLoadForFrame,
+ didFailLoadWithErrorForFrame,
+ didSameDocumentNavigationForFrame,
+ didReceiveTitleForFrame,
+ didFirstLayoutForFrame,
+ didFirstVisuallyNonEmptyLayoutForFrame,
+ didRemoveFrameFromHierarchy,
+ didDisplayInsecureContentForFrame,
+ didRunInsecureContentForFrame,
+ 0, // canAuthenticateAgainstProtectionSpaceInFrame
+ 0, // didReceiveAuthenticationChallengeInFrame
+ didStartProgress,
+ didChangeProgress,
+ didFinishProgress,
+ didBecomeUnresponsive,
+ didBecomeResponsive,
+ processDidExit,
+ didChangeBackForwardList,
+ 0, // shouldGoToBackForwardItem
+ 0, // didFailToInitializePlugin
+ didDetectXSSForFrame,
+ 0, // didNewFirstVisuallyNonEmptyLayout
+ 0, // willGoToBackForwardListItem
+ 0, // interactionOccurredWhileProcessUnresponsive
+ 0, // pluginDidFail
+ 0, // didReceiveIntentForFrame
+ 0, // registerIntentServiceForFrame
+ 0, // didLayout
+ };
+ WKPageSetPageLoaderClient(_webView.pageRef, &loadClient);
+
+ WKPagePolicyClient policyClient = {
+ kWKPagePolicyClientCurrentVersion,
+ self, /* clientInfo */
+ decidePolicyForNavigationAction,
+ decidePolicyForNewWindowAction,
+ decidePolicyForResponse,
+ 0 /* unableToImplementPolicy */
+ };
+ WKPageSetPagePolicyClient(_webView.pageRef, &policyClient);
+
+ WKPageUIClient uiClient = {
+ kWKPageUIClientCurrentVersion,
+ self, /* clientInfo */
+ 0, /* createNewPage_deprecatedForUseWithV0 */
+ showPage,
+ closePage,
+ 0, /* takeFocus */
+ 0, /* focus */
+ 0, /* unfocus */
+ runJavaScriptAlert,
+ runJavaScriptConfirm,
+ runJavaScriptPrompt,
+ setStatusText,
+ 0, /* mouseDidMoveOverElement_deprecatedForUseWithV0 */
+ 0, /* missingPluginButtonClicked */
+ 0, /* didNotHandleKeyEvent */
+ 0, /* didNotHandleWheelEvent */
+ 0, /* toolbarsAreVisible */
+ 0, /* setToolbarsAreVisible */
+ 0, /* menuBarIsVisible */
+ 0, /* setMenuBarIsVisible */
+ 0, /* statusBarIsVisible */
+ 0, /* setStatusBarIsVisible */
+ 0, /* isResizable */
+ 0, /* setIsResizable */
+ getWindowFrame,
+ setWindowFrame,
+ runBeforeUnloadConfirmPanel,
+ 0, /* didDraw */
+ 0, /* pageDidScroll */
+ 0, /* exceededDatabaseQuota */
+ runOpenPanel,
+ 0, /* decidePolicyForGeolocationPermissionRequest */
+ 0, // headerHeight
+ 0, // footerHeight
+ 0, // drawHeader
+ 0, // drawFooter
+ 0, // printFrame
+ 0, // showModal
+ 0, // didCompleteRubberBandForMainFrame
+ 0, // saveDataToFileInDownloadsFolder
+ 0, // shouldInterruptJavaScript
+ createNewPage,
+ mouseDidMoveOverElement,
+ 0, // decidePolicyForNotificationPermissionRequest
+ 0, // unavailablePluginButtonClicked
+ 0, // showColorPicker
+ 0, // hideColorPicker
+ };
+ WKPageSetPageUIClient(_webView.pageRef, &uiClient);
+}
+
+- (void)didStartProgress
+{
+ [progressIndicator setDoubleValue:0.0];
+ [progressIndicator setHidden:NO];
+}
+
+- (void)didChangeProgress:(double)value
+{
+ [progressIndicator setDoubleValue:value];
+}
+
+- (void)didFinishProgress
+{
+ [progressIndicator setHidden:YES];
+ [progressIndicator setDoubleValue:1.0];
+}
+
+- (void)updateProvisionalURLForFrame:(WKFrameRef)frame
+{
+ static WKURLRef emptyURL = 0;
+ if (!emptyURL)
+ emptyURL = WKURLCreateWithUTF8CString("");
+
+ WKURLRef url = WKFrameCopyProvisionalURL(frame);
+
+ if (!url)
+ return;
+
+ if (WKURLIsEqual(url, emptyURL)) {
+ WKRelease(url);
+ return;
+ }
+
+ CFURLRef cfSourceURL = WKURLCopyCFURL(0, url);
+ WKRelease(url);
+
+ [urlText setStringValue:(NSString*)CFURLGetString(cfSourceURL)];
+ CFRelease(cfSourceURL);
+}
+
+- (void)didStartProvisionalLoadForFrame:(WKFrameRef)frame
+{
+ if (!WKFrameIsMainFrame(frame))
+ return;
+
+ [self updateProvisionalURLForFrame:frame];
+}
+
+- (void)didReceiveServerRedirectForProvisionalLoadForFrame:(WKFrameRef)frame
+{
+ if (!WKFrameIsMainFrame(frame))
+ return;
+
+ [self updateProvisionalURLForFrame:frame];
+}
+
+- (void)didFailProvisionalLoadWithErrorForFrame:(WKFrameRef)frame
+{
+ if (!WKFrameIsMainFrame(frame))
+ return;
+
+ [self updateProvisionalURLForFrame:frame];
+}
+
+- (void)didFailLoadWithErrorForFrame:(WKFrameRef)frame
+{
+ if (!WKFrameIsMainFrame(frame))
+ return;
+
+ [self updateProvisionalURLForFrame:frame];
+}
+
+- (void)didSameDocumentNavigationForFrame:(WKFrameRef)frame
+{
+}
+
+- (void)didCommitLoadForFrame:(WKFrameRef)frame
+{
+}
+
+- (void)loadURLString:(NSString *)urlString
+{
+ // FIXME: We shouldn't have to set the url text here.
+ [urlText setStringValue:urlString];
+ [self fetch:nil];
+}
+
+- (IBAction)performFindPanelAction:(id)sender
+{
+ [findPanelWindow makeKeyAndOrderFront:sender];
+}
+
+- (IBAction)find:(id)sender
+{
+ WKStringRef string = WKStringCreateWithCFString((CFStringRef)[sender stringValue]);
+
+ WKPageFindString(_webView.pageRef, string, kWKFindOptionsCaseInsensitive | kWKFindOptionsWrapAround | kWKFindOptionsShowFindIndicator | kWKFindOptionsShowOverlay, 100);
+}
+
+@end
diff --git a/Tools/MiniBrowser/qt/MiniBrowser.pro b/Tools/MiniBrowser/qt/MiniBrowser.pro
index 31a39eb6b..f5c1803fa 100644
--- a/Tools/MiniBrowser/qt/MiniBrowser.pro
+++ b/Tools/MiniBrowser/qt/MiniBrowser.pro
@@ -31,7 +31,7 @@ DESTDIR = $${ROOT_BUILD_DIR}/bin
have?(FONTCONFIG): PKGCONFIG += fontconfig
-QT += network gui-private quick quick-private webkit webkit-private
+QT += network gui-private quick quick-private webkitwidgets webkitwidgets-private
macx: QT += xml
RESOURCES += MiniBrowser.qrc
diff --git a/Tools/MiniBrowser/qt/raw/Target.pri b/Tools/MiniBrowser/qt/raw/Target.pri
index ff9052f2a..afc38ce5f 100644
--- a/Tools/MiniBrowser/qt/raw/Target.pri
+++ b/Tools/MiniBrowser/qt/raw/Target.pri
@@ -9,6 +9,6 @@ SOURCES += \
DESTDIR = $${ROOT_BUILD_DIR}/bin
-QT = core gui network webkit
+QT = core gui network webkitwidgets
WEBKIT += wtf javascriptcore webkit2