summaryrefslogtreecommitdiff
path: root/Tools/MiniBrowser
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-10-17 16:21:14 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-17 16:21:14 +0200
commit8995b83bcbfbb68245f779b64e5517627c6cc6ea (patch)
tree17985605dab9263cc2444bd4d45f189e142cca7c /Tools/MiniBrowser
parentb9c9652036d5e9f1e29c574f40bc73a35c81ace6 (diff)
downloadqtwebkit-8995b83bcbfbb68245f779b64e5517627c6cc6ea.tar.gz
Imported WebKit commit cf4f8fc6f19b0629f51860cb2d4b25e139d07e00 (http://svn.webkit.org/repository/webkit/trunk@131592)
New snapshot that includes the build fixes for Mac OS X 10.6 and earlier as well as the previously cherry-picked changes
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.c647
-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.m253
-rw-r--r--Tools/MiniBrowser/mac/WK2BrowserWindowController.h36
-rw-r--r--Tools/MiniBrowser/mac/WK2BrowserWindowController.m823
-rw-r--r--Tools/MiniBrowser/qt/MiniBrowser.pro2
-rw-r--r--Tools/MiniBrowser/qt/raw/Target.pri2
15 files changed, 1946 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..71796de3c 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,158 @@ 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 void
+on_favicon_received(const char *page_url, Evas_Object *icon, void *event_info)
+{
+ Browser_Window *app_data = (Browser_Window *)event_info;
+ if (strcmp(page_url, ewk_view_url_get(app_data->webview)))
+ return;
+
+ /* Remove previous icon from URL bar */
+ Evas_Object *old_icon = elm_object_part_content_unset(app_data->url_bar, "icon");
+ if (old_icon) {
+ evas_object_unref(old_icon);
+ evas_object_del(old_icon);
+ }
+
+ /* Show new icon in URL bar */
+ if (icon) {
+ /* Workaround for icon display bug:
+ * http://trac.enlightenment.org/e/ticket/1616 */
+ evas_object_size_hint_min_set(icon, 48, 24);
+ evas_object_image_filled_set(icon, EINA_FALSE);
+ evas_object_image_fill_set(icon, 24, 0, 24, 24);
+ elm_object_part_content_set(app_data->url_bar, "icon", icon);
+ evas_object_ref(icon);
+ }
+}
+
+static void
+on_view_icon_changed(void *user_data, Evas_Object *webview, void *event_info)
+{
+ Browser_Window *app_data = (Browser_Window *)user_data;
+ /* Retrieve the view's favicon */
+ Ewk_Context *context = ewk_view_context_get(webview);
+ Ewk_Favicon_Database *icon_database = ewk_context_favicon_database_get(context);
+
+ const char *page_url = ewk_view_url_get(webview);
+ Evas *evas = evas_object_evas_get(webview);
+ ewk_favicon_database_async_icon_get(icon_database, page_url, evas, on_favicon_received, app_data);
+}
+
static int
quit(Eina_Bool success, const char *msg)
{
ewk_shutdown();
+ elm_shutdown();
if (msg)
fputs(msg, (success) ? stdout : stderr);
@@ -211,57 +376,364 @@ 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)
+{
+ Browser_Window *app_data = (Browser_Window *)user_data;
+
+ 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);
+
+ /* Give focus back to the view */
+ view_focus_set(app_data, EINA_TRUE);
+}
+
+static void
+on_url_bar_clicked(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;
+ /* Grab focus from the view */
+ evas_object_focus_set(app_data->webview, EINA_FALSE);
+ elm_object_focus_set(url_bar, EINA_TRUE);
+}
- 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);
+static void
+on_back_button_clicked(void *user_data, Evas_Object *back_button, void *event_info)
+{
+ Browser_Window *app_data = (Browser_Window *)user_data;
- app->evas = ecore_evas_get(app->ee);
+ ewk_view_back(app_data->webview);
+ /* Update back button state */
+ elm_object_disabled_set(back_button, !ewk_view_back_possible(app_data->webview));
+}
- /* 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");
+static void
+on_forward_button_clicked(void *user_data, Evas_Object *forward_button, void *event_info)
+{
+ Browser_Window *app_data = (Browser_Window *)user_data;
+
+ 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);
+ }
+}
+
+static void
+quit_event_loop(void *user_data, Evas_Object *obj, void *event_info)
+{
+ ecore_main_loop_quit();
+}
+
+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);
- 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);
+ /* 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();
+
+ evas_object_del(confirm_popup);
+
+ return ok;
+}
+
+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;
- 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_url_set(app_data->webview, DEFAULT_URL);
+}
- 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
+on_window_deletion(void *user_data, Evas_Object *window, void *event_info)
+{
+ window_close(browser_window_find(window));
+}
- app->url_bar = url_bar_add(app->browser, DEFAULT_WIDTH);
+static Evas_Object *
+create_toolbar_button(Evas_Object *window, const char *icon_name)
+{
+ Evas_Object *button = elm_button_add(window);
- ewk_view_uri_set(app->browser, url);
+ 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 app;
+ return button;
}
-int main(int argc, char *argv[])
+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_scrollbar_policy_set(app_data->url_bar, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ 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, "icon,changed", on_view_icon_changed, 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 +743,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);
@@ -280,24 +754,23 @@ int main(int argc, char *argv[])
if (quitOption)
return quit(EINA_TRUE, NULL);
+ if (evas_engine_name)
+ elm_config_preferred_engine_set(evas_engine_name);
+
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);
+ window = window_create(DEFAULT_URL);
- if (!browser)
- return quit(EINA_FALSE, "ERROR: could not create browser.\n");
+ if (!window)
+ return quit(EINA_FALSE, "ERROR: could not create browser window.\n");
- Ecore_Event_Handler *handle = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, main_signal_exit, 0);
-
- 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..273adb518
--- /dev/null
+++ b/Tools/MiniBrowser/mac/WK1BrowserWindowController.m
@@ -0,0 +1,253 @@
+/*
+ * 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 didCommitLoadForFrame:(WebFrame *)frame
+{
+ if (frame != [sender mainFrame])
+ return;
+
+ NSURL *committedURL = [[[frame dataSource] request] URL];
+ [urlText setStringValue:[committedURL absoluteString]];
+}
+
+- (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..b30b7ff9f
--- /dev/null
+++ b/Tools/MiniBrowser/mac/WK2BrowserWindowController.m
@@ -0,0 +1,823 @@
+/*
+ * 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)updateTextFieldFromURL:(WKURLRef)URLRef
+{
+ if (!URLRef)
+ return;
+
+ static WKURLRef emptyURL = 0;
+ if (!emptyURL)
+ emptyURL = WKURLCreateWithUTF8CString("");
+
+ if (WKURLIsEqual(URLRef, emptyURL)) {
+ WKRelease(URLRef);
+ return;
+ }
+
+ CFURLRef cfSourceURL = WKURLCopyCFURL(0, URLRef);
+ [urlText setStringValue:(NSString*)CFURLGetString(cfSourceURL)];
+ CFRelease(cfSourceURL);
+}
+
+- (void)updateProvisionalURLForFrame:(WKFrameRef)frame
+{
+ WKURLRef url = WKFrameCopyProvisionalURL(frame);
+ [self updateTextFieldFromURL:url];
+ WKRelease(url);
+}
+
+- (void)updateCommittedURLForFrame:(WKFrameRef)frame
+{
+ WKURLRef url = WKFrameCopyURL(frame);
+ [self updateTextFieldFromURL:url];
+ WKRelease(url);
+}
+
+- (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
+{
+ if (!WKFrameIsMainFrame(frame))
+ return;
+
+ [self updateCommittedURLForFrame: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