static void webview_set_history(lua_State *L, WebKitWebView *view, gint idx) { gint pos, bflen; WebKitWebBackForwardList *bflist; WebKitWebHistoryItem *item = NULL; gchar *uri = NULL; if(!lua_istable(L, idx)) luaL_error(L, "invalid history table"); /* get history items table */ lua_pushliteral(L, "items"); lua_rawget(L, idx); bflen = lua_objlen(L, -1); /* create new back-forward history list */ bflist = webkit_web_back_forward_list_new_with_web_view(view); webkit_web_back_forward_list_clear(bflist); /* get position of current history item */ lua_pushliteral(L, "index"); lua_rawget(L, idx); pos = (gint)lua_tonumber(L, -1); /* load last item if out of range */ pos = (pos < 1 || pos > bflen) ? 0 : pos - bflen; lua_pop(L, 1); /* now we actually set the history to the content of the list */ for (gint i = 1; i <= bflen; i++) { lua_rawgeti(L, -1, i); lua_pushliteral(L, "title"); lua_rawget(L, -2); lua_pushliteral(L, "uri"); lua_rawget(L, -3); if (pos || i < bflen) { item = webkit_web_history_item_new_with_data(lua_tostring(L, -1), NONULL(lua_tostring(L, -2))); webkit_web_back_forward_list_add_item(bflist, item); } else uri = g_strdup(lua_tostring(L, -1)); lua_pop(L, 3); } /* load last item */ if (uri) { webkit_web_view_load_uri(view, uri); g_free(uri); /* load item in history */ } else if (bflen && webkit_web_view_can_go_back_or_forward(view, pos)) { webkit_web_view_go_back_or_forward(view, pos); /* load "about:blank" on empty history list */ } else webkit_web_view_load_uri(view, "about:blank"); lua_pop(L, 1); }
static void wxgtk_webview_webkit_load_status(GtkWidget* widget, GParamSpec*, wxWebViewWebKit *webKitCtrl) { if (!webKitCtrl->m_ready) return; wxString url = webKitCtrl->GetCurrentURL(); WebKitLoadStatus status; g_object_get(G_OBJECT(widget), "load-status", &status, NULL); wxString target; // TODO: get target (if possible) if (status == WEBKIT_LOAD_FINISHED) { WebKitWebBackForwardList* hist = webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(widget)); WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_current_item(hist); //We have to check if we are actually storing history //If the item isn't added we add it ourselves, it isn't added otherwise //with a custom scheme. if(WEBKIT_IS_WEB_HISTORY_ITEM(item) && webkit_web_history_item_get_uri(item) != url) { WebKitWebHistoryItem* newitem = webkit_web_history_item_new_with_data ( url.utf8_str(), webKitCtrl->GetCurrentTitle().utf8_str() ); webkit_web_back_forward_list_add_item(hist, newitem); } webKitCtrl->m_busy = false; wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, webKitCtrl->GetId(), url, target); if (webKitCtrl && webKitCtrl->GetEventHandler()) webKitCtrl->GetEventHandler()->ProcessEvent(event); } else if (status == WEBKIT_LOAD_COMMITTED) { webKitCtrl->m_busy = true; wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, webKitCtrl->GetId(), url, target); if (webKitCtrl && webKitCtrl->GetEventHandler()) webKitCtrl->GetEventHandler()->ProcessEvent(event); } }
void LayoutTestController::clearBackForwardList() { WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame); WebKitWebBackForwardList* list = webkit_web_view_get_back_forward_list(webView); WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_current_item(list); g_object_ref(item); // We clear the history by setting the back/forward list's capacity to 0 // then restoring it back and adding back the current item. gint limit = webkit_web_back_forward_list_get_limit(list); webkit_web_back_forward_list_set_limit(list, 0); webkit_web_back_forward_list_set_limit(list, limit); webkit_web_back_forward_list_add_item(list, item); webkit_web_back_forward_list_go_to_item(list, item); g_object_unref(item); }
static void test_webkit_web_back_forward_list_clear(void) { WebKitWebView* webView; WebKitWebBackForwardList* webBackForwardList; WebKitWebHistoryItem* addItem; g_test_bug("36173"); webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_object_ref_sink(webView); webBackForwardList = webkit_web_view_get_back_forward_list(webView); g_assert(webBackForwardList); // Check that there is no item. g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0); g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0); g_assert(!webkit_web_back_forward_list_get_current_item(webBackForwardList)); g_assert(!webkit_web_view_can_go_forward(webView)); g_assert(!webkit_web_view_can_go_back(webView)); // Check that clearing the empty list does not modify counters webkit_web_back_forward_list_clear(webBackForwardList); g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0); g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0); g_assert(!webkit_web_back_forward_list_get_current_item(webBackForwardList)); g_assert(!webkit_web_view_can_go_forward(webView)); g_assert(!webkit_web_view_can_go_back(webView)); // Add a new item addItem = webkit_web_history_item_new_with_data("http://example.com/", "Added site"); webkit_web_back_forward_list_add_item(webBackForwardList, addItem); g_object_unref(addItem); g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, addItem)); // Check that after clearing the list the added item is no longer in the list webkit_web_back_forward_list_clear(webBackForwardList); g_assert(!webkit_web_back_forward_list_contains_item(webBackForwardList, addItem)); // Check that after clearing it, the list is empty g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0); g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0); g_assert(!webkit_web_back_forward_list_get_current_item(webBackForwardList)); g_assert(!webkit_web_view_can_go_forward(webView)); g_assert(!webkit_web_view_can_go_back(webView)); g_object_unref(webView); }
static void test_webkit_web_history_item_lifetime(void) { WebKitWebView* webView; WebKitWebBackForwardList* backForwardList; WebKitWebHistoryItem* currentItem; WebKitWebHistoryItem* forwardItem; WebKitWebHistoryItem* backItem; WebKitWebHistoryItem* nthItem; WebKitWebHistoryItem* item1; WebKitWebHistoryItem* item2; WebKitWebHistoryItem* item3; WebKitWebHistoryItem* item4; GList* backList = NULL; GList* forwardList = NULL; g_test_bug("19898"); webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_object_ref_sink(webView); backForwardList = webkit_web_view_get_back_forward_list(webView); g_assert_cmpint(G_OBJECT(backForwardList)->ref_count, ==, 1); /* add test items */ item1 = webkit_web_history_item_new_with_data("http://example.com/1/", "Site 1"); webkit_web_back_forward_list_add_item(backForwardList, item1); item2 = webkit_web_history_item_new_with_data("http://example.com/2/", "Site 2"); webkit_web_back_forward_list_add_item(backForwardList, item2); item3 = webkit_web_history_item_new_with_data("http://example.com/3/", "Site 3"); webkit_web_back_forward_list_add_item(backForwardList, item3); item4 = webkit_web_history_item_new_with_data("http://example.com/4/", "Site 4"); webkit_web_back_forward_list_add_item(backForwardList, item4); /* make sure these functions don't add unnecessary ref to the history item */ backItem = webkit_web_back_forward_list_get_back_item(backForwardList); g_object_ref(backItem); g_assert_cmpint(G_OBJECT(backItem)->ref_count, ==, 2); g_object_unref(backItem); g_assert_cmpint(G_OBJECT(backItem)->ref_count, ==, 1); currentItem = webkit_web_back_forward_list_get_current_item(backForwardList); g_object_ref(currentItem); g_assert_cmpint(G_OBJECT(currentItem)->ref_count, ==, 2); g_object_unref(currentItem); g_assert_cmpint(G_OBJECT(currentItem)->ref_count, ==, 1); webkit_web_back_forward_list_go_to_item(backForwardList, item2); forwardItem = webkit_web_back_forward_list_get_forward_item(backForwardList); g_object_ref(forwardItem); g_assert_cmpint(G_OBJECT(forwardItem)->ref_count, ==, 2); g_object_unref(forwardItem); g_assert_cmpint(G_OBJECT(forwardItem)->ref_count, ==, 1); nthItem = webkit_web_back_forward_list_get_nth_item(backForwardList, 1); g_object_ref(nthItem); g_assert_cmpint(G_OBJECT(nthItem)->ref_count, ==, 2); g_object_unref(nthItem); g_assert_cmpint(G_OBJECT(nthItem)->ref_count, ==, 1); backList = webkit_web_back_forward_list_get_back_list_with_limit(backForwardList, 5); for (; backList; backList = backList->next) g_assert_cmpint(G_OBJECT(backList->data)->ref_count, ==, 1); forwardList = webkit_web_back_forward_list_get_forward_list_with_limit(backForwardList, 5); for (; forwardList; forwardList = forwardList->next) g_assert_cmpint(G_OBJECT(forwardList->data)->ref_count, ==, 1); g_list_free(forwardList); g_list_free(backList); g_assert_cmpint(G_OBJECT(item1)->ref_count, ==, 1); g_assert_cmpint(G_OBJECT(item2)->ref_count, ==, 1); g_assert_cmpint(G_OBJECT(item3)->ref_count, ==, 1); g_assert_cmpint(G_OBJECT(item4)->ref_count, ==, 1); g_assert_cmpint(G_OBJECT(backForwardList)->ref_count, ==, 1); g_object_unref(webView); }
static void test_webkit_web_back_forward_list_add_item(void) { WebKitWebView* webView; WebKitWebBackForwardList* webBackForwardList; WebKitWebHistoryItem* addItem1; WebKitWebHistoryItem* addItem2; WebKitWebHistoryItem* backItem; WebKitWebHistoryItem* currentItem; g_test_bug("22988"); webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_object_ref_sink(webView); webkit_web_view_set_maintains_back_forward_list(webView, TRUE); webBackForwardList = webkit_web_view_get_back_forward_list(webView); g_assert(webBackForwardList); // Check that there is no item. g_assert(!webkit_web_back_forward_list_get_current_item(webBackForwardList)); g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0); g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0); g_assert(!webkit_web_view_can_go_forward(webView)); g_assert(!webkit_web_view_can_go_back(webView)); // Add a new item addItem1 = webkit_web_history_item_new_with_data("http://example.com/", "Added site"); webkit_web_back_forward_list_add_item(webBackForwardList, addItem1); g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, addItem1)); // Check that the added item is the current item. currentItem = webkit_web_back_forward_list_get_current_item(webBackForwardList); g_assert(currentItem); g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0); g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0); g_assert(!webkit_web_view_can_go_forward(webView)); g_assert(!webkit_web_view_can_go_back(webView)); g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/"); g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Added site"); // Add another item. addItem2 = webkit_web_history_item_new_with_data("http://example.com/2/", "Added site 2"); webkit_web_back_forward_list_add_item(webBackForwardList, addItem2); g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, addItem2)); // Check that the added item is new current item. currentItem = webkit_web_back_forward_list_get_current_item(webBackForwardList); g_assert(currentItem); g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0); g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 1); g_assert(!webkit_web_view_can_go_forward(webView)); g_assert(webkit_web_view_can_go_back(webView)); g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/2/"); g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Added site 2"); backItem = webkit_web_back_forward_list_get_back_item(webBackForwardList); g_assert(backItem); g_assert_cmpstr(webkit_web_history_item_get_uri(backItem), ==, "http://example.com/"); g_assert_cmpstr(webkit_web_history_item_get_title(backItem), ==, "Added site"); // Go to the first added item. g_assert(webkit_web_view_go_to_back_forward_item(webView, addItem1)); g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 1); g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0); g_assert(webkit_web_view_can_go_forward(webView)); g_assert(!webkit_web_view_can_go_back(webView)); g_object_unref(webView); }
static void test_webkit_web_back_forward_list_order(void) { WebKitWebView* webView; WebKitWebBackForwardList* webBackForwardList; WebKitWebHistoryItem* item1; WebKitWebHistoryItem* item2; WebKitWebHistoryItem* item3; WebKitWebHistoryItem* item4; WebKitWebHistoryItem* currentItem; GList* backList = NULL; GList* forwardList = NULL; g_test_bug("22694"); webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_object_ref_sink(webView); webkit_web_view_set_maintains_back_forward_list(webView, TRUE); webBackForwardList = webkit_web_view_get_back_forward_list(webView); g_assert(webBackForwardList); // Check that there is no item. g_assert(!webkit_web_back_forward_list_get_current_item(webBackForwardList)); g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0); g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0); g_assert(!webkit_web_view_can_go_forward(webView)); g_assert(!webkit_web_view_can_go_back(webView)); // Add a new items item1 = webkit_web_history_item_new_with_data("http://example.com/1/", "Site 1"); webkit_web_back_forward_list_add_item(webBackForwardList, item1); g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, item1)); item2 = webkit_web_history_item_new_with_data("http://example.com/2/", "Site 2"); webkit_web_back_forward_list_add_item(webBackForwardList, item2); g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, item2)); item3 = webkit_web_history_item_new_with_data("http://example.com/3/", "Site 3"); webkit_web_back_forward_list_add_item(webBackForwardList, item3); g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, item3)); item4 = webkit_web_history_item_new_with_data("http://example.com/4/", "Site 4"); webkit_web_back_forward_list_add_item(webBackForwardList, item4); g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, item4)); // check the back list order backList = webkit_web_back_forward_list_get_back_list_with_limit(webBackForwardList, 5); g_assert(backList); currentItem = WEBKIT_WEB_HISTORY_ITEM(backList->data); g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/3/"); g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 3"); backList = backList->next; currentItem = WEBKIT_WEB_HISTORY_ITEM(backList->data); g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/2/"); g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 2"); backList = backList->next; currentItem = WEBKIT_WEB_HISTORY_ITEM(backList->data); g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/1/"); g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 1"); g_list_free(backList); // check the forward list order g_assert(webkit_web_view_go_to_back_forward_item(webView, item1)); forwardList = webkit_web_back_forward_list_get_forward_list_with_limit(webBackForwardList,5); g_assert(forwardList); currentItem = WEBKIT_WEB_HISTORY_ITEM(forwardList->data); g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/4/"); g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 4"); forwardList = forwardList->next; currentItem = WEBKIT_WEB_HISTORY_ITEM(forwardList->data); g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/3/"); g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 3"); forwardList = forwardList->next; currentItem = WEBKIT_WEB_HISTORY_ITEM(forwardList->data); g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/2/"); g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 2"); g_list_free(forwardList); g_object_unref(webView); }
void ephy_session_undo_close_tab (EphySession *session) { EphySessionPrivate *priv; EphyEmbed *embed, *new_tab; ClosedTab *tab; #ifndef HAVE_WEBKIT2 WebKitWebBackForwardList *dest; GList *i; #endif EphyNewTabFlags flags = EPHY_NEW_TAB_OPEN_PAGE | EPHY_NEW_TAB_PRESENT_WINDOW | EPHY_NEW_TAB_JUMP | EPHY_NEW_TAB_DONT_COPY_HISTORY; g_return_if_fail (EPHY_IS_SESSION (session)); priv = session->priv; tab = g_queue_pop_head (priv->closed_tabs); if (tab == NULL) return; LOG ("UNDO CLOSE TAB: %s", tab->url); if (*tab->parent_location != NULL) { GtkWidget *window; flags |= EPHY_NEW_TAB_IN_EXISTING_WINDOW; if (tab->position > 0) { /* Append in the n-th position. */ embed = EPHY_EMBED (gtk_notebook_get_nth_page (GTK_NOTEBOOK (*tab->parent_location), tab->position - 1)); flags |= EPHY_NEW_TAB_APPEND_AFTER; } else { /* Just prepend in the first position. */ embed = NULL; flags |= EPHY_NEW_TAB_FIRST; } window = gtk_widget_get_toplevel (GTK_WIDGET (*tab->parent_location)); new_tab = ephy_shell_new_tab (ephy_shell_get_default (), EPHY_WINDOW (window), embed, tab->url, flags); post_restore_cleanup (priv->closed_tabs, tab, FALSE); } else { EphyNotebook *notebook; flags |= EPHY_NEW_TAB_IN_NEW_WINDOW; new_tab = ephy_shell_new_tab (ephy_shell_get_default (), NULL, NULL, tab->url, flags); /* FIXME: This makes the assumption that the notebook is the parent of the returned EphyEmbed. */ notebook = EPHY_NOTEBOOK (gtk_widget_get_parent (GTK_WIDGET (new_tab))); *tab->parent_location = notebook; post_restore_cleanup (priv->closed_tabs, tab, TRUE); } /* This is deficient: we need to recreate the whole * BackForward list. Also, WebKit2 doesn't have this API. */ #ifndef HAVE_WEBKIT2 dest = webkit_web_view_get_back_forward_list (EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (new_tab)); for (i = tab->bflist; i; i = i->next) { LOG ("ADDING TO BF: %s", webkit_web_history_item_get_title ((WebKitWebHistoryItem*) i->data)); webkit_web_back_forward_list_add_item (dest, webkit_web_history_item_copy ((WebKitWebHistoryItem*) i->data)); } #endif closed_tab_free (tab); if (g_queue_is_empty (priv->closed_tabs)) g_object_notify (G_OBJECT (session), "can-undo-tab-closed"); }
/* session_restore(const char *name) {{{*/ gboolean session_restore(char *name, int flags) { gboolean is_marked = false; char *uri = NULL; GList *currentview = NULL, *lastview = NULL; WebKitWebBackForwardList *bf_list = NULL; int last = 1; char *end; gboolean ret = false; int locked_state = 0; if (name == NULL) s_session_name = g_strdup("default"); else s_session_name = name; char *group = session_get_group(s_session_name, &is_marked); if (is_marked && (flags & SESSION_FORCE) == 0) { fprintf(stderr, "Warning: Session '%s' will not be restored.\n", s_session_name); fprintf(stderr, "There is already a restored session open with name '%s'.\n", s_session_name); fputs("To force opening a saved session use -f or --force.\n", stderr); s_has_marked = false; goto clean; } if (group == NULL) return false; char *group_begin = strchr(group, '\n'); session_save_file(s_session_name, group_begin+1, true); if (flags & SESSION_ONLY_MARK) goto clean; char **lines = g_strsplit(group, "\n", -1); int length = g_strv_length(lines) - 1; for (int i=1; i<=length; i++) { char **line = g_strsplit(lines[i], " ", 4); if (line[0] && line[1] && line[2]) { int current = strtol(line[0], &end, 10); if (current <= last) { currentview = view_add(NULL, false); bf_list = webkit_web_view_get_back_forward_list(WEBVIEW(currentview)); if (lastview) { session_load_webview(lastview, uri, last, locked_state); locked_state = 0; } lastview = currentview; } if (current == 0 && *end == '|') locked_state = strtol(end+1, NULL, 10); if (bf_list != NULL) { WebKitWebHistoryItem *item = webkit_web_history_item_new_with_data(line[1], line[2]); webkit_web_back_forward_list_add_item(bf_list, item); } last = current; g_free(uri); uri = g_strdup(line[1]); } if (i == length && lastview) session_load_webview(lastview, uri, last, locked_state); g_strfreev(line); } g_strfreev(lines); if (!dwb.state.views) { view_add(NULL, false); dwb_open_startpage(dwb.state.fview); } dwb_focus(dwb.state.fview); g_free(uri); ret = true; clean: g_free(group); return ret; }/*}}}*/