1 /*
2 Copyright (C) 2009-2010 ProFUSION embedded systems
3 Copyright (C) 2009-2010 Samsung Electronics
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19 */
20
21 #include "config.h"
22 #include "ewk_history.h"
23
24 #include "BackForwardListImpl.h"
25 #include "EWebKit.h"
26 #include "HistoryItem.h"
27 #include "IconDatabaseBase.h"
28 #include "Image.h"
29 #include "IntSize.h"
30 #include "ewk_private.h"
31 #include <wtf/text/CString.h>
32
33 #include <Eina.h>
34 #include <eina_safety_checks.h>
35
36 struct _Ewk_History {
37 WebCore::BackForwardListImpl *core;
38 };
39
40 #define EWK_HISTORY_CORE_GET_OR_RETURN(history, core_, ...) \
41 if (!(history)) { \
42 CRITICAL("history is NULL."); \
43 return __VA_ARGS__; \
44 } \
45 if (!(history)->core) { \
46 CRITICAL("history->core is NULL."); \
47 return __VA_ARGS__; \
48 } \
49 if (!(history)->core->enabled()) { \
50 ERR("history->core is disabled!."); \
51 return __VA_ARGS__; \
52 } \
53 WebCore::BackForwardListImpl *core_ = (history)->core
54
55
56 struct _Ewk_History_Item {
57 WebCore::HistoryItem *core;
58
59 const char *title;
60 const char *alternate_title;
61 const char *uri;
62 const char *original_uri;
63 };
64
65 #define EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core_, ...) \
66 if (!(item)) { \
67 CRITICAL("item is NULL."); \
68 return __VA_ARGS__; \
69 } \
70 if (!(item)->core) { \
71 CRITICAL("item->core is NULL."); \
72 return __VA_ARGS__; \
73 } \
74 WebCore::HistoryItem *core_ = (item)->core
75
76
_ewk_history_item_new(WebCore::HistoryItem * core)77 static inline Ewk_History_Item *_ewk_history_item_new(WebCore::HistoryItem *core)
78 {
79 Ewk_History_Item* item;
80
81 if (!core) {
82 ERR("WebCore::HistoryItem is NULL.");
83 return 0;
84 }
85
86 item = (Ewk_History_Item *)calloc(1, sizeof(Ewk_History_Item));
87 if (!item) {
88 CRITICAL("Could not allocate item memory.");
89 return 0;
90 }
91
92 core->ref();
93 item->core = core;
94
95 return item;
96 }
97
_ewk_history_item_list_get(const WebCore::HistoryItemVector & core_items)98 static inline Eina_List *_ewk_history_item_list_get(const WebCore::HistoryItemVector &core_items)
99 {
100 Eina_List* ret = 0;
101 unsigned int i, size;
102
103 size = core_items.size();
104 for (i = 0; i < size; i++) {
105 Ewk_History_Item* item = _ewk_history_item_new(core_items[i].get());
106 if (item)
107 ret = eina_list_append(ret, item);
108 }
109
110 return ret;
111 }
112
113 /**
114 * Go forward in history one item, if possible.
115 *
116 * @param history which history instance to modify.
117 *
118 * @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
119 */
ewk_history_forward(Ewk_History * history)120 Eina_Bool ewk_history_forward(Ewk_History* history)
121 {
122 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, EINA_FALSE);
123 if (core->forwardListCount() < 1)
124 return EINA_FALSE;
125 core->goForward();
126 return EINA_TRUE;
127 }
128
129 /**
130 * Go back in history one item, if possible.
131 *
132 * @param history which history instance to modify.
133 *
134 * @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
135 */
ewk_history_back(Ewk_History * history)136 Eina_Bool ewk_history_back(Ewk_History* history)
137 {
138 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, EINA_FALSE);
139 if (core->backListCount() < 1)
140 return EINA_FALSE;
141 core->goBack();
142 return EINA_TRUE;
143 }
144
145 /**
146 * Adds the given item to history.
147 *
148 * Memory handling: This will not modify or even take references to
149 * given item (Ewk_History_Item), so you should still handle it with
150 * ewk_history_item_free().
151 *
152 * @param history which history instance to modify.
153 * @param item reference to add to history. Unmodified. Must @b not be @c NULL.
154 *
155 * @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
156 */
ewk_history_history_item_add(Ewk_History * history,const Ewk_History_Item * item)157 Eina_Bool ewk_history_history_item_add(Ewk_History* history, const Ewk_History_Item* item)
158 {
159 EWK_HISTORY_CORE_GET_OR_RETURN(history, history_core, EINA_FALSE);
160 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, item_core, EINA_FALSE);
161 history_core->addItem(item_core);
162 return EINA_TRUE;
163 }
164
165 /**
166 * Sets the given item as current in history (go to item).
167 *
168 * Memory handling: This will not modify or even take references to
169 * given item (Ewk_History_Item), so you should still handle it with
170 * ewk_history_item_free().
171 *
172 * @param history which history instance to modify.
173 * @param item reference to go to history. Unmodified. Must @b not be @c NULL.
174 *
175 * @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
176 */
ewk_history_history_item_set(Ewk_History * history,const Ewk_History_Item * item)177 Eina_Bool ewk_history_history_item_set(Ewk_History* history, const Ewk_History_Item* item)
178 {
179 EWK_HISTORY_CORE_GET_OR_RETURN(history, history_core, EINA_FALSE);
180 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, item_core, EINA_FALSE);
181 history_core->goToItem(item_core);
182 return EINA_TRUE;
183 }
184
185 /**
186 * Get the first item from back list, if any.
187 *
188 * @param history which history instance to query.
189 *
190 * @return the @b newly allocated item instance. This memory must be
191 * released with ewk_history_item_free() after use.
192 */
ewk_history_history_item_back_get(const Ewk_History * history)193 Ewk_History_Item* ewk_history_history_item_back_get(const Ewk_History* history)
194 {
195 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
196 return _ewk_history_item_new(core->backItem());
197 }
198
199 /**
200 * Get the current item in history, if any.
201 *
202 * @param history which history instance to query.
203 *
204 * @return the @b newly allocated item instance. This memory must be
205 * released with ewk_history_item_free() after use.
206 */
ewk_history_history_item_current_get(const Ewk_History * history)207 Ewk_History_Item* ewk_history_history_item_current_get(const Ewk_History* history)
208 {
209 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
210 return _ewk_history_item_new(core->currentItem());
211 }
212
213 /**
214 * Get the first item from forward list, if any.
215 *
216 * @param history which history instance to query.
217 *
218 * @return the @b newly allocated item instance. This memory must be
219 * released with ewk_history_item_free() after use.
220 */
ewk_history_history_item_forward_get(const Ewk_History * history)221 Ewk_History_Item* ewk_history_history_item_forward_get(const Ewk_History* history)
222 {
223 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
224 return _ewk_history_item_new(core->forwardItem());
225 }
226
227 /**
228 * Get item at given position, if any at that index.
229 *
230 * @param history which history instance to query.
231 * @param index position of item to get.
232 *
233 * @return the @b newly allocated item instance. This memory must be
234 * released with ewk_history_item_free() after use.
235 */
ewk_history_history_item_nth_get(const Ewk_History * history,int index)236 Ewk_History_Item* ewk_history_history_item_nth_get(const Ewk_History* history, int index)
237 {
238 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
239 return _ewk_history_item_new(core->itemAtIndex(index));
240 }
241
242 /**
243 * Queries if given item is in history.
244 *
245 * Memory handling: This will not modify or even take references to
246 * given item (Ewk_History_Item), so you should still handle it with
247 * ewk_history_item_free().
248 *
249 * @param history which history instance to modify.
250 * @param item reference to check in history. Must @b not be @c NULL.
251 *
252 * @return @c EINA_TRUE if in history, @c EINA_FALSE if not or failure.
253 */
ewk_history_history_item_contains(const Ewk_History * history,const Ewk_History_Item * item)254 Eina_Bool ewk_history_history_item_contains(const Ewk_History* history, const Ewk_History_Item* item)
255 {
256 EWK_HISTORY_CORE_GET_OR_RETURN(history, history_core, EINA_FALSE);
257 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, item_core, EINA_FALSE);
258 return history_core->containsItem(item_core);
259 }
260
261 /**
262 * Get the whole forward list.
263 *
264 * @param history which history instance to query.
265 *
266 * @return a newly allocated list of @b newly allocated item
267 * instance. This memory of each item must be released with
268 * ewk_history_item_free() after use. use
269 * ewk_history_item_list_free() for convenience.
270 *
271 * @see ewk_history_item_list_free()
272 * @see ewk_history_forward_list_get_with_limit()
273 */
ewk_history_forward_list_get(const Ewk_History * history)274 Eina_List* ewk_history_forward_list_get(const Ewk_History* history)
275 {
276 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
277 WebCore::HistoryItemVector items;
278 int limit = core->forwardListCount();
279 core->forwardListWithLimit(limit, items);
280 return _ewk_history_item_list_get(items);
281 }
282
283 /**
284 * Get the forward list within the given limit.
285 *
286 * @param history which history instance to query.
287 * @param limit the maximum number of items to return.
288 *
289 * @return a newly allocated list of @b newly allocated item
290 * instance. This memory of each item must be released with
291 * ewk_history_item_free() after use. use
292 * ewk_history_item_list_free() for convenience.
293 *
294 * @see ewk_history_item_list_free()
295 * @see ewk_history_forward_list_length()
296 * @see ewk_history_forward_list_get()
297 */
ewk_history_forward_list_get_with_limit(const Ewk_History * history,int limit)298 Eina_List* ewk_history_forward_list_get_with_limit(const Ewk_History* history, int limit)
299 {
300 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
301 WebCore::HistoryItemVector items;
302 core->forwardListWithLimit(limit, items);
303 return _ewk_history_item_list_get(items);
304 }
305
306 /**
307 * Get the whole size of forward list.
308 *
309 * @param history which history instance to query.
310 *
311 * @return number of elements in whole list.
312 *
313 * @see ewk_history_forward_list_get_with_limit()
314 */
ewk_history_forward_list_length(const Ewk_History * history)315 int ewk_history_forward_list_length(const Ewk_History* history)
316 {
317 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
318 return core->forwardListCount();
319 }
320
321 /**
322 * Get the whole back list.
323 *
324 * @param history which history instance to query.
325 *
326 * @return a newly allocated list of @b newly allocated item
327 * instance. This memory of each item must be released with
328 * ewk_history_item_free() after use. use
329 * ewk_history_item_list_free() for convenience.
330 *
331 * @see ewk_history_item_list_free()
332 * @see ewk_history_back_list_get_with_limit()
333 */
ewk_history_back_list_get(const Ewk_History * history)334 Eina_List* ewk_history_back_list_get(const Ewk_History* history)
335 {
336 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
337 WebCore::HistoryItemVector items;
338 int limit = core->backListCount();
339 core->backListWithLimit(limit, items);
340 return _ewk_history_item_list_get(items);
341 }
342
343 /**
344 * Get the back list within the given limit.
345 *
346 * @param history which history instance to query.
347 * @param limit the maximum number of items to return.
348 *
349 * @return a newly allocated list of @b newly allocated item
350 * instance. This memory of each item must be released with
351 * ewk_history_item_free() after use. use
352 * ewk_history_item_list_free() for convenience.
353 *
354 * @see ewk_history_item_list_free()
355 * @see ewk_history_back_list_length()
356 * @see ewk_history_back_list_get()
357 */
ewk_history_back_list_get_with_limit(const Ewk_History * history,int limit)358 Eina_List* ewk_history_back_list_get_with_limit(const Ewk_History* history, int limit)
359 {
360 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
361 WebCore::HistoryItemVector items;
362 core->backListWithLimit(limit, items);
363 return _ewk_history_item_list_get(items);
364 }
365
366 /**
367 * Get the whole size of back list.
368 *
369 * @param history which history instance to query.
370 *
371 * @return number of elements in whole list.
372 *
373 * @see ewk_history_back_list_get_with_limit()
374 */
ewk_history_back_list_length(const Ewk_History * history)375 int ewk_history_back_list_length(const Ewk_History* history)
376 {
377 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
378 return core->backListCount();
379 }
380
381 /**
382 * Get maximum capacity of given history.
383 *
384 * @param history which history instance to query.
385 *
386 * @return maximum number of entries this history will hold.
387 */
ewk_history_limit_get(Ewk_History * history)388 int ewk_history_limit_get(Ewk_History* history)
389 {
390 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, 0);
391 return core->capacity();
392 }
393
394 /**
395 * Set maximum capacity of given history.
396 *
397 * @param history which history instance to modify.
398 * @param limit maximum size to allow.
399 *
400 * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
401 */
ewk_history_limit_set(const Ewk_History * history,int limit)402 Eina_Bool ewk_history_limit_set(const Ewk_History* history, int limit)
403 {
404 EWK_HISTORY_CORE_GET_OR_RETURN(history, core, EINA_FALSE);
405 core->setCapacity(limit);
406 return EINA_TRUE;
407 }
408
409 /**
410 * Create a new history item with given URI and title.
411 *
412 * @param uri where this resource is located.
413 * @param title resource title.
414 *
415 * @return newly allocated history item or @c NULL on errors. You must
416 * free this item with ewk_history_item_free().
417 */
ewk_history_item_new(const char * uri,const char * title)418 Ewk_History_Item* ewk_history_item_new(const char* uri, const char* title)
419 {
420 WTF::String u = WTF::String::fromUTF8(uri);
421 WTF::String t = WTF::String::fromUTF8(title);
422 WTF::RefPtr<WebCore::HistoryItem> core = WebCore::HistoryItem::create(u, t, 0);
423 Ewk_History_Item* item = _ewk_history_item_new(core.release().releaseRef());
424 return item;
425 }
426
_ewk_history_item_free(Ewk_History_Item * item,WebCore::HistoryItem * core)427 static inline void _ewk_history_item_free(Ewk_History_Item* item, WebCore::HistoryItem* core)
428 {
429 core->deref();
430 free(item);
431 }
432
433 /**
434 * Free given history item instance.
435 *
436 * @param item what to free.
437 */
ewk_history_item_free(Ewk_History_Item * item)438 void ewk_history_item_free(Ewk_History_Item* item)
439 {
440 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core);
441 _ewk_history_item_free(item, core);
442 }
443
444 /**
445 * Free given list and associated history items instances.
446 *
447 * @param history_items list of items to free (both list nodes and
448 * item instances).
449 */
ewk_history_item_list_free(Eina_List * history_items)450 void ewk_history_item_list_free(Eina_List* history_items)
451 {
452 void* d;
453 EINA_LIST_FREE(history_items, d) {
454 Ewk_History_Item* item = (Ewk_History_Item*)d;
455 _ewk_history_item_free(item, item->core);
456 }
457 }
458
459 /**
460 * Query title for given history item.
461 *
462 * @param item history item to query.
463 *
464 * @return the title pointer, that may be @c NULL. This pointer is
465 * guaranteed to be eina_stringshare, so whenever possible
466 * save yourself some cpu cycles and use
467 * eina_stringshare_ref() instead of eina_stringshare_add() or
468 * strdup().
469 */
ewk_history_item_title_get(const Ewk_History_Item * item)470 const char* ewk_history_item_title_get(const Ewk_History_Item* item)
471 {
472 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core, 0);
473 // hide the following optimzation from outside
474 Ewk_History_Item* i = (Ewk_History_Item*)item;
475 eina_stringshare_replace(&i->title, core->title().utf8().data());
476 return i->title;
477 }
478
479 /**
480 * Query alternate title for given history item.
481 *
482 * @param item history item to query.
483 *
484 * @return the alternate title pointer, that may be @c NULL. This
485 * pointer is guaranteed to be eina_stringshare, so whenever
486 * possible save yourself some cpu cycles and use
487 * eina_stringshare_ref() instead of eina_stringshare_add() or
488 * strdup().
489 */
ewk_history_item_title_alternate_get(const Ewk_History_Item * item)490 const char* ewk_history_item_title_alternate_get(const Ewk_History_Item* item)
491 {
492 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core, 0);
493 // hide the following optimzation from outside
494 Ewk_History_Item* i = (Ewk_History_Item*)item;
495 eina_stringshare_replace(&i->alternate_title,
496 core->alternateTitle().utf8().data());
497 return i->alternate_title;
498 }
499
500 /**
501 * Set alternate title for given history item.
502 *
503 * @param item history item to query.
504 * @param title new alternate title to use for given item. No
505 * references are kept after this function returns.
506 */
ewk_history_item_title_alternate_set(Ewk_History_Item * item,const char * title)507 void ewk_history_item_title_alternate_set(Ewk_History_Item* item, const char* title)
508 {
509 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core);
510 if (!eina_stringshare_replace(&item->alternate_title, title))
511 return;
512 core->setAlternateTitle(WTF::String::fromUTF8(title));
513 }
514
515 /**
516 * Query URI for given history item.
517 *
518 * @param item history item to query.
519 *
520 * @return the URI pointer, that may be @c NULL. This pointer is
521 * guaranteed to be eina_stringshare, so whenever possible
522 * save yourself some cpu cycles and use
523 * eina_stringshare_ref() instead of eina_stringshare_add() or
524 * strdup().
525 */
ewk_history_item_uri_get(const Ewk_History_Item * item)526 const char* ewk_history_item_uri_get(const Ewk_History_Item* item)
527 {
528 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core, 0);
529 // hide the following optimzation from outside
530 Ewk_History_Item* i = (Ewk_History_Item*)item;
531 eina_stringshare_replace(&i->uri, core->urlString().utf8().data());
532 return i->uri;
533 }
534
535 /**
536 * Query original URI for given history item.
537 *
538 * @param item history item to query.
539 *
540 * @return the original URI pointer, that may be @c NULL. This pointer
541 * is guaranteed to be eina_stringshare, so whenever possible
542 * save yourself some cpu cycles and use
543 * eina_stringshare_ref() instead of eina_stringshare_add() or
544 * strdup().
545 */
ewk_history_item_uri_original_get(const Ewk_History_Item * item)546 const char* ewk_history_item_uri_original_get(const Ewk_History_Item* item)
547 {
548 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core, 0);
549 // hide the following optimzation from outside
550 Ewk_History_Item* i = (Ewk_History_Item*)item;
551 eina_stringshare_replace(&i->original_uri,
552 core->originalURLString().utf8().data());
553 return i->original_uri;
554 }
555
556 /**
557 * Query last visited time for given history item.
558 *
559 * @param item history item to query.
560 *
561 * @return the time in seconds this item was visited.
562 */
ewk_history_item_time_last_visited_get(const Ewk_History_Item * item)563 double ewk_history_item_time_last_visited_get(const Ewk_History_Item* item)
564 {
565 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core, 0.0);
566 return core->lastVisitedTime();
567 }
568
569 /**
570 * Get the icon (aka favicon) associated with this history item.
571 *
572 * @note in order to have this working, one must open icon database
573 * with ewk_settings_icon_database_path_set().
574 *
575 * @param item history item to query.
576 *
577 * @return the surface reference or @c NULL on errors. Note that the
578 * reference may be to a standard fallback icon.
579 */
ewk_history_item_icon_surface_get(const Ewk_History_Item * item)580 cairo_surface_t* ewk_history_item_icon_surface_get(const Ewk_History_Item* item)
581 {
582 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core, 0);
583
584 WebCore::Image* icon = WebCore::iconDatabase().synchronousIconForPageURL(core->url(), WebCore::IntSize(16, 16));
585 if (!icon) {
586 ERR("icon is NULL.");
587 return 0;
588 }
589 return icon->nativeImageForCurrentFrame();
590 }
591
592 /**
593 * Add an Evas_Object of type 'image' to given canvas with history item icon.
594 *
595 * This is an utility function that creates an Evas_Object of type
596 * image set to have fill always match object size
597 * (evas_object_image_filled_add()), saving some code to use it from Evas.
598 *
599 * @note in order to have this working, one must open icon database
600 * with ewk_settings_icon_database_path_set().
601 *
602 * @param item history item to query.
603 * @param canvas evas instance where to add resulting object.
604 *
605 * @return newly allocated Evas_Object instance or @c NULL on
606 * errors. Delete the object with evas_object_del().
607 */
ewk_history_item_icon_object_add(const Ewk_History_Item * item,Evas * canvas)608 Evas_Object* ewk_history_item_icon_object_add(const Ewk_History_Item* item, Evas* canvas)
609 {
610 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core, 0);
611 EINA_SAFETY_ON_NULL_RETURN_VAL(canvas, 0);
612 WebCore::Image* icon = WebCore::iconDatabase().synchronousIconForPageURL(core->url(), WebCore::IntSize(16, 16));
613 cairo_surface_t* surface;
614
615 if (!icon) {
616 ERR("icon is NULL.");
617 return 0;
618 }
619
620 surface = icon->nativeImageForCurrentFrame();
621 return ewk_util_image_from_cairo_surface_add(canvas, surface);
622 }
623
624 /**
625 * Query if given item is still in page cache.
626 *
627 * @param item history item to query.
628 *
629 * @return @c EINA_TRUE if in cache, @c EINA_FALSE otherwise.
630 */
ewk_history_item_page_cache_exists(const Ewk_History_Item * item)631 Eina_Bool ewk_history_item_page_cache_exists(const Ewk_History_Item* item)
632 {
633 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core, EINA_FALSE);
634 return core->isInPageCache();
635 }
636
637 /**
638 * Query number of times item was visited.
639 *
640 * @param item history item to query.
641 *
642 * @return number of visits.
643 */
ewk_history_item_visit_count(const Ewk_History_Item * item)644 int ewk_history_item_visit_count(const Ewk_History_Item* item)
645 {
646 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core, 0);
647 return core->visitCount();
648 }
649
650 /**
651 * Query if last visit to item was failure or not.
652 *
653 * @param item history item to query.
654 *
655 * @return @c EINA_TRUE if last visit was failure, @c EINA_FALSE if it
656 * was fine.
657 */
ewk_history_item_visit_last_failed(const Ewk_History_Item * item)658 Eina_Bool ewk_history_item_visit_last_failed(const Ewk_History_Item* item)
659 {
660 EWK_HISTORY_ITEM_CORE_GET_OR_RETURN(item, core, EINA_TRUE);
661 return core->lastVisitWasFailure();
662 }
663
664
665 /* internal methods ****************************************************/
666 /**
667 * @internal
668 *
669 * Creates history for given view. Called internally by ewk_view and
670 * should never be called from outside.
671 *
672 * @param core WebCore::BackForwardListImpl instance to use internally.
673 *
674 * @return newly allocated history instance or @c NULL on errors.
675 */
ewk_history_new(WebCore::BackForwardListImpl * core)676 Ewk_History* ewk_history_new(WebCore::BackForwardListImpl* core)
677 {
678 Ewk_History* history;
679 EINA_SAFETY_ON_NULL_RETURN_VAL(core, 0);
680 DBG("core=%p", core);
681
682 history = (Ewk_History*)malloc(sizeof(Ewk_History));
683 if (!history) {
684 CRITICAL("Could not allocate history memory.");
685 return 0;
686 }
687
688 core->ref();
689 history->core = core;
690
691 return history;
692 }
693
694 /**
695 * @internal
696 *
697 * Destroys previously allocated history instance. This is called
698 * automatically by ewk_view and should never be called from outside.
699 *
700 * @param history instance to free
701 */
ewk_history_free(Ewk_History * history)702 void ewk_history_free(Ewk_History* history)
703 {
704 DBG("history=%p", history);
705 history->core->deref();
706 free(history);
707 }
708