buffer_callback.c (18739B)
1 2 #include <Elementary.h> 3 #include <EWebKit2.h> 4 5 #include "viking_state.h" 6 #include "viking.h" 7 #include "buffer_callback.h" 8 9 10 typedef struct { 11 Evas_Object *popup; 12 Ewk_Auth_Request *request; 13 Evas_Object *username_entry; 14 Evas_Object *password_entry; 15 } AuthData; 16 17 static void 18 on_ok_clicked(void *user_data, Evas_Object *obj, void *event_info) 19 { 20 Eina_Bool *confirmed = (Eina_Bool *)user_data; 21 *confirmed = EINA_TRUE; 22 23 ecore_main_loop_quit(); 24 } 25 26 static void 27 quit_event_loop(void *user_data, Evas_Object *obj, void *event_info) 28 { 29 ecore_main_loop_quit(); 30 } 31 32 void 33 on_javascript_alert(Ewk_View_Smart_Data *smartData, const char *message) 34 { 35 // Browser_Window *window = browser_view_find(smartData->self); 36 Evas_Object *win = smartData->self; 37 38 Evas_Object *alert_popup = elm_popup_add(win); 39 evas_object_size_hint_weight_set(alert_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 40 elm_object_text_set(alert_popup, message); 41 elm_object_part_text_set(alert_popup, "title,text", "Alert"); 42 43 /* Popup buttons */ 44 Evas_Object *button = elm_button_add(alert_popup); 45 elm_object_text_set(button, "OK"); 46 elm_object_part_content_set(alert_popup, "button1", button); 47 evas_object_smart_callback_add(button, "clicked", quit_event_loop, NULL); 48 elm_object_focus_set(button, EINA_TRUE); 49 evas_object_show(alert_popup); 50 51 /* Make modal */ 52 ecore_main_loop_begin(); 53 54 evas_object_del(alert_popup); 55 } 56 57 Eina_Bool 58 on_javascript_confirm(Ewk_View_Smart_Data *smartData, const char *message) 59 { 60 // Browser_Window *window = browser_view_find(smartData->self); 61 Evas_Object *win = smartData->self; 62 63 Eina_Bool ok = EINA_FALSE; 64 65 Evas_Object *confirm_popup = elm_popup_add(win); 66 evas_object_size_hint_weight_set(confirm_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 67 elm_object_text_set(confirm_popup, message); 68 elm_object_part_text_set(confirm_popup, "title,text", "Confirmation"); 69 70 /* Popup buttons */ 71 Evas_Object *cancel_button = elm_button_add(confirm_popup); 72 elm_object_text_set(cancel_button, "Cancel"); 73 elm_object_part_content_set(confirm_popup, "button1", cancel_button); 74 evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL); 75 Evas_Object *ok_button = elm_button_add(confirm_popup); 76 elm_object_text_set(ok_button, "OK"); 77 elm_object_part_content_set(confirm_popup, "button2", ok_button); 78 evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok); 79 elm_object_focus_set(ok_button, EINA_TRUE); 80 evas_object_show(confirm_popup); 81 82 /* Make modal */ 83 ecore_main_loop_begin(); 84 85 evas_object_del(confirm_popup); 86 87 return ok; 88 } 89 90 const char * 91 on_javascript_prompt(Ewk_View_Smart_Data *smartData, const char *message, const char *default_value) 92 { 93 // Browser_Window *window = browser_view_find(smartData->self); 94 Evas_Object *win = smartData->self; 95 96 Eina_Bool ok = EINA_FALSE; 97 98 Evas_Object *prompt_popup = elm_popup_add(win); 99 evas_object_size_hint_weight_set(prompt_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 100 elm_object_part_text_set(prompt_popup, "title,text", "Prompt"); 101 102 /* Popup Content */ 103 Evas_Object *box = elm_box_add(win); 104 elm_box_padding_set(box, 0, 4); 105 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 106 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); 107 evas_object_show(box); 108 109 Evas_Object *prompt = elm_label_add(win); 110 elm_object_text_set(prompt, message); 111 evas_object_size_hint_weight_set(prompt, EVAS_HINT_EXPAND, 0.0); 112 evas_object_size_hint_align_set(prompt, EVAS_HINT_FILL, 0.5); 113 elm_box_pack_end(box, prompt); 114 evas_object_show(prompt); 115 116 Evas_Object *entry = elm_entry_add(win); 117 elm_entry_scrollable_set(entry, EINA_TRUE); 118 elm_entry_single_line_set(entry, EINA_TRUE); 119 elm_entry_text_style_user_push(entry, "DEFAULT='font_size=18'"); 120 elm_entry_entry_set(entry, default_value ? default_value : ""); 121 elm_entry_select_all(entry); 122 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0); 123 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5); 124 elm_box_pack_end(box, entry); 125 elm_object_focus_set(entry, EINA_TRUE); 126 evas_object_show(entry); 127 128 elm_object_content_set(prompt_popup, box); 129 130 /* Popup buttons */ 131 Evas_Object *cancel_button = elm_button_add(prompt_popup); 132 elm_object_text_set(cancel_button, "Cancel"); 133 elm_object_part_content_set(prompt_popup, "button1", cancel_button); 134 evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL); 135 Evas_Object *ok_button = elm_button_add(prompt_popup); 136 elm_object_text_set(ok_button, "OK"); 137 elm_object_part_content_set(prompt_popup, "button2", ok_button); 138 evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok); 139 evas_object_show(prompt_popup); 140 141 /* Make modal */ 142 ecore_main_loop_begin(); 143 144 /* The return string need to be stringshared */ 145 const char *prompt_text = ok ? eina_stringshare_add(elm_entry_entry_get(entry)) : NULL; 146 evas_object_del(prompt_popup); 147 148 return prompt_text; 149 } 150 151 Eina_Bool 152 on_window_geometry_get(Ewk_View_Smart_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *width, Evas_Coord *height) 153 { 154 // Browser_Window *window = browser_view_find(sd->self); 155 Evas_Object *win = sd->self; 156 157 evas_object_geometry_get(win, x, y, width, height); 158 159 return EINA_TRUE; 160 } 161 162 Eina_Bool 163 on_window_geometry_set(Ewk_View_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord width, Evas_Coord height) 164 { 165 // Browser_Window *window = browser_view_find(sd->self); 166 Evas_Object *win = sd->self; 167 168 evas_object_move(win, x, y); 169 evas_object_resize(win, width, height); 170 171 return EINA_TRUE; 172 } 173 174 #if 0 175 typedef struct { 176 Evas_Object *webview; 177 Evas_Object *permission_popup; 178 } PermissionData; 179 180 static void 181 on_fullscreen_accept(void *user_data, Evas_Object *obj, void *event_info) 182 { 183 PermissionData *permission_data = (PermissionData *)user_data; 184 185 evas_object_del(permission_data->permission_popup); 186 free(permission_data); 187 } 188 189 static void 190 on_fullscreen_deny(void *user_data, Evas_Object *obj, void *event_info) 191 { 192 PermissionData *permission_data = (PermissionData *)user_data; 193 194 ewk_view_fullscreen_exit(permission_data->webview); 195 evas_object_del(permission_data->permission_popup); 196 free(permission_data); 197 } 198 199 static Eina_Bool on_fullscreen_enter(Ewk_View_Smart_Data *sd, Ewk_Security_Origin *origin) 200 { 201 // Browser_Window *window = browser_view_find(sd->self); 202 Evas_Object *win = sd->self; 203 204 /* Go fullscreen */ 205 elm_win_fullscreen_set(win, EINA_TRUE); 206 207 /* Show user popup */ 208 Evas_Object *permission_popup = elm_popup_add(win); 209 evas_object_size_hint_weight_set(permission_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 210 211 Eina_Strbuf *message = eina_strbuf_new(); 212 eina_strbuf_append_printf(message, "%s is now fullscreen.<br>Press ESC at any time to exit fullscreen.<br>Allow fullscreen?", ewk_security_origin_host_get(origin)); 213 elm_object_text_set(permission_popup, eina_strbuf_string_get(message)); 214 eina_strbuf_free(message); 215 elm_object_part_text_set(permission_popup, "title,text", "Fullscreen Permission"); 216 217 /* Popup buttons */ 218 PermissionData *permission_data = (PermissionData *)malloc(sizeof(PermissionData)); 219 permission_data->webview = window->webview; 220 permission_data->permission_popup = permission_popup; 221 Evas_Object *accept_button = elm_button_add(permission_popup); 222 elm_object_text_set(accept_button, "Accept"); 223 elm_object_part_content_set(permission_popup, "button1", accept_button); 224 evas_object_smart_callback_add(accept_button, "clicked", on_fullscreen_accept, permission_data); 225 226 Evas_Object *deny_button = elm_button_add(permission_popup); 227 elm_object_text_set(deny_button, "Deny"); 228 elm_object_part_content_set(permission_popup, "button2", deny_button); 229 evas_object_smart_callback_add(deny_button, "clicked", on_fullscreen_deny, permission_data); 230 231 evas_object_show(permission_popup); 232 233 return EINA_TRUE; 234 } 235 236 static Eina_Bool on_fullscreen_exit(Ewk_View_Smart_Data *sd) 237 { 238 // Browser_Window *window = browser_view_find(sd->self); 239 Evas_Object *win = sd->self; 240 241 elm_win_fullscreen_set(win, EINA_FALSE); 242 243 return EINA_TRUE; 244 } 245 #endif 246 247 void 248 webprocess_crashed_cb(void *data, Evas_Object *obj, void *event_info) 249 { 250 Window_Data *wd = data; 251 // Eina_Bool *handled = event_info; 252 253 const char script[] = "\ 254 var txtNode = document.createTextNode(\"Helllllllllllllllllloooooooooo\");\ 255 document.appendChild(txtNode);"; 256 257 ewk_view_script_execute(wd->cur_buf->view, script, NULL, NULL); 258 /* *handled = EINA_TRUE; try this in callback maybe? */ 259 } 260 261 static void 262 auth_popup_close(AuthData *auth_data) 263 { 264 ewk_object_unref(auth_data->request); 265 evas_object_del(auth_data->popup); 266 free(auth_data); 267 } 268 269 static void 270 on_auth_cancel(void *user_data, Evas_Object *obj, void *event_info) 271 { 272 AuthData *auth_data = (AuthData *)user_data; 273 274 ewk_auth_request_cancel(auth_data->request); 275 276 auth_popup_close(auth_data); 277 } 278 279 static void 280 on_auth_ok(void *user_data, Evas_Object *obj, void *event_info) 281 { 282 AuthData *auth_data = (AuthData *)user_data; 283 284 const char *username = elm_entry_entry_get(auth_data->username_entry); 285 const char *password = elm_entry_entry_get(auth_data->password_entry); 286 ewk_auth_request_authenticate(auth_data->request, username, password); 287 288 auth_popup_close(auth_data); 289 } 290 291 void 292 on_authentication_request(void *user_data, Evas_Object *obj, void *event_info) 293 { 294 // Browser_Window *window = (Browser_Window *)user_data; 295 Window_Data *wd = user_data; 296 Ewk_Auth_Request *request = ewk_object_ref((Ewk_Auth_Request *)event_info); 297 298 AuthData *auth_data = (AuthData *)malloc(sizeof(AuthData)); 299 auth_data->request = request; 300 301 Evas_Object *auth_popup = elm_popup_add(wd->win); 302 auth_data->popup = auth_popup; 303 evas_object_size_hint_weight_set(auth_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 304 elm_object_part_text_set(auth_popup, "title,text", "Authentication Required"); 305 306 /* Popup Content */ 307 Evas_Object *vbox = elm_box_add(auth_popup); 308 elm_box_padding_set(vbox, 0, 4); 309 evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 310 evas_object_size_hint_align_set(vbox, EVAS_HINT_FILL, EVAS_HINT_FILL); 311 elm_object_content_set(auth_popup, vbox); 312 evas_object_show(vbox); 313 314 /* Authentication message */ 315 Evas_Object *label = elm_label_add(auth_popup); 316 elm_label_line_wrap_set(label, ELM_WRAP_WORD); 317 Eina_Strbuf *auth_text = eina_strbuf_new(); 318 const char* host = ewk_auth_request_host_get(request); 319 const char* realm = ewk_auth_request_realm_get(request); 320 eina_strbuf_append_printf(auth_text, "A username and password are being requested by %s. The site says: \"%s\"", host, realm ? realm : ""); 321 elm_object_text_set(label, eina_strbuf_string_get(auth_text)); 322 eina_strbuf_free(auth_text); 323 evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 324 evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); 325 elm_box_pack_end(vbox, label); 326 evas_object_show(label); 327 328 /* Credential table */ 329 Evas_Object *table = elm_table_add(auth_popup); 330 elm_table_padding_set(table, 2, 2); 331 elm_table_homogeneous_set(table, EINA_TRUE); 332 evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 333 evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); 334 elm_box_pack_end(vbox, table); 335 evas_object_show(table); 336 337 /* Username row */ 338 Evas_Object *username_label = elm_label_add(auth_popup); 339 elm_object_text_set(username_label, "Username:"); 340 evas_object_size_hint_weight_set(username_label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 341 evas_object_size_hint_align_set(username_label, 1, EVAS_HINT_FILL); 342 elm_table_pack(table, username_label, 0, 0, 1, 1); 343 evas_object_show(username_label); 344 345 Evas_Object *username_entry = elm_entry_add(auth_popup); 346 auth_data->username_entry = username_entry; 347 elm_entry_scrollable_set(username_entry, EINA_TRUE); 348 elm_entry_single_line_set(username_entry, EINA_TRUE); 349 elm_entry_text_style_user_push(username_entry, "DEFAULT='font_size=18'"); 350 const char *suggested_username = ewk_auth_request_suggested_username_get(request); 351 elm_entry_entry_set(username_entry, suggested_username ? suggested_username : ""); 352 evas_object_size_hint_weight_set(username_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 353 evas_object_size_hint_align_set(username_entry, EVAS_HINT_FILL, EVAS_HINT_FILL); 354 elm_table_pack(table, username_entry, 1, 0, 2, 1); 355 elm_object_focus_set(username_entry, EINA_TRUE); 356 evas_object_show(username_entry); 357 358 /* Password row */ 359 Evas_Object *password_label = elm_label_add(auth_popup); 360 elm_object_text_set(password_label, "Password:"); 361 evas_object_size_hint_weight_set(password_label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 362 evas_object_size_hint_align_set(password_label, 1, EVAS_HINT_FILL); 363 elm_table_pack(table, password_label, 0, 1, 1, 1); 364 evas_object_show(password_label); 365 366 Evas_Object *password_entry = elm_entry_add(auth_popup); 367 auth_data->password_entry = password_entry; 368 elm_entry_scrollable_set(password_entry, EINA_TRUE); 369 elm_entry_single_line_set(password_entry, EINA_TRUE); 370 elm_entry_password_set(password_entry, EINA_TRUE); 371 elm_entry_text_style_user_push(password_entry, "DEFAULT='font_size=18'"); 372 evas_object_size_hint_weight_set(password_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 373 evas_object_size_hint_align_set(password_entry, EVAS_HINT_FILL, EVAS_HINT_FILL); 374 elm_table_pack(table, password_entry, 1, 1, 2, 1); 375 evas_object_show(password_entry); 376 377 /* Popup buttons */ 378 Evas_Object *cancel_button = elm_button_add(auth_popup); 379 elm_object_text_set(cancel_button, "Cancel"); 380 elm_object_part_content_set(auth_popup, "button1", cancel_button); 381 evas_object_smart_callback_add(cancel_button, "clicked", on_auth_cancel, auth_data); 382 Evas_Object *ok_button = elm_button_add(auth_popup); 383 elm_object_text_set(ok_button, "OK"); 384 elm_object_part_content_set(auth_popup, "button2", ok_button); 385 evas_object_smart_callback_add(ok_button, "clicked", on_auth_ok, auth_data); 386 evas_object_show(auth_popup); 387 } 388 389 void 390 on_tooltip_text_set(void *user_data, Evas_Object *obj, void *event_info) 391 { 392 Window_Data *wd = user_data; 393 const char* message = (const char*)event_info; 394 395 elm_object_tooltip_text_set(wd->cur_buf->view, message); 396 elm_object_tooltip_show(wd->cur_buf->view); 397 } 398 399 void 400 on_tooltip_text_unset(void *user_data, Evas_Object *obj, void *event_info) 401 { 402 Window_Data *wd = user_data; 403 404 elm_object_tooltip_unset(wd->cur_buf->view); 405 } 406 407 typedef struct { 408 Evas_Object *parent; 409 Evas_Object *window; 410 Ewk_File_Chooser_Request *request; 411 } FileSelectorData; 412 413 static void on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event); 414 415 static void close_file_picker(FileSelectorData* fs_data) 416 { 417 evas_object_event_callback_del(fs_data->parent, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion); 418 evas_object_del(fs_data->window); 419 ewk_object_unref(fs_data->request); 420 free(fs_data); 421 } 422 423 static void 424 on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event) 425 { 426 close_file_picker((FileSelectorData *)user_data); 427 } 428 429 static void 430 on_filepicker_deletion(void *user_data, Evas_Object *window, void *event_info) 431 { 432 close_file_picker((FileSelectorData *)user_data); 433 } 434 435 static void 436 on_fileselector_done(void *user_data, Evas_Object *file_selector, void *event_info) 437 { 438 FileSelectorData *fs_data = (FileSelectorData *)user_data; 439 440 const char *selected = (const char *)event_info; 441 if (selected && *selected) 442 ewk_file_chooser_request_file_choose(fs_data->request, selected); 443 444 close_file_picker(fs_data); 445 } 446 447 void 448 on_file_chooser_request(void *user_data, Evas_Object *webview, void *event_info) 449 { 450 // Browser_Window *app_data = (Browser_Window *)user_data; 451 Window_Data *wd = user_data; 452 Ewk_File_Chooser_Request *request = (Ewk_File_Chooser_Request *)event_info; 453 454 // Show basic file picker which does not currently support multiple files 455 // or MIME type filtering. 456 Evas_Object *window = elm_win_add(wd->win, "file-picker-window", ELM_WIN_DIALOG_BASIC); 457 elm_win_title_set(window, "File picker"); 458 elm_win_modal_set(window, EINA_TRUE); 459 460 FileSelectorData* fs_data = (FileSelectorData*)malloc(sizeof(FileSelectorData)); 461 fs_data->parent = wd->win; 462 fs_data->window = window; 463 fs_data->request = ewk_object_ref(request); 464 evas_object_smart_callback_add(window, "delete,request", on_filepicker_deletion, fs_data); 465 evas_object_event_callback_add(wd->win, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion, fs_data); 466 467 Evas_Object *file_selector = elm_fileselector_add(window); 468 const char *home_path = getenv("HOME"); 469 elm_fileselector_path_set(file_selector, home_path ? home_path : "/home"); 470 evas_object_size_hint_weight_set(file_selector, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); 471 elm_win_resize_object_add(window, file_selector); 472 evas_object_show(file_selector); 473 474 evas_object_smart_callback_add(file_selector, "done", on_fileselector_done, fs_data); 475 476 evas_object_resize(window, 400, 400); 477 elm_win_center(window, EINA_TRUE, EINA_TRUE); 478 evas_object_show(window); 479 } 480 481 /* 482 static void 483 hoverlink_cb(void *data, Evas_Object *obj, void *event_info) 484 { 485 Buffer_Data *td = data; 486 const char *uri = ewk_view_uri_get(td->view); 487 // event_info is a char *link[2] where the first string contains the URL 488 // and the second the title of the link 489 char **link = event_info; 490 // char *markup; 491 492 memset(td->window->rememberedURI, 0, 1024); 493 if (link && link[0]) { 494 // markup = g_markup_printf_escaped("<span font=\"%s\">Link: %s</span>", statusfont, link[0]); 495 // markup = strdup_printf("<font=Monospace font_size=10 color=#FF0>%s", link[0]); 496 // gtk_label_set_markup(GTK_LABEL(td->app->status_url), markup); 497 // elm_object_text_set(td->app->status_url, markup); 498 update_url(link[0], td->window); 499 strcpy(td->window->rememberedURI, link[0]); 500 // free(markup); 501 } else 502 update_url(uri, td->window); 503 } 504 505 static void 506 hoverlink_out_cb(void *data, Evas_Object *obj, void *event_info) 507 { 508 Buffer_Data *td = data; 509 update_url(ewk_view_uri_get(td->view), td->window); 510 } 511 512 static void 513 inputmethod_changed_cb(void *data, Evas_Object *obj, void *event_info) 514 { 515 const char *value = NULL; 516 Eina_Bool *enabled = event_info; 517 Buffer_Data *bd = data; 518 Window_Data *wd = bd->window; 519 // Evas_Object *frame = ewk_view_frame_main_get(bd->view); 520 521 printf("inputmethod_changed()\n"); 522 523 if (wd->mode == ModeNormal && enabled) { 524 Arg a = { .i = ModeInsert }; 525 set(&a, wd); 526 wd->manual_focus = TRUE; 527 } else if (wd->mode == ModeInsert && !enabled) { 528 Arg a = { .i = ModeNormal }; 529 set(&a, wd); 530 } else { 531 // char *value = NULL, *message = NULL; 532 // jsapi_evaluate_script("window.getSelection().focusNode", &value, &message, ad); 533 // value = ewk_frame_script_execute(frame, "window.getSelection().focusNode"); 534 if (value && !strcmp(value, "[object HTMLFormElement]")) { 535 Arg a = { .i = ModeInsert, .s = NULL }; 536 set(&a, wd); 537 wd->manual_focus = TRUE; 538 } 539 // free(value); 540 eina_stringshare_del(value); 541 // free(message); 542 } 543 } 544 */ 545