1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Copyright (C) 2009-2010 ProFUSION embedded systems
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Copyright (C) 2009-2010 Samsung Electronics
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This library is free software; you can redistribute it and/or
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    modify it under the terms of the GNU Library General Public
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    License as published by the Free Software Foundation; either
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    version 2 of the License, or (at your option) any later version.
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This library is distributed in the hope that it will be useful,
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    but WITHOUT ANY WARRANTY; without even the implied warranty of
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Library General Public License for more details.
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    You should have received a copy of the GNU Library General Public License
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    along with this library; see the file COPYING.LIB.  If not, write to
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Boston, MA 02110-1301, USA.
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Uncomment to view frame regions and debug messages
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// #define EWK_FRAME_DEBUG
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h"
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ewk_frame.h"
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
27cad810f21b803229eb11403f9209855525a25d57Steve Block#include "DocumentMarkerController.h"
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "EWebKit.h"
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "EventHandler.h"
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FocusController.h"
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FrameLoaderClientEfl.h"
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FrameTree.h"
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FrameView.h"
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HTMLPlugInElement.h"
35e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "HistoryItem.h"
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HitTestResult.h"
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "IntSize.h"
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "KURL.h"
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "PlatformKeyboardEvent.h"
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "PlatformMouseEvent.h"
41cad810f21b803229eb11403f9209855525a25d57Steve Block#include "PlatformTouchEvent.h"
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "PlatformWheelEvent.h"
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ProgressTracker.h"
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RefPtr.h"
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderTheme.h"
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ResourceRequest.h"
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ScriptValue.h"
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SharedBuffer.h"
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SubstituteData.h"
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WindowsKeyboardCodes.h"
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ewk_private.h"
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Eina.h>
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Evas.h>
555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include <algorithm>
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <eina_safety_checks.h>
575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include <wtf/text/CString.h>
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const char EWK_FRAME_TYPE_STR[] = "EWK_Frame";
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstruct Ewk_Frame_Smart_Data {
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object_Smart_Clipped_Data base;
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object* self;
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object* view;
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifdef EWK_FRAME_DEBUG
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object* region;
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::Frame* frame;
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char* theme;
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char* title;
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char* uri;
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char* name;
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    struct {
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Evas_Coord w, h;
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } contents_size;
7668513a70bcd92384395513322f1b801e7bf9c729Steve Block    Eina_Bool textZoom:1;
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool editable:1;
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstruct Eina_Iterator_Ewk_Frame {
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Iterator base;
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object* obj;
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::Frame* last;
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef EWK_TYPE_CHECK
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define EWK_FRAME_TYPE_CHECK(o, ...) do { } while (0)
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define EWK_FRAME_TYPE_CHECK(o, ...)                                    \
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    do {                                                                \
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        const char* _tmp_otype = evas_object_type_get(o);               \
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (EINA_UNLIKELY(_tmp_otype != EWK_FRAME_TYPE_STR)) {          \
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            EINA_LOG_CRIT                                               \
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ("%p (%s) is not of an ewk_frame!", o,                  \
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 _tmp_otype ? _tmp_otype : "(null)");                   \
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return __VA_ARGS__;                                         \
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }                                                               \
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } while (0)
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define EWK_FRAME_SD_GET(o, ptr)                                \
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Ewk_Frame_Smart_Data* ptr = (Ewk_Frame_Smart_Data*)evas_object_smart_data_get(o)
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define EWK_FRAME_SD_GET_OR_RETURN(o, ptr, ...)         \
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_TYPE_CHECK(o, __VA_ARGS__);               \
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET(o, ptr);                           \
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!ptr) {                                         \
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        CRITICAL("no smart data for object %p (%s)",    \
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 o, evas_object_type_get(o));           \
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return __VA_ARGS__;                             \
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Evas_Smart_Class _parent_sc = EVAS_SMART_CLASS_INIT_NULL;
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifdef EWK_FRAME_DEBUG
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_frame_debug(Evas_Object* o)
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object* clip, *parent;
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord x, y, w, h, cx, cy, cw, ch;
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int r, g, b, a, cr, cg, cb, ca;
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_color_get(o, &r, &g, &b, &a);
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_geometry_get(o, &x, &y, &w, &h);
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    clip = evas_object_clip_get(o);
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_color_get(clip, &cr, &cg, &cb, &ca);
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_geometry_get(clip, &cx, &cy, &cw, &ch);
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    fprintf(stderr, "%p: type=%s name=%s, visible=%d, color=%02x%02x%02x%02x, %d,%d+%dx%d, clipper=%p (%d, %02x%02x%02x%02x, %d,%d+%dx%d)\n",
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            o, evas_object_type_get(o), evas_object_name_get(o), evas_object_visible_get(o),
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            r, g, b, a, x, y, w, h,
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            clip, evas_object_visible_get(clip), cr, cg, cb, ca, cx, cy, cw, ch);
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    parent = evas_object_smart_parent_get(o);
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!parent)
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        fprintf(stderr, "\n");
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _ewk_frame_debug(parent);
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic WebCore::FrameLoaderClientEfl* _ewk_frame_loader_efl_get(WebCore::Frame* frame)
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return static_cast<WebCore::FrameLoaderClientEfl*>(frame->loader()->client());
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline Evas_Object* kit(WebCore::Frame* frame)
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!frame)
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::FrameLoaderClientEfl* fl = _ewk_frame_loader_efl_get(frame);
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!fl)
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return fl->webFrame();
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Eina_Bool _ewk_frame_children_iterator_next(Eina_Iterator_Ewk_Frame* it, Evas_Object** data)
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(it->obj, sd, EINA_FALSE);
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::FrameTree* tree = sd->frame->tree(); // check if it's still valid
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(tree, EINA_FALSE);
163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::Frame* frame;
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (it->last)
166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frame = it->last->tree()->nextSibling();
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frame = tree->firstChild();
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!frame)
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EINA_FALSE;
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *data = kit(frame);
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Evas_Object* _ewk_frame_children_iterator_get_container(Eina_Iterator_Ewk_Frame* it)
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return it->obj;
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_frame_smart_add(Evas_Object* o)
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET(o, sd);
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!sd) {
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sd = (Ewk_Frame_Smart_Data*)calloc(1, sizeof(Ewk_Frame_Smart_Data));
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!sd)
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            CRITICAL("could not allocate Ewk_Frame_Smart_Data");
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            evas_object_smart_data_set(o, sd);
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->self = o;
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _parent_sc.add(o);
197cad810f21b803229eb11403f9209855525a25d57Steve Block    evas_object_static_clip_set(sd->base.clipper, EINA_FALSE);
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_move(sd->base.clipper, 0, 0);
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_resize(sd->base.clipper, 0, 0);
200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifdef EWK_FRAME_DEBUG
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->region = evas_object_rectangle_add(sd->base.evas);
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static int i = 0;
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (i) {
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case 0:
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_color_set(sd->region, 128, 0, 0, 128);
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case 1:
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_color_set(sd->region, 0, 128, 0, 128);
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case 2:
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_color_set(sd->region, 0, 0, 128, 128);
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case 3:
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_color_set(sd->region, 128, 0, 0, 128);
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case 4:
218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_color_set(sd->region, 128, 128, 0, 128);
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case 5:
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_color_set(sd->region, 128, 0, 128, 128);
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case 6:
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_color_set(sd->region, 0, 128, 128, 128);
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    i++;
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (i > 6)
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        i = 0;
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_member_add(sd->region, o);
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_hide(sd->region);
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_frame_smart_del(Evas_Object* o)
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WRN("o=%p", o); // XXX REMOVE ME LATER
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET(o, sd);
242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd) {
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (sd->frame) {
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            WebCore::FrameLoaderClientEfl* flc = _ewk_frame_loader_efl_get(sd->frame);
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            flc->setWebFrame(0);
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            sd->frame->loader()->cancelAndClear();
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            sd->frame = 0;
249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        eina_stringshare_del(sd->title);
252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        eina_stringshare_del(sd->uri);
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        eina_stringshare_del(sd->name);
254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _parent_sc.del(o);
257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_frame_smart_resize(Evas_Object* o, Evas_Coord w, Evas_Coord h)
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET(o, sd);
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_resize(sd->base.clipper, w, h);
263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifdef EWK_FRAME_DEBUG
265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_resize(sd->region, w, h);
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord x, y;
267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_geometry_get(sd->region, &x, &y, &w, &h);
268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    INF("region=%p, visible=%d, geo=%d,%d + %dx%d",
269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sd->region, evas_object_visible_get(sd->region), x, y, w, h);
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _ewk_frame_debug(o);
271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_frame_smart_set(Evas_Smart_Class* api)
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_clipped_smart_set(api);
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    api->add = _ewk_frame_smart_add;
278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    api->del = _ewk_frame_smart_del;
279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    api->resize = _ewk_frame_smart_resize;
280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline Evas_Smart* _ewk_frame_smart_class_new(void)
283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static Evas_Smart_Class sc = EVAS_SMART_CLASS_INIT_NAME_VERSION(EWK_FRAME_TYPE_STR);
285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static Evas_Smart* smart = 0;
286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (EINA_UNLIKELY(!smart)) {
288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_smart_clipped_smart_set(&_parent_sc);
289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _ewk_frame_smart_set(&sc);
290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        smart = evas_smart_class_new(&sc);
291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return smart;
294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Creates a new EFL WebKit Frame object.
300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Frames are low level entries contained in a page that is contained
302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * by a view. Usually one operates on the view and not directly on the
303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * frame.
304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param e canvas where to create the frame object.
306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return frame object or @c NULL if errors.
308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEvas_Object* ewk_frame_add(Evas* e)
310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return evas_object_smart_add(e, _ewk_frame_smart_class_new());
312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Retrieves the ewk_view object that owns this frame.
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to get view from.
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return view object or @c NULL if errors.
320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEvas_Object* ewk_frame_view_get(const Evas_Object* o)
322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->view;
325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Set the theme path to be used by this frame.
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Frames inherit theme from their parent, this will have all frames
331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * with unset theme to use this one.
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to change theme.
334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param path theme path, may be @c NULL to reset to default or inherit parent.
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_theme_set(Evas_Object* o, const char* path)
337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!eina_stringshare_replace(&sd->theme, path))
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->frame && sd->frame->view()) {
342dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        sd->frame->view()->setEdjeTheme(WTF::String(path));
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sd->frame->page()->theme()->themeChanged();
344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Gets the immediate theme set on this frame.
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This returns the value set by ewk_frame_theme_set(). Note that if
351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * it is @c NULL, the frame will inherit parent's theme.
352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to get theme path.
354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return theme path, may be @c NULL if not set.
356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockconst char* ewk_frame_theme_get(Evas_Object* o)
358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->theme;
361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Returns a new iterator over all direct children frames.
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Keep frame object intact while iteration happens otherwise frame
367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * may be destroyed while iterated.
368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Iteration results are Evas_Object*, so give eina_iterator_next() a
370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * pointer to it.
371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return a newly allocated iterator, free using
373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         eina_iterator_free(). If not possible to create the
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         iterator, @c NULL is returned.
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Iterator* ewk_frame_children_iterator_new(Evas_Object* o)
377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Iterator_Ewk_Frame* it = (Eina_Iterator_Ewk_Frame*)
380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        calloc(1, sizeof(Eina_Iterator_Ewk_Frame));
381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!it)
382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_MAGIC_SET(&it->base, EINA_MAGIC_ITERATOR);
385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    it->base.next = FUNC_ITERATOR_NEXT(_ewk_frame_children_iterator_next);
386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    it->base.get_container = FUNC_ITERATOR_GET_CONTAINER(_ewk_frame_children_iterator_get_container);
387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    it->base.free = FUNC_ITERATOR_FREE(free);
388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    it->obj = o;
389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return &it->base;
390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Finds a child frame by its name, recursively.
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * For pre-defined names, returns @a o if @a name is "_self" or
396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * "_current", returns @a o's parent frame if @a name is "_parent",
397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * and returns the main frame if @a name is "_top". Also returns @a o
398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * if it is the main frame and @a name is either "_parent" or
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * "_top". For other names, this function returns the first frame that
400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * matches @a name. This function searches @a o and its descendents
401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * first, then @a o's parent and its children moving up the hierarchy
402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * until a match is found. If no match is found in @a o's hierarchy,
403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * this function will search for a matching frame in other main frame
404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * hierarchies.
405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return object if found, @c NULL if nothing with that name.
407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEvas_Object* ewk_frame_child_find(Evas_Object* o, const char* name)
409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(name, 0);
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, 0);
413dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WTF::String s = WTF::String::fromUTF8(name);
414dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return kit(sd->frame->tree()->find(WTF::AtomicString(s)));
415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Ask main frame to load the given URI.
419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to load uri.
421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param uri uniform resource identifier to load.
422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
423dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_uri_set(Evas_Object* o, const char* uri)
424dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
426dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WebCore::KURL kurl(WebCore::KURL(), WTF::String::fromUTF8(uri));
427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::ResourceRequest req(kurl);
428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::FrameLoader* loader = sd->frame->loader();
429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    loader->load(req, false);
430dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
433dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Gets the uri of this frame.
435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to get uri.
437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return frame uri or @c NULL. It's a internal string and should
439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         not be modified. The string is guaranteed to be stringshared.
440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
441dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockconst char* ewk_frame_uri_get(const Evas_Object* o)
442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->uri;
445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Gets the title of this frame.
449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to get title.
451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return frame title or @c NULL. It's a internal string and should
453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         not be modified. The string is guaranteed to be stringshared.
454dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockconst char* ewk_frame_title_get(const Evas_Object* o)
456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->title;
459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
460dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Gets the name of this frame.
463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to get name.
465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return frame name or @c NULL. It's a internal string and should
467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         not be modified. The string is guaranteed to be stringshared.
468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockconst char* ewk_frame_name_get(const Evas_Object* o)
470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->name)
474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return sd->name;
475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!sd->frame) {
477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ERR("could not get name of uninitialized frame.");
478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
48128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    WTF::String s = sd->frame->tree()->uniqueName();
482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WTF::CString cs = s.utf8();
483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->name = eina_stringshare_add_length(cs.data(), cs.length());
484dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->name;
485dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Get last known contents size.
489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to get contents size.
491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param w where to store contents size width. May be @c NULL.
492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param h where to store contents size height. May be @c NULL.
493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success or @c EINA_FALSE on failure and
495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         @a w and @a h will be zeroed.
496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_contents_size_get(const Evas_Object* o, Evas_Coord* w, Evas_Coord* h)
498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (w)
500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *w = 0;
501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (h)
502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *h = 0;
503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (w)
505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *w = sd->contents_size.w;
506dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (h)
507dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *h = sd->contents_size.h;
508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Eina_Bool _ewk_frame_contents_set_internal(Ewk_Frame_Smart_Data *sd, const char* contents, size_t contents_size, const char* mime_type, const char* encoding, const char* base_uri, const char* unreachable_uri)
512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
51381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    size_t len = strlen(contents);
51481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (contents_size < 1 || contents_size > len)
51581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        contents_size = len;
516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!mime_type)
517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        mime_type = "text/html";
518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!encoding)
519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        encoding = "UTF-8";
520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!base_uri)
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        base_uri = "about:blank";
522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
523dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WebCore::KURL baseKURL(WebCore::KURL(), WTF::String::fromUTF8(base_uri));
524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::KURL unreachableKURL;
525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (unreachable_uri)
526dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        unreachableKURL = WebCore::KURL(WebCore::KURL(), WTF::String::fromUTF8(unreachable_uri));
527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        unreachableKURL = WebCore::KURL();
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WTF::RefPtr<WebCore::SharedBuffer> buffer = WebCore::SharedBuffer::create(contents, contents_size);
531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::SubstituteData substituteData
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        (buffer.release(),
533dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch         WTF::String::fromUTF8(mime_type),
534dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch         WTF::String::fromUTF8(encoding),
535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         baseKURL, unreachableKURL);
536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::ResourceRequest request(baseKURL);
537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->frame->loader()->load(request, substituteData, false);
539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
542dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Requests loading the given contents in this frame.
544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to load document.
546dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param contents what to load into frame. Must not be @c NULL.
547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param contents_size byte size of data in @a contents.
548dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        If zero, strlen() is used.
549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param mime_type type of @a contents data. If @c NULL "text/html" is assumed.
550dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param encoding used for @a contents data. If @c NULL "UTF-8" is assumed.
551dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param base_uri base uri to use for relative resources. May be @c NULL.
552dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        If provided must be an absolute uri.
553dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
554dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on successful request, @c EINA_FALSE on errors.
555dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
556dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_contents_set(Evas_Object* o, const char* contents, size_t contents_size, const char* mime_type, const char* encoding, const char* base_uri)
557dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
558dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
559dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_FALSE_RETURN_VAL(sd->frame, EINA_FALSE);
560dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(contents, EINA_FALSE);
561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _ewk_frame_contents_set_internal
562dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        (sd, contents, contents_size, mime_type, encoding, base_uri, 0);
563dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
564dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
565dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Requests loading alternative contents for unreachable URI in this frame.
567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This is similar to ewk_frame_contents_set(), but is used when some
569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * URI failed to load, using the provided content instead. The main
570dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * difference is that back-forward navigation list is not changed.
571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to load document.
573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param contents what to load into frame. Must not be @c NULL.
574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param contents_size byte size of data in @a contents.
575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        If zero, strlen() is used.
576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param mime_type type of @a contents data. If @c NULL "text/html" is assumed.
577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param encoding used for @a contents data. If @c NULL "UTF-8" is assumed.
578dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param base_uri base uri to use for relative resources. May be @c NULL.
579dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        If provided must be an absolute uri.
580dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param unreachable_uri the URI that failed to load and is getting the
581dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        alternative representation.
582dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
583dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on successful request, @c EINA_FALSE on errors.
584dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
585dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_contents_alternate_set(Evas_Object* o, const char* contents, size_t contents_size, const char* mime_type, const char* encoding, const char* base_uri, const char* unreachable_uri)
586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_FALSE_RETURN_VAL(sd->frame, EINA_FALSE);
589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(contents, EINA_FALSE);
590dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(unreachable_uri, EINA_FALSE);
591dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _ewk_frame_contents_set_internal
592dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        (sd, contents, contents_size, mime_type, encoding, base_uri,
593dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         unreachable_uri);
594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Requests execution of given script.
598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to execute script.
600dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param script java script to execute.
601dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if request was done, @c EINA_FALSE on errors.
603dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_script_execute(Evas_Object* o, const char* script)
605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
606dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
607dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_FALSE_RETURN_VAL(sd->frame, EINA_FALSE);
608dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(script, EINA_FALSE);
609dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    sd->frame->script()->executeScript(WTF::String::fromUTF8(script), true);
610dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
611dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
612dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
613dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Gets if frame is editable.
615dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
616dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to get editable state.
617dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
618dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if editable, @c EINA_FALSE otherwise.
619dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
620dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_editable_get(const Evas_Object* o)
621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
624dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->editable;
625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
627dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Sets if frame is editable.
629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
630dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to set editable state.
631dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param editable new state.
632dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
633dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
634dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
635dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_editable_set(Evas_Object* o, Eina_Bool editable)
636dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
637dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    editable = !!editable;
640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->editable == editable)
641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EINA_TRUE;
642dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (editable)
6435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        sd->frame->editor()->applyEditingStyleToBodyElement();
644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
645dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
647dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Get the copy of the selection text.
649dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to get selection text.
651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return newly allocated string or @c NULL if nothing is selected or failure.
653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockchar* ewk_frame_selection_get(const Evas_Object* o)
655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, 0);
6585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    WTF::CString s = sd->frame->editor()->selectedText().utf8();
659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (s.isNull())
660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return strdup(s.data());
662dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline Eina_Bool _ewk_frame_editor_command(Ewk_Frame_Smart_Data* sd, const char* command)
665dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
666dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return sd->frame->editor()->command(WTF::String::fromUTF8(command)).execute();
667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Unselects whatever was selected.
671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if operation was executed, @c EINA_FALSE otherwise.
673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
674dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_select_none(Evas_Object* o)
675dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
676dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
677dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
678dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _ewk_frame_editor_command(sd, "Unselect");
679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
680dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
681dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
682dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Selects everything.
683dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
684dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if operation was executed, @c EINA_FALSE otherwise.
685dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
686dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_select_all(Evas_Object* o)
687dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
688dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
690dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _ewk_frame_editor_command(sd, "SelectAll");
691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
692dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Selects the current paragrah.
695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
696dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if operation was executed, @c EINA_FALSE otherwise.
697dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
698dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_select_paragraph(Evas_Object* o)
699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _ewk_frame_editor_command(sd, "SelectParagraph");
703dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
705dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
706dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Selects the current sentence.
707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
708dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if operation was executed, @c EINA_FALSE otherwise.
709dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_select_sentence(Evas_Object* o)
711dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
714dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _ewk_frame_editor_command(sd, "SelectSentence");
715dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
717dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
718dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Selects the current line.
719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
720dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if operation was executed, @c EINA_FALSE otherwise.
721dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
722dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_select_line(Evas_Object* o)
723dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
724dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
725dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
726dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _ewk_frame_editor_command(sd, "SelectLine");
727dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
729dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Selects the current word.
731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if operation was executed, @c EINA_FALSE otherwise.
733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_select_word(Evas_Object* o)
735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
736dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
737dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _ewk_frame_editor_command(sd, "SelectWord");
739dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
742dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Search the given text string in document.
743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object where to search text.
745dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param string reference string to search.
746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param case_sensitive if search should be case sensitive or not.
747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param forward if search is from cursor and on or backwards.
748dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param wrap if search should wrap at end.
749dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
750dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if found, @c EINA_FALSE if not or failure.
751dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
752dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_text_search(const Evas_Object* o, const char* string, Eina_Bool case_sensitive, Eina_Bool forward, Eina_Bool wrap)
753dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
754dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
755dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
756dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(string, EINA_FALSE);
757dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
7585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return sd->frame->editor()->findString(WTF::String::fromUTF8(string), forward, case_sensitive, wrap, true);
759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
760dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
761dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
762dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Mark matches the given text string in document.
763dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
764dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object where to search text.
765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param string reference string to match.
766dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param case_sensitive if match should be case sensitive or not.
767dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param highlight if matches should be highlighted.
768dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param limit maximum amount of matches, or zero to unlimited.
769dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
770dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return number of matches.
771dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
772dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockunsigned int ewk_frame_text_matches_mark(Evas_Object* o, const char* string, Eina_Bool case_sensitive, Eina_Bool highlight, unsigned int limit)
773dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
775dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
776dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(string, 0);
777dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
7785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    sd->frame->editor()->setMarkedTextMatchesAreHighlighted(highlight);
7795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return sd->frame->editor()->countMatchesForText(WTF::String::fromUTF8(string), case_sensitive, limit, true);
780dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
781dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
782dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
783dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Reverses the effect of ewk_frame_text_matches_mark()
784dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
785dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object where to search text.
786dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
787dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE for failure.
788dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
789dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_text_matches_unmark_all(Evas_Object* o)
790dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
791dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
792dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
794e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    sd->frame->document()->markers()->removeMarkers(WebCore::DocumentMarker::TextMatch);
795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Set if should highlight matches marked with ewk_frame_text_matches_mark().
800dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
801dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object where to set if matches are highlighted or not.
802dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param highlight if @c EINA_TRUE, matches will be highlighted.
803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
804dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE for failure.
805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_text_matches_highlight_set(Evas_Object* o, Eina_Bool highlight)
807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
809dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
8105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    sd->frame->editor()->setMarkedTextMatchesAreHighlighted(highlight);
811dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
812dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
813dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
814dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
815dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Get if should highlight matches marked with ewk_frame_text_matches_mark().
816dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
817dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to query if matches are highlighted or not.
818dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
819dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if they are highlighted, @c EINA_FALSE otherwise.
820dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
821dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_text_matches_highlight_get(const Evas_Object* o)
822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
824dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
8255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return sd->frame->editor()->markedTextMatchesAreHighlighted();
826dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
8285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen/**
8295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Comparison function used by ewk_frame_text_matches_nth_pos_get
8305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen */
8315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic bool _ewk_frame_rect_cmp_less_than(const WebCore::IntRect& i, const WebCore::IntRect& j)
8325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
8335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return (i.y() < j.y() || (i.y() == j.y() && i.x() < j.x()));
8345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
8355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
8365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen/**
8375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Predicate used by ewk_frame_text_matches_nth_pos_get
8385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen */
8395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic bool _ewk_frame_rect_is_negative_value(const WebCore::IntRect& i)
8405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
8415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return (i.x() < 0 || i.y() < 0);
8425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
8435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
8445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen/**
8455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Get x, y position of n-th text match in frame
8465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *
8475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * @param o frame object where matches are highlighted.
8485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * @param n index of element
8495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * @param x where to return x position. May be @c NULL.
8505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * @param y where to return y position. May be @c NULL.
8515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *
8525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * @return @c EINA_TRUE on success, @c EINA_FALSE for failure - when no matches found or
8535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *         n bigger than search results.
8545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen */
855bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenEina_Bool ewk_frame_text_matches_nth_pos_get(Evas_Object* o, size_t n, int* x, int* y)
8565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
8575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
8585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
8595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
8605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    Vector<WebCore::IntRect> intRects = sd->frame->document()->markers()->renderedRectsForMarkers(WebCore::DocumentMarker::TextMatch);
8615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
8625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    /* remove useless values */
8635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    std::remove_if(intRects.begin(), intRects.end(), _ewk_frame_rect_is_negative_value);
8645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
8655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (intRects.isEmpty() || n > intRects.size())
8665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen      return EINA_FALSE;
8675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
8685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    std::sort(intRects.begin(), intRects.end(), _ewk_frame_rect_cmp_less_than);
8695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
8705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (x)
8715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen      *x = intRects[n - 1].x();
8725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (y)
8735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen      *y = intRects[n - 1].y();
8745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return EINA_TRUE;
8755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
8765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
877dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
878dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Ask frame to stop loading.
879dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
880dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to stop loading.
881dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
882dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
883dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
884dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_stop(Evas_Object* o)
885dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
886dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
887dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
888dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->frame->loader()->stopAllLoaders();
889dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
890dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
891dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
892dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
893dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Ask frame to reload current document.
894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
895dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to reload.
896dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
897dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
898dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
899dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @see ewk_frame_reload_full()
900dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
901dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_reload(Evas_Object* o)
902dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
903dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
904dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
905dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->frame->loader()->reload();
906dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
907dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
908dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
909dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
910dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Ask frame to fully reload current document, using no previous caches.
911dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
912dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to reload.
913dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
914dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
915dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
916dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_reload_full(Evas_Object* o)
917dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
918dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
919dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
920dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->frame->loader()->reload(true);
921dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
922dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
923dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
925dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Ask frame to navigate back in history.
926dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
927dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to navigate back.
928dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
929dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
930dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @see ewk_frame_navigate()
932dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
933dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_back(Evas_Object* o)
934dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
935dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return ewk_frame_navigate(o, -1);
936dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
938dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
939dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Ask frame to navigate forward in history.
940dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
941dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to navigate forward.
942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
944dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
945dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @see ewk_frame_navigate()
946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_forward(Evas_Object* o)
948dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return ewk_frame_navigate(o, 1);
950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
951dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
952dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
953dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Navigate back or forward in history.
954dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
955dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to navigate.
956dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param steps if positive navigates that amount forwards, if negative
957dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        does backwards.
958dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
959dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
960dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
961dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_navigate(Evas_Object* o, int steps)
962dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
963dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
964dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
965dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::Page* page = sd->frame->page();
966dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!page->canGoBackOrForward(steps))
967dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EINA_FALSE;
968dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    page->goBackOrForward(steps);
969dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
970dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
971dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
972dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
973dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Check if it is possible to navigate backwards one item in history.
974dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
975dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to check if backward navigation is possible.
976dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
977dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if possible, @c EINA_FALSE otherwise.
978dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
979dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @see ewk_frame_navigate_possible()
980dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
981dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_back_possible(Evas_Object* o)
982dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
983dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return ewk_frame_navigate_possible(o, -1);
984dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
985dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
986dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
987dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Check if it is possible to navigate forwards one item in history.
988dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
989dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to check if forward navigation is possible.
990dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
991dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if possible, @c EINA_FALSE otherwise.
992dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
993dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @see ewk_frame_navigate_possible()
994dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
995dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_forward_possible(Evas_Object* o)
996dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
997dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return ewk_frame_navigate_possible(o, 1);
998dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
999dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1000dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1001dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Check if it is possible to navigate given @a steps in history.
1002dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1003dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to navigate.
1004dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param steps if positive navigates that amount forwards, if negative
1005dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        does backwards.
1006dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1007dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if possible, @c EINA_FALSE otherwise.
1008dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1009dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_navigate_possible(Evas_Object* o, int steps)
1010dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1011dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1012dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1013dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::Page* page = sd->frame->page();
1014dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return page->canGoBackOrForward(steps);
1015dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1016dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1017dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1018dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Get current zoom level used by this frame.
1019dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1020dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to query zoom level.
1021dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1022dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return zoom level or -1.0 on failure.
1023dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1024dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockfloat ewk_frame_zoom_get(const Evas_Object* o)
1025dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1026dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, -1.0);
1027dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, -1.0);
102868513a70bcd92384395513322f1b801e7bf9c729Steve Block
102968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (sd->textZoom)
103068513a70bcd92384395513322f1b801e7bf9c729Steve Block        return sd->frame->textZoomFactor();
103168513a70bcd92384395513322f1b801e7bf9c729Steve Block    return sd->frame->pageZoomFactor();
1032dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1033dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1034dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1035dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Set current zoom level used by this frame.
1036dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1037dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to change zoom level.
1038dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param zoom new level.
1039dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1040dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success or @c EINA_FALSE on failure.
1041dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1042dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @see ewk_frame_zoom_text_only_set()
1043dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1044dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_zoom_set(Evas_Object* o, float zoom)
1045dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1046dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1047dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
104868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (sd->textZoom)
104968513a70bcd92384395513322f1b801e7bf9c729Steve Block        sd->frame->setTextZoomFactor(zoom);
105068513a70bcd92384395513322f1b801e7bf9c729Steve Block    else
105168513a70bcd92384395513322f1b801e7bf9c729Steve Block        sd->frame->setPageZoomFactor(zoom);
1052dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
1053dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1054dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1055dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1056dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Query if zoom level just applies to text and not other elements.
1057dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1058dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame to query setting.
1059dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1060dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if just text are scaled, @c EINA_FALSE otherwise.
1061dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1062dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_zoom_text_only_get(const Evas_Object* o)
1063dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1064dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
106568513a70bcd92384395513322f1b801e7bf9c729Steve Block    return sd->textZoom;
1066dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1067dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1068dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1069dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Set if zoom level just applies to text and not other elements.
1070dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1071dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame to change setting.
1072dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param setting @c EINA_TRUE if zoom should just be applied to text.
1073dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1074dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
1075dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1076dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_zoom_text_only_set(Evas_Object* o, Eina_Bool setting)
1077dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1078dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1079dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
108068513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (sd->textZoom == setting)
1081dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EINA_TRUE;
1082dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
108368513a70bcd92384395513322f1b801e7bf9c729Steve Block    float zoom_level = sd->textZoom ? sd->frame->textZoomFactor() : sd->frame->pageZoomFactor();
108468513a70bcd92384395513322f1b801e7bf9c729Steve Block    sd->textZoom = setting;
108568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (sd->textZoom)
108668513a70bcd92384395513322f1b801e7bf9c729Steve Block        sd->frame->setPageAndTextZoomFactors(1, zoom_level);
108768513a70bcd92384395513322f1b801e7bf9c729Steve Block    else
108868513a70bcd92384395513322f1b801e7bf9c729Steve Block        sd->frame->setPageAndTextZoomFactors(zoom_level, 1);
1089dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
1090dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1091dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1092dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1093dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Free hit test created with ewk_frame_hit_test_new().
1094dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1095dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param hit_test instance. Must @b not be @c NULL.
1096dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1097dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_hit_test_free(Ewk_Hit_Test* hit_test)
1098dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1099dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN(hit_test);
1100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    eina_stringshare_del(hit_test->title);
1101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    eina_stringshare_del(hit_test->alternate_text);
1102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    eina_stringshare_del(hit_test->link.text);
1103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    eina_stringshare_del(hit_test->link.url);
1104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    eina_stringshare_del(hit_test->link.title);
1105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    free(hit_test);
1106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Creates a new hit test for given frame and point.
1110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame to do hit test on.
1112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param x horizontal position to query.
1113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param y vertical position to query.
1114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return a newly allocated hit test on success, @c NULL otherwise.
1116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         Free memory with ewk_frame_hit_test_free()
1117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEwk_Hit_Test* ewk_frame_hit_test_new(const Evas_Object* o, int x, int y)
1119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
1121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, 0);
1122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::FrameView* view = sd->frame->view();
1124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(view, 0);
1125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame->contentRenderer(), 0);
1126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::HitTestResult result = sd->frame->eventHandler()->hitTestResultAtPoint
1128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        (view->windowToContents(WebCore::IntPoint(x, y)),
1129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         /*allowShadowContent*/ false, /*ignoreClipping*/ true);
1130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (result.scrollbar())
1132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
1133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!result.innerNode())
1134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
1135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Ewk_Hit_Test* hit_test = (Ewk_Hit_Test*)calloc(1, sizeof(Ewk_Hit_Test));
1137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hit_test) {
1138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        CRITICAL("Could not allocate memory for hit test.");
1139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
1140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->x = result.point().x();
1143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->y = result.point().y();
1144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if 0
1145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // FIXME
1146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->bounding_box.x = result.boundingBox().x();
1147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->bounding_box.y = result.boundingBox().y();
1148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->bounding_box.w = result.boundingBox().width();
1149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->bounding_box.h = result.boundingBox().height();
1150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
1151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->bounding_box.x = 0;
1152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->bounding_box.y = 0;
1153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->bounding_box.w = 0;
1154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->bounding_box.h = 0;
1155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
1156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::TextDirection dir;
1158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->title = eina_stringshare_add(result.title(dir).utf8().data());
1159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->alternate_text = eina_stringshare_add(result.altDisplayString().utf8().data());
1160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (result.innerNonSharedNode() && result.innerNonSharedNode()->document()
1161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        && result.innerNonSharedNode()->document()->frame())
1162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        hit_test->frame = kit(result.innerNonSharedNode()->document()->frame());
1163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->link.text = eina_stringshare_add(result.textContent().utf8().data());
11656ed1fdfa7999878a811b09cdd647fbeace4353b8Steve Block    hit_test->link.url = eina_stringshare_add(result.absoluteLinkURL().string().utf8().data());
1166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->link.title = eina_stringshare_add(result.titleDisplayString().utf8().data());
1167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->link.target_frame = kit(result.targetFrame());
1168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->flags.editable = result.isContentEditable();
1170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    hit_test->flags.selected = result.isSelected();
1171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return hit_test;
1173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Relative scroll of given frame.
1177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to scroll.
1179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param dx horizontal offset to scroll.
1180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param dy vertical offset to scroll.
1181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if possible, @c EINA_FALSE otherwise.
1183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool
1185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockewk_frame_scroll_add(Evas_Object* o, int dx, int dy)
1186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame->view(), EINA_FALSE);
119065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    sd->frame->view()->scrollBy(WebCore::IntSize(dx, dy));
1191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
1192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Set absolute scroll of given frame.
1196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Both values are from zero to the contents size minus the viewport
1198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * size. See ewk_frame_scroll_size_get().
1199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to scroll.
1201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param x horizontal position to scroll.
1202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param y vertical position to scroll.
1203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if possible, @c EINA_FALSE otherwise.
1205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool
1207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockewk_frame_scroll_set(Evas_Object* o, int x, int y)
1208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame->view(), EINA_FALSE);
1212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->frame->view()->setScrollPosition(WebCore::IntPoint(x, y));
1213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
1214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Get the possible scroll size of given frame.
1218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Possible scroll size is contents size minus the viewport
1220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * size. It's the last allowed value for ewk_frame_scroll_set()
1221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to scroll.
1223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param w where to return horizontal size that is possible to
1224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        scroll. May be @c NULL.
1225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param h where to return vertical size that is possible to scroll.
1226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        May be @c NULL.
1227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if possible, @c EINA_FALSE otherwise and
1229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         values are zeroed.
1230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool
1232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockewk_frame_scroll_size_get(const Evas_Object* o, int* w, int* h)
1233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (w)
1235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *w = 0;
1236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (h)
1237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *h = 0;
1238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame->view(), EINA_FALSE);
1241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::IntPoint point = sd->frame->view()->maximumScrollPosition();
1242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (w)
1243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *w = point.x();
1244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (h)
1245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *h = point.y();
1246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
1247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Get the current scroll position of given frame.
1251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to scroll.
1253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param x where to return horizontal position. May be @c NULL.
1254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param y where to return vertical position. May be @c NULL.
1255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if possible, @c EINA_FALSE otherwise and
1257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         values are zeroed.
1258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool
1260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockewk_frame_scroll_pos_get(const Evas_Object* o, int* x, int* y)
1261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (x)
1263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *x = 0;
1264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (y)
1265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *y = 0;
1266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame->view(), EINA_FALSE);
1269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::IntPoint pos = sd->frame->view()->scrollPosition();
1270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (x)
1271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *x = pos.x();
1272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (y)
1273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *y = pos.y();
1274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
1275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Get the current frame visible content geometry.
1279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to query visible content geometry.
1281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param include_scrollbars whenever to include scrollbars size.
1282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param x horizontal position. May be @c NULL.
1283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param y vertical position. May be @c NULL.
1284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param w width. May be @c NULL.
1285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param h height. May be @c NULL.
1286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if possible, @c EINA_FALSE otherwise and
1288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         values are zeroed.
1289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_visible_content_geometry_get(const Evas_Object* o, Eina_Bool include_scrollbars, int* x, int* y, int* w, int* h)
1291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (x)
1293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *x = 0;
1294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (y)
1295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *y = 0;
1296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (w)
1297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *w = 0;
1298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (h)
1299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *h = 0;
1300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame->view(), EINA_FALSE);
1303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::IntRect rect = sd->frame->view()->visibleContentRect(include_scrollbars);
1304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (x)
1305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *x = rect.x();
1306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (y)
1307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *y = rect.y();
1308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (w)
1309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *w = rect.width();
1310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (h)
1311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *h = rect.height();
1312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
1313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Get the current paintsEntireContents flag.
1317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This flag tells if dirty areas should be repainted even if they are
1319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * out of the screen.
1320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to query paintsEntireContents flag.
1322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if repainting any dirty area, @c EINA_FALSE
1324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         otherwise.
1325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_paint_full_get(const Evas_Object* o)
1327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame->view(), EINA_FALSE);
1331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->frame->view()->paintsEntireContents();
1332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Set the current paintsEntireContents flag.
1336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This flag tells if dirty areas should be repainted even if they are
1338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * out of the screen.
1339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to set paintsEntireContents flag.
1341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param flag @c EINA_TRUE if want to always repaint any dirty area,
1342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *             @c EINA_FALSE otherwise.
1343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_paint_full_set(Evas_Object* o, Eina_Bool flag)
1345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
1347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN(sd->frame);
1348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN(sd->frame->view());
1349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->frame->view()->setPaintsEntireContents(flag);
1350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Feed the focus in signal to this frame.
1354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to focus.
1356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if it was handled, @c EINA_FALSE otherwise.
1358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_feed_focus_in(Evas_Object* o)
1360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::FocusController* c = sd->frame->page()->focusController();
1364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    c->setFocusedFrame(sd->frame);
1365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
1366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Feed the focus out signal to this frame.
1370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to remove focus.
1372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_feed_focus_out(Evas_Object* o)
1374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // TODO: what to do on focus out?
1376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ERR("what to do?");
1377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_FALSE;
1378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Feed the mouse wheel event to the frame.
1382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to feed event.
1384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param ev mouse wheel event.
1385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if it was handled, @c EINA_FALSE otherwise.
1387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_feed_mouse_wheel(Evas_Object* o, const Evas_Event_Mouse_Wheel* ev)
1389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(ev, EINA_FALSE);
1393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::FrameView* view = sd->frame->view();
1395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p, view=%p, direction=%d, z=%d, pos=%d,%d",
1396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        o, view, ev->direction, ev->z, ev->canvas.x, ev->canvas.y);
1397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(view, EINA_FALSE);
1398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::PlatformWheelEvent event(ev);
1400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->frame->eventHandler()->handleWheelEvent(event);
1401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Feed the mouse down event to the frame.
1405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to feed event.
1407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param ev mouse down event.
1408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if it was handled, @c EINA_FALSE otherwise.
1410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_feed_mouse_down(Evas_Object* o, const Evas_Event_Mouse_Down* ev)
1412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(ev, EINA_FALSE);
1416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::FrameView* view = sd->frame->view();
1418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p, view=%p, button=%d, pos=%d,%d",
1419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        o, view, ev->button, ev->canvas.x, ev->canvas.y);
1420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(view, EINA_FALSE);
1421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord x, y;
1423dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_geometry_get(sd->view, &x, &y, 0, 0);
1424dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::PlatformMouseEvent event(ev, WebCore::IntPoint(x, y));
1426dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->frame->eventHandler()->handleMousePressEvent(event);
1427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1430dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Feed the mouse up event to the frame.
1431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to feed event.
1433dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param ev mouse up event.
1434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if it was handled, @c EINA_FALSE otherwise.
1436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_feed_mouse_up(Evas_Object* o, const Evas_Event_Mouse_Up* ev)
1438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1441dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(ev, EINA_FALSE);
1442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::FrameView* view = sd->frame->view();
1444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p, view=%p, button=%d, pos=%d,%d",
1445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        o, view, ev->button, ev->canvas.x, ev->canvas.y);
1446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(view, EINA_FALSE);
1447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord x, y;
1449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_geometry_get(sd->view, &x, &y, 0, 0);
1450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::PlatformMouseEvent event(ev, WebCore::IntPoint(x, y));
1452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->frame->eventHandler()->handleMouseReleaseEvent(event);
1453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1454dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Feed the mouse move event to the frame.
1457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to feed event.
1459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param ev mouse move event.
1460dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if it was handled, @c EINA_FALSE otherwise.
1462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_feed_mouse_move(Evas_Object* o, const Evas_Event_Mouse_Move* ev)
1464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(ev, EINA_FALSE);
1468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::FrameView* view = sd->frame->view();
1470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p, view=%p, pos: old=%d,%d, new=%d,%d, buttons=%d",
1471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        o, view, ev->cur.canvas.x, ev->cur.canvas.y,
1472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ev->prev.canvas.x, ev->prev.canvas.y, ev->buttons);
1473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(view, EINA_FALSE);
1474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord x, y;
1476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_geometry_get(sd->view, &x, &y, 0, 0);
1477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::PlatformMouseEvent event(ev, WebCore::IntPoint(x, y));
1479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->frame->eventHandler()->mouseMoved(event);
1480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1482cad810f21b803229eb11403f9209855525a25d57Steve BlockEina_Bool ewk_frame_feed_touch_event(Evas_Object* o, Ewk_Touch_Event_Type action, Eina_List* points, int metaState)
1483cad810f21b803229eb11403f9209855525a25d57Steve Block{
1484cad810f21b803229eb11403f9209855525a25d57Steve Block    Eina_Bool ret = EINA_FALSE;
1485cad810f21b803229eb11403f9209855525a25d57Steve Block
1486cad810f21b803229eb11403f9209855525a25d57Steve Block#if ENABLE(TOUCH_EVENTS)
1487cad810f21b803229eb11403f9209855525a25d57Steve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(points, EINA_FALSE);
14882bde8e466a4451c7319e3a072d118917957d6554Steve Block    EWK_FRAME_SD_GET(o, sd);
14892bde8e466a4451c7319e3a072d118917957d6554Steve Block
14902bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!sd || !sd->frame || !ewk_view_need_touch_events_get(sd->view)) {
14912bde8e466a4451c7319e3a072d118917957d6554Steve Block        void* point;
14922bde8e466a4451c7319e3a072d118917957d6554Steve Block        EINA_LIST_FREE(points, point);
14932bde8e466a4451c7319e3a072d118917957d6554Steve Block        return EINA_FALSE;
14942bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1495cad810f21b803229eb11403f9209855525a25d57Steve Block
1496cad810f21b803229eb11403f9209855525a25d57Steve Block    Evas_Coord x, y;
1497cad810f21b803229eb11403f9209855525a25d57Steve Block    evas_object_geometry_get(sd->view, &x, &y, 0, 0);
1498cad810f21b803229eb11403f9209855525a25d57Steve Block
1499cad810f21b803229eb11403f9209855525a25d57Steve Block    WebCore::TouchEventType type = WebCore::TouchStart;
1500cad810f21b803229eb11403f9209855525a25d57Steve Block    switch (action) {
1501cad810f21b803229eb11403f9209855525a25d57Steve Block    case EWK_TOUCH_START:
1502cad810f21b803229eb11403f9209855525a25d57Steve Block        type = WebCore::TouchStart;
1503cad810f21b803229eb11403f9209855525a25d57Steve Block        break;
1504cad810f21b803229eb11403f9209855525a25d57Steve Block    case EWK_TOUCH_END:
1505cad810f21b803229eb11403f9209855525a25d57Steve Block        type = WebCore::TouchEnd;
1506cad810f21b803229eb11403f9209855525a25d57Steve Block        break;
1507cad810f21b803229eb11403f9209855525a25d57Steve Block    case EWK_TOUCH_MOVE:
1508cad810f21b803229eb11403f9209855525a25d57Steve Block        type = WebCore::TouchMove;
1509cad810f21b803229eb11403f9209855525a25d57Steve Block        break;
1510cad810f21b803229eb11403f9209855525a25d57Steve Block    case EWK_TOUCH_CANCEL:
1511cad810f21b803229eb11403f9209855525a25d57Steve Block        type = WebCore::TouchCancel;
1512cad810f21b803229eb11403f9209855525a25d57Steve Block        break;
1513cad810f21b803229eb11403f9209855525a25d57Steve Block    default:
1514cad810f21b803229eb11403f9209855525a25d57Steve Block        return EINA_FALSE;
1515cad810f21b803229eb11403f9209855525a25d57Steve Block    }
1516cad810f21b803229eb11403f9209855525a25d57Steve Block
1517cad810f21b803229eb11403f9209855525a25d57Steve Block    WebCore::PlatformTouchEvent te(points, WebCore::IntPoint(x, y), type, metaState);
1518cad810f21b803229eb11403f9209855525a25d57Steve Block    ret = sd->frame->eventHandler()->handleTouchEvent(te);
1519cad810f21b803229eb11403f9209855525a25d57Steve Block#endif
1520cad810f21b803229eb11403f9209855525a25d57Steve Block    return ret;
1521cad810f21b803229eb11403f9209855525a25d57Steve Block}
1522cad810f21b803229eb11403f9209855525a25d57Steve Block
1523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline Eina_Bool _ewk_frame_handle_key_scrolling(WebCore::Frame* frame, const WebCore::PlatformKeyboardEvent &event)
1524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::ScrollDirection direction;
1526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::ScrollGranularity granularity;
1527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int keyCode = event.windowsVirtualKeyCode();
1529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (keyCode) {
153121939df44de1705786c545cd1bf519d47250322dBen Murdoch    case VK_SPACE:
1532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        granularity = WebCore::ScrollByPage;
1533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (event.shiftKey())
1534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            direction = WebCore::ScrollUp;
1535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else
1536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            direction = WebCore::ScrollDown;
1537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
153821939df44de1705786c545cd1bf519d47250322dBen Murdoch    case VK_NEXT:
1539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        granularity = WebCore::ScrollByPage;
1540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        direction = WebCore::ScrollDown;
1541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
154221939df44de1705786c545cd1bf519d47250322dBen Murdoch    case VK_PRIOR:
1543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        granularity = WebCore::ScrollByPage;
1544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        direction = WebCore::ScrollUp;
1545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
154621939df44de1705786c545cd1bf519d47250322dBen Murdoch    case VK_HOME:
1547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        granularity = WebCore::ScrollByDocument;
1548dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        direction = WebCore::ScrollUp;
1549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
155021939df44de1705786c545cd1bf519d47250322dBen Murdoch    case VK_END:
1551dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        granularity = WebCore::ScrollByDocument;
1552dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        direction = WebCore::ScrollDown;
1553dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
155421939df44de1705786c545cd1bf519d47250322dBen Murdoch    case VK_LEFT:
1555dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        granularity = WebCore::ScrollByLine;
1556dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        direction = WebCore::ScrollLeft;
1557dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
155821939df44de1705786c545cd1bf519d47250322dBen Murdoch    case VK_RIGHT:
1559dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        granularity = WebCore::ScrollByLine;
1560dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        direction = WebCore::ScrollRight;
1561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
156221939df44de1705786c545cd1bf519d47250322dBen Murdoch    case VK_UP:
1563dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        direction = WebCore::ScrollUp;
1564dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (event.ctrlKey())
1565dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            granularity = WebCore::ScrollByDocument;
1566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else
1567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            granularity = WebCore::ScrollByLine;
1568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
156921939df44de1705786c545cd1bf519d47250322dBen Murdoch    case VK_DOWN:
1570dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        direction = WebCore::ScrollDown;
1571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         if (event.ctrlKey())
1572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            granularity = WebCore::ScrollByDocument;
1573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else
1574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            granularity = WebCore::ScrollByLine;
1575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
1576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
1577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EINA_FALSE;
1578dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1579dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1580dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (frame->eventHandler()->scrollOverflow(direction, granularity))
1581dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EINA_FALSE;
1582dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1583dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    frame->view()->scroll(direction, granularity);
1584dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
1585dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Feed the keyboard key down event to the frame.
1589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1590dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to feed event.
1591dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param ev keyboard key down event.
1592dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1593dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if it was handled, @c EINA_FALSE otherwise.
1594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_feed_key_down(Evas_Object* o, const Evas_Event_Key_Down* ev)
1596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(ev, EINA_FALSE);
1600dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1601dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p keyname=%s (key=%s, string=%s)",
1602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        o, ev->keyname, ev->key ? ev->key : "", ev->string ? ev->string : "");
1603dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::PlatformKeyboardEvent event(ev);
1605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->frame->eventHandler()->keyEvent(event))
1606dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EINA_TRUE;
1607dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1608dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _ewk_frame_handle_key_scrolling(sd->frame, event);
1609dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1610dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1611dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1612dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Feed the keyboard key up event to the frame.
1613dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param o frame object to feed event.
1615dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param ev keyboard key up event.
1616dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1617dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE if it was handled, @c EINA_FALSE otherwise.
1618dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1619dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_feed_key_up(Evas_Object* o, const Evas_Event_Key_Up* ev)
1620dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
1623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(ev, EINA_FALSE);
1624dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p keyname=%s (key=%s, string=%s)",
1626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        o, ev->keyname, ev->key ? ev->key : "", ev->string ? ev->string : "");
1627dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::PlatformKeyboardEvent event(ev);
1629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->frame->eventHandler()->keyEvent(event);
1630dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1631dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1632dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* internal methods ****************************************************/
1633dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1634dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1635dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
1636dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1637dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Initialize frame based on actual WebKit frame.
1638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This is internal and should never be called by external users.
1640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_init(Evas_Object* o, Evas_Object* view, WebCore::Frame* frame)
1642dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1643dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
1644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!sd->frame) {
1645dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        WebCore::FrameLoaderClientEfl* flc = _ewk_frame_loader_efl_get(frame);
1646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        flc->setWebFrame(o);
1647dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sd->frame = frame;
1648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sd->view = view;
1649dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frame->init();
1650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EINA_TRUE;
1651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ERR("frame %p already set for %p, ignored new %p",
1654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sd->frame, o, frame);
1655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_FALSE;
1656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1658dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochEvas_Object* ewk_frame_child_add(Evas_Object* o, WTF::PassRefPtr<WebCore::Frame> child, const WTF::String& name, const WebCore::KURL& url, const WTF::String& referrer)
1659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
1661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    char buf[256];
1662dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object* frame;
1663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::Frame* cf;
1664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1665dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    frame = ewk_frame_add(sd->base.evas);
1666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!frame) {
1667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ERR("Could not create ewk_frame object.");
1668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
1669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    cf = child.get();
1672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (cf->tree())
1673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        cf->tree()->setName(name);
1674dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
1675dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ERR("no tree for child object");
167628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    sd->frame->tree()->appendChild(child);
1677dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1678dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!ewk_frame_init(frame, sd->view, cf)) {
1679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_del(frame);
1680dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
1681dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1682dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    snprintf(buf, sizeof(buf), "EWK_Frame:child/%s", name.utf8().data());
1683dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_name_set(frame, buf);
1684dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_member_add(frame, o);
1685dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_show(frame);
1686dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1687dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!cf->page())
1688dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        goto died;
1689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    sd->frame->loader()->loadURLIntoChildFrame(url, referrer, cf);
1691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!cf->tree()->parent())
1692dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        goto died;
1693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // TODO: announce frame was created?
1695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return frame;
1696dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1697dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockdied:
1698dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CRITICAL("does this work: BEGIN");
1699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_frame_core_gone(frame); // CONFIRM
1700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_del(frame); // CONFIRM
1701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CRITICAL("does this work: END");
1702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0;
1703dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1705dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1706dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
1707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Frame was destroyed by loader, remove internal reference.
1708dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1709dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_core_gone(Evas_Object* o)
1710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1711dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p", o);
1712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
1713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->frame = 0;
1714dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1715dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1717dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
1718dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Retrieve WebCore::Frame associated with this object.
1719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1720dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Avoid using this call from outside, add specific ewk_frame_*
1721dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * actions instead.
1722dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1723dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebCore::Frame* ewk_frame_core_get(const Evas_Object* o)
1724dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1725dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, 0);
1726dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return sd->frame;
1727dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1729dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
1732e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Reports a resource will be requested. User may override behavior of webkit by
1733e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * changing values in @param request.
1734e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1735e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param o Frame.
1736e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param request Request details that user may override. Whenever values on
1737e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * this struct changes, it must be properly malloc'd as it will be freed
1738e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * afterwards.
1739e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1740e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Emits signal: "resource,request,willsend"
1741e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
1742e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid ewk_frame_request_will_send(Evas_Object *o, Ewk_Frame_Resource_Request *request)
1743e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1744e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    evas_object_smart_callback_call(o, "resource,request,willsend", request);
1745e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
1746e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1747e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/**
1748e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @internal
1749e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Reports that there's a new resource.
1750e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1751e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param o Frame.
1752e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param request New request details. No changes are allowed to fields.
1753e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1754e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Emits signal: "resource,request,new"
1755e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
1756e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid ewk_frame_request_assign_identifier(Evas_Object *o, const Ewk_Frame_Resource_Request *request)
1757e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1758e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    evas_object_smart_callback_call(o, "resource,request,new", (void *)request);
1759e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
1760e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1761e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/**
1762e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @internal
1763e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Reports that first navigation occurred
1764e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1765e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param o Frame.
1766e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1767e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Emits signal: "navigation,first"
1768e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
1769e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid ewk_frame_did_perform_first_navigation(Evas_Object *o)
1770e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1771e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    evas_object_smart_callback_call(o, "navigation,first", 0);
1772e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
1773e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1774e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/**
1775e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @internal
1776e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Reports frame will be saved to current state
1777e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1778e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param o Frame.
1779e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param item History item to save details to.
1780e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1781e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Emits signal: "state,save"
1782e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
1783e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid ewk_frame_view_state_save(Evas_Object *o, WebCore::HistoryItem* item)
1784e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1785e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    evas_object_smart_callback_call(o, "state,save", 0);
1786e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
1787e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1788e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/**
1789e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @internal
1790dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Reports the frame started loading something.
1791dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1792dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Emits signal: "load,started" with no parameters.
1793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_load_started(Evas_Object* o)
1795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object* main_frame;
1797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p", o);
1798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_call(o, "load,started", 0);
1799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
1800dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_view_load_started(sd->view);
1801dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1802dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    main_frame = ewk_view_frame_main_get(sd->view);
1803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (main_frame == o)
1804dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_frame_main_load_started(sd->view);
1805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
1809e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Reports the frame started provisional load.
1810e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1811e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param o Frame.
1812e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1813e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Emits signal: "load,provisional" with no parameters.
1814e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
1815e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid ewk_frame_load_provisional(Evas_Object* o)
1816e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1817e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    evas_object_smart_callback_call(o, "load,provisional", 0);
1818e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
1819e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1820e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/**
1821e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @internal
1822e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Reports the frame finished first layout.
1823e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1824e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param o Frame.
1825e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1826e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Emits signal: "load,firstlayout,finished" with no parameters.
1827e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
1828e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid ewk_frame_load_firstlayout_finished(Evas_Object *o)
1829e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1830e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    evas_object_smart_callback_call(o, "load,firstlayout,finished", 0);
1831e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
1832e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1833e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/**
1834e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @internal
1835e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Reports the frame finished first non empty layout.
1836e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1837e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param o Frame.
1838e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1839e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Emits signal: "load,nonemptylayout,finished" with no parameters.
1840e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
1841e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid ewk_frame_load_firstlayout_nonempty_finished(Evas_Object *o)
1842e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1843e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    evas_object_smart_callback_call(o, "load,nonemptylayout,finished", 0);
1844e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
1845e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1846e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/**
1847e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @internal
1848e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Reports the loading of a document has finished on frame.
1849e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1850e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @param o Frame.
1851e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
1852e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Emits signal: "load,document,finished" with no parameters.
1853e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
1854e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid ewk_frame_load_document_finished(Evas_Object *o)
1855e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1856e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    evas_object_smart_callback_call(o, "load,document,finished", 0);
1857e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
1858e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1859e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/**
1860e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * @internal
1861dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Reports load finished, optionally with error information.
1862dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1863dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Emits signal: "load,finished" with pointer to Ewk_Frame_Load_Error
1864dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * if any error, or @c NULL if successful load.
1865dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1866dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @note there should notbe any error stuff here, but trying to be
1867dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *       compatible with previous WebKit.
1868dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1869dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_load_finished(Evas_Object* o, const char* error_domain, int error_code, Eina_Bool is_cancellation, const char* error_description, const char* failing_url)
1870dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1871dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Ewk_Frame_Load_Error buf, *error;
1872dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!error_domain) {
1873dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        DBG("o=%p, success.", o);
1874dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        error = 0;
1875dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
1876dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        DBG("o=%p, error=%s (%d, cancellation=%hhu) \"%s\", url=%s",
1877dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            o, error_domain, error_code, is_cancellation,
1878dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            error_description, failing_url);
1879dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1880dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        buf.domain = error_domain;
1881dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        buf.code = error_code;
1882dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        buf.is_cancellation = is_cancellation;
1883dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        buf.description = error_description;
1884dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        buf.failing_url = failing_url;
1885dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        buf.frame = o;
1886dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        error = &buf;
1887dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1888dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_call(o, "load,finished", error);
1889dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
1890dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_view_load_finished(sd->view, error);
1891dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1892dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1893dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
1895dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Reports load failed with error information.
1896dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1897dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Emits signal: "load,error" with pointer to Ewk_Frame_Load_Error.
1898dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1899dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_load_error(Evas_Object* o, const char* error_domain, int error_code, Eina_Bool is_cancellation, const char* error_description, const char* failing_url)
1900dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1901dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Ewk_Frame_Load_Error error;
1902dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1903dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p, error=%s (%d, cancellation=%hhu) \"%s\", url=%s",
1904dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        o, error_domain, error_code, is_cancellation,
1905dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        error_description, failing_url);
1906dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1907dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN(error_domain);
1908dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1909dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    error.code = error_code;
1910dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    error.is_cancellation = is_cancellation;
1911dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    error.domain = error_domain;
1912dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    error.description = error_description;
1913dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    error.failing_url = failing_url;
1914dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    error.frame = o;
1915dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_call(o, "load,error", &error);
1916dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
1917dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_view_load_error(sd->view, &error);
1918dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1919dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1920dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1921dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
1922dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Reports load progress changed.
1923dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Emits signal: "load,progress" with pointer to a double from 0.0 to 1.0.
1925dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1926dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_load_progress_changed(Evas_Object* o)
1927dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1928dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
1929dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN(sd->frame);
1930dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // TODO: this is per page, there should be a way to have per-frame.
1932dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double progress = sd->frame->page()->progress()->estimatedProgress();
1933dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1934dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p (p=%0.3f)", o, progress);
1935dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1936dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_call(o, "load,progress", &progress);
1937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_view_load_progress_changed(sd->view);
1938dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1939dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1940dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1941dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
1943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1944dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Reports contents size changed.
1945dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_contents_size_changed(Evas_Object* o, Evas_Coord w, Evas_Coord h)
1947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1948dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p: %dx%d", o, w, h);
1949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
1950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->contents_size.w == w && sd->contents_size.h == h)
1951dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
1952dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->contents_size.w = w;
1953dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->contents_size.h = h;
1954dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // TODO: update something else internally?
1955dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1956dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord size[2] = {w, h};
1957dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_call(o, "contents,size,changed", size);
1958dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1959dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1960dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
1961dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
1962dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
1963dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Reports title changed.
1964dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
1965dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_title_set(Evas_Object* o, const char* title)
1966dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1967dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p, title=%s", o, title ? title : "(null)");
1968dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
1969dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!eina_stringshare_replace(&sd->title, title))
1970dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
1971dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_call(o, "title,changed", (void*)sd->title);
1972dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1973dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1974dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_view_create_for_view(Evas_Object* o, Evas_Object* view)
1975dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1976dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p, view=%p", o, view);
1977dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
1978dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN(sd->frame);
1979dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord w, h;
1980dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1981dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->frame->view())
1982dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
1983dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1984dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_geometry_get(view, 0, 0, &w, &h);
1985dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1986dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::IntSize size(w, h);
1987dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int r, g, b, a;
1988dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::Color bg;
1989dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1990dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_view_bg_color_get(view, &r, &g, &b, &a);
1991dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!a)
1992dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bg = WebCore::Color(0, 0, 0, 0);
1993dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else if (a == 255)
1994dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bg = WebCore::Color(r, g, b, a);
1995dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
1996dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bg = WebCore::Color(r * 255 / a, g * 255 / a, b * 255 / a, a);
1997dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1998dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->frame->createView(size, bg, !a, WebCore::IntSize(), false);
1999dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!sd->frame->view())
2000dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
200168513a70bcd92384395513322f1b801e7bf9c729Steve Block
200268513a70bcd92384395513322f1b801e7bf9c729Steve Block    const char* theme = ewk_view_theme_get(view);
200368513a70bcd92384395513322f1b801e7bf9c729Steve Block    sd->frame->view()->setEdjeTheme(theme);
2004dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sd->frame->view()->setEvasObject(o);
2005dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2006dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2007dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
2008dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @internal
2009dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Reports uri changed and swap internal string reference.
2010dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
2011dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Emits signal: "uri,changed" with new uri as parameter.
2012dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
2013dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_frame_uri_changed(Evas_Object* o)
2014dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
2015dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd, EINA_FALSE);
2016dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN_VAL(sd->frame, EINA_FALSE);
20176ed1fdfa7999878a811b09cdd647fbeace4353b8Steve Block    WTF::CString uri(sd->frame->document()->url().string().utf8());
2018dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2019dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    INF("uri=%s", uri.data());
2020dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!uri.data()) {
2021dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ERR("no uri");
2022dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EINA_FALSE;
2023dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2024dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2025dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    eina_stringshare_replace(&sd->uri, uri.data());
2026dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_call(o, "uri,changed", (void*)sd->uri);
2027dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
2028dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2029dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2030dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ewk_frame_force_layout(Evas_Object* o)
2031dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
2032dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("o=%p", o);
2033dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EWK_FRAME_SD_GET_OR_RETURN(o, sd);
2034dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_NULL_RETURN(sd->frame);
2035dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::FrameView* view = sd->frame->view();
2036dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (view)
2037dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        view->forceLayout(true);
2038dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2039dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2040f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickWTF::PassRefPtr<WebCore::Widget> ewk_frame_plugin_create(Evas_Object* o, const WebCore::IntSize& pluginSize, WebCore::HTMLPlugInElement* element, const WebCore::KURL& url, const WTF::Vector<WTF::String>& paramNames, const WTF::Vector<WTF::String>& paramValues, const WTF::String& mimeType, bool loadManually)
2041dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
2042dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0;
2043dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2044