Browse Source

😒

sisyphus
Dustin Falgout 9 years ago
parent
commit
f9ca7ce81b
  1. 113
      src/greeter.c
  2. 59
      src/webkit2-extension.c

113
src/greeter.c

@ -53,6 +53,7 @@ static GtkWidget *web_view;
static GtkWidget *window; static GtkWidget *window;
static WebKitSettings *webkit_settings; static WebKitSettings *webkit_settings;
static GdkDisplay *default_display; static GdkDisplay *default_display;
static GResource *greeter_resources;
/* Screensaver values */ /* Screensaver values */
static int timeout, interval, prefer_blanking, allow_exposures; static int timeout, interval, prefer_blanking, allow_exposures;
@ -61,6 +62,7 @@ static gint config_timeout;
static gboolean debug_mode, heartbeat, heartbeat_exit; static gboolean debug_mode, heartbeat, heartbeat_exit;
static GdkFilterReturn static GdkFilterReturn
wm_window_filter(GdkXEvent *gxevent, GdkEvent *event, gpointer data) { wm_window_filter(GdkXEvent *gxevent, GdkEvent *event, gpointer data) {
XEvent *xevent = (XEvent *) gxevent; XEvent *xevent = (XEvent *) gxevent;
@ -106,7 +108,7 @@ create_new_webkit_settings_object(void) {
"javascript-can-open-windows-automatically", TRUE, "javascript-can-open-windows-automatically", TRUE,
"allow-file-access-from-file-urls", TRUE, "allow-file-access-from-file-urls", TRUE,
"enable-write-console-messages-to-stdout", TRUE, "enable-write-console-messages-to-stdout", TRUE,
//"allow-universal-access-from-file-urls", TRUE, "allow-universal-access-from-file-urls", TRUE,
NULL NULL
); );
} }
@ -128,17 +130,17 @@ context_menu_cb(WebKitWebView *view,
static gboolean static gboolean
check_theme_heartbeat_cb(void) { check_theme_heartbeat(void) {
if (! heartbeat && ! heartbeat_exit) { if (! heartbeat && ! heartbeat_exit) {
/* Theme heartbeat not received. We assume that an error has occurred /* Theme heartbeat not received. We assume that an error has occurred
* which broke script execution. We will fallback to the simple theme * which broke script execution. We will fallback to the simple theme
* so the user won't be stuck with a broken login screen. * so the user won't be stuck with a broken login screen.
*/ */
g_warning("[ERROR] :: A problem was detected with the current theme. Falling back to simple theme..."); g_warning("[ERROR] :: A problem was detected with the current theme. Falling back to simple theme...");
webkit_web_view_load_uri( webkit_web_view_load_uri(
WEBKIT_WEB_VIEW(web_view), WEBKIT_WEB_VIEW(web_view),
g_strdup_printf("file://%s/simple/index.html", THEME_DIR) g_strdup_printf("file://%s/simple/index.html", THEME_DIR)
); );
} }
heartbeat = FALSE; heartbeat = FALSE;
@ -148,17 +150,13 @@ check_theme_heartbeat_cb(void) {
/** /**
* Callback for Theme Heartbeat. Themes start the heartbeat by sending a post message * Callback for Theme Heartbeat.
* via JavaScript. Once started, the heartbeat will schedule a check to ensure that the
* theme has sent a subsequent heartbeat message. Once started, if a heartbeat message was not
* received by the time our check runs we assume that there has been an error in the web
* process and fallback to the simple theme.
*/ */
static void static void
theme_heartbeat_cb(void) { theme_heartbeat_handler(void) {
if (! heartbeat) { if (! heartbeat) {
/* Setup g_timeout callback for theme heartbeat check */ /* Setup g_timeout callback for theme heartbeat check */
g_timeout_add_seconds(8, (GSourceFunc) check_theme_heartbeat_cb, NULL); g_timeout_add_seconds(8, (GSourceFunc) check_theme_heartbeat, NULL);
heartbeat = TRUE; heartbeat = TRUE;
heartbeat_exit = FALSE; heartbeat_exit = FALSE;
} }
@ -166,20 +164,49 @@ theme_heartbeat_cb(void) {
/** /**
* Heartbeat exit callback. * Before starting the user's session, the web process will send a signal to exit the hearbeat
* * in order to prevent a race condition while the greeter is shutting down.
* Before starting the user's session, themes should exit the heartbeat
* to prevent a race condition while the greeter is shutting down.
*/ */
static void static void
theme_heartbeat_exit_cb(void) { theme_heartbeat_exit_handler(void) {
heartbeat_exit = TRUE; heartbeat_exit = TRUE;
} }
static void
theme_heartbeat_script_loaded_cb(GObject *object,
GAsyncResult *result,
gpointer user_data) {
WebKitJavascriptResult *js_result;
JSValueRef value;
JSGlobalContextRef context;
GError *error = NULL;
js_result = webkit_web_view_run_javascript_from_gresource_finish(
WEBKIT_WEB_VIEW(object),
result,
&error
);
if (!js_result) {
g_warning("Error running javascript: %s", error->message);
g_error_free(error);
return;
}
context = webkit_javascript_result_get_global_context(js_result);
value = webkit_javascript_result_get_value(js_result);
if (! JSValueIsNull(context, value) && ! JSValueIsUndefined(context, value)) {
g_warning("Error running javascript: unexpected return value.");
}
webkit_javascript_result_unref(js_result);
}
/** /**
* Lock Hint enabled handler.
*
* Makes the greeter behave a bit more like a screensaver if it was launched as * Makes the greeter behave a bit more like a screensaver if it was launched as
* a lock-screen by blanking the screen. * a lock-screen by blanking the screen.
*/ */
@ -194,6 +221,25 @@ lock_hint_enabled_handler(void) {
} }
static void
load_theme_heartbeat_script() {
webkit_web_view_run_javascript_from_gresource(
WEBKIT_WEB_VIEW(web_view),
"/com/antergos/lightdm-webkit2-greeter/js/heartbeat.js",
NULL,
(GAsyncReadyCallback) theme_heartbeat_script_loaded_cb,
NULL
);
}
static void
page_loaded_handler(void) {
load_theme_heartbeat_script();
}
/** /**
* Message received callback. * Message received callback.
* *
@ -229,12 +275,17 @@ message_received_cb(WebKitUserContentManager *manager,
printf("Error running javascript: unexpected return value"); printf("Error running javascript: unexpected return value");
} }
if (strcmp(message_str, "LockHint") == 0) { if (strcmp(message_str, "PageLoaded") == 0) {
page_loaded_handler();
} else if (strcmp(message_str, "LockHint") == 0) {
lock_hint_enabled_handler(); lock_hint_enabled_handler();
} else if (strcmp(message_str, "Heartbeat") == 0) { } else if (strcmp(message_str, "Heartbeat") == 0) {
theme_heartbeat_cb(); theme_heartbeat_handler();
} else if (strcmp(message_str, "Heartbeat::Exit") == 0) { } else if (strcmp(message_str, "Heartbeat::Exit") == 0) {
theme_heartbeat_exit_cb(); theme_heartbeat_exit_handler();
} }
g_free(message_str); g_free(message_str);
@ -276,7 +327,6 @@ main(int argc, char **argv) {
WebKitWebContext *context; WebKitWebContext *context;
GtkCssProvider *css_provider; GtkCssProvider *css_provider;
WebKitCookieManager *cookie_manager; WebKitCookieManager *cookie_manager;
GResource *greeter_resources;
/* Prevent memory from being swapped out, since we see unencrypted passwords. */ /* Prevent memory from being swapped out, since we see unencrypted passwords. */
mlockall (MCL_CURRENT | MCL_FUTURE); mlockall (MCL_CURRENT | MCL_FUTURE);
@ -326,7 +376,10 @@ main(int argc, char **argv) {
css_provider = gtk_css_provider_new(); css_provider = gtk_css_provider_new();
g_resources_register(greeter_resources); g_resources_register(greeter_resources);
gtk_css_provider_load_from_resource(css_provider, "/com/antergos/lightdm-webkit2-greeter/css/style.css"); gtk_css_provider_load_from_resource(
css_provider,
"/com/antergos/lightdm-webkit2-greeter/css/style.css"
);
gtk_style_context_add_provider_for_screen( gtk_style_context_add_provider_for_screen(
screen, screen,
GTK_STYLE_PROVIDER(css_provider), GTK_STYLE_PROVIDER(css_provider),

59
src/webkit2-extension.c

@ -45,7 +45,6 @@
#include <lightdm.h> #include <lightdm.h>
#include <config.h> #include <config.h>
#include "gresource/greeter-resources.h"
G_MODULE_EXPORT void webkit_web_extension_initialize(WebKitWebExtension *extension); G_MODULE_EXPORT void webkit_web_extension_initialize(WebKitWebExtension *extension);
@ -74,8 +73,6 @@ static JSClassRef
config_file_class, config_file_class,
greeter_util_class; greeter_util_class;
static GResource *greeter_resources;
/* /*
* Returns either a string or null. * Returns either a string or null.
@ -1448,36 +1445,6 @@ static const JSClassDefinition greeter_util_definition = {
}; };
static void
inject_theme_heartbeat_script(JSGlobalContextRef jsContext) {
JSStringRef command;
GBytes *resource;
GError *err = NULL;
gsize *size = NULL;
greeter_resources = greeter_resources_get_resource();
resource = g_resource_lookup_data(
greeter_resources,
"/com/antergos/lightdm-webkit2-greeter/js/heartbeat.js",
0,
&err
);
if (NULL != err) {
fprintf(stderr, "Loading heartbeat.js from GResource failed: %s\n", err->message);
g_error_free(err);
return;
}
command = JSStringCreateWithCharacters(g_bytes_unref_to_data(resource, size), sizeof size);
JSEvaluateScript(jsContext, command, NULL, NULL, 0, NULL);
g_object_unref(resource);
g_free(size);
}
static void static void
window_object_cleared_callback(WebKitScriptWorld *world, window_object_cleared_callback(WebKitScriptWorld *world,
WebKitWebPage *web_page, WebKitWebPage *web_page,
@ -1494,7 +1461,8 @@ window_object_cleared_callback(WebKitScriptWorld *world,
globalObject; globalObject;
JSStringRef command; JSStringRef command;
JSStringRef heartbeat_command; JSStringRef heartbeat_command;
gchar *message = "LockHint"; gchar *lock_hint_message = "LockHint";
gchar *page_loaded_message = "PageLoaded";
jsContext = webkit_frame_get_javascript_context_for_script_world(frame, world); jsContext = webkit_frame_get_javascript_context_for_script_world(frame, world);
globalObject = JSContextGetGlobalObject(jsContext); globalObject = JSContextGetGlobalObject(jsContext);
@ -1544,25 +1512,22 @@ window_object_cleared_callback(WebKitScriptWorld *world,
command = JSStringCreateWithUTF8CString("window.greeterutil = greeter_util;"); command = JSStringCreateWithUTF8CString("window.greeterutil = greeter_util;");
JSEvaluateScript(jsContext, command, NULL, NULL, 0, NULL); JSEvaluateScript(jsContext, command, NULL, NULL, 0, NULL);
/* Inject GreeterThemeHeartbeat class */ dom_document = webkit_web_page_get_dom_document(web_page);
inject_theme_heartbeat_script(jsContext); dom_window = webkit_dom_document_get_default_view(dom_document);
/* Start the heartbeat */ if (dom_window) {
heartbeat_command = JSStringCreateWithUTF8CString("new GreeterThemeHeartbeat();"); /* Notify the UI process that the page is loaded */
JSEvaluateScript(jsContext, heartbeat_command, NULL, NULL, 0, NULL); webkit_dom_dom_window_webkit_message_handlers_post_message(
dom_window, "GreeterBridge", page_loaded_message
);
/* If the greeter was started as a lock-screen, notify our UI process. */ /* If the greeter was started as a lock-screen, notify our UI process. */
if (lightdm_greeter_get_lock_hint(greeter)) { if (lightdm_greeter_get_lock_hint(greeter)) {
dom_document = webkit_web_page_get_dom_document(web_page);
dom_window = webkit_dom_document_get_default_view(dom_document);
if (dom_window) {
webkit_dom_dom_window_webkit_message_handlers_post_message( webkit_dom_dom_window_webkit_message_handlers_post_message(
dom_window, "GreeterBridge", message dom_window, "GreeterBridge", lock_hint_message
); );
} }
} }
} }

Loading…
Cancel
Save