XWalk WebView patchset, README and LICENSE files.
[platform/framework/web/xwalk_webview.git] / patchset / 0009-Implement-focus-handling-of-delegate.patch
1 From c1f83116854209a14f7c7fde0b6851297b584c3b Mon Sep 17 00:00:00 2001
2 From: Dongseong Hwang <dongseong.hwang@intel.com>
3 Date: Mon, 22 Jul 2013 19:49:15 +0300
4 Subject: [PATCH 09/33] Implement focus handling of delegate.
5
6 There are two important delegate functions that allow embedder control focus.
7 1. WebContentsViewDelegate::Focus() : time to focus in web contents widget.
8 2. WebContentsDelegate::TakeFocus() : time to focus out web contents widget and
9 focus in next widget in toolkit framework.
10 ---
11  .../renderer_host/render_widget_host_view_efl.cc   | 27 +++++++++----
12  .../browser/web_contents/web_contents_view_efl.cc  | 10 +++--
13  .../browser/web_contents/web_contents_view_efl.h   |  1 +
14  .../public/browser/web_contents_view_delegate.h    |  2 +
15  content/shell/DEPS                                 |  3 ++
16  content/shell/shell.cc                             |  6 +++
17  content/shell/shell.h                              |  2 +
18  content/shell/shell_efl.cc                         | 10 +++++
19  content/shell/shell_web_contents_view_delegate.h   |  1 +
20  .../shell/shell_web_contents_view_delegate_efl.cc  |  9 +++++
21  efl_webview/efl_webview.gyp                        |  4 ++
22  efl_webview/examples/main.cc                       |  4 +-
23  efl_webview/lib/content_browser_client_xwalk.cc    |  8 ++++
24  efl_webview/lib/content_browser_client_xwalk.h     |  2 +
25  efl_webview/lib/web_contents_delegate_xwalk.cc     | 36 +++++++++++++++++
26  efl_webview/lib/web_contents_delegate_xwalk.h      | 35 ++++++++++++++++
27  .../lib/web_contents_view_delegate_xwalk.cc        | 40 +++++++++++++++++++
28  efl_webview/lib/web_contents_view_delegate_xwalk.h | 40 +++++++++++++++++++
29  efl_webview/lib/webview.cc                         | 46 ++++++----------------
30  19 files changed, 241 insertions(+), 45 deletions(-)
31  create mode 100644 efl_webview/lib/web_contents_delegate_xwalk.cc
32  create mode 100644 efl_webview/lib/web_contents_delegate_xwalk.h
33  create mode 100644 efl_webview/lib/web_contents_view_delegate_xwalk.cc
34  create mode 100644 efl_webview/lib/web_contents_view_delegate_xwalk.h
35
36 diff --git a/content/browser/renderer_host/render_widget_host_view_efl.cc b/content/browser/renderer_host/render_widget_host_view_efl.cc
37 index 9858418..22b1967 100644
38 --- a/content/browser/renderer_host/render_widget_host_view_efl.cc
39 +++ b/content/browser/renderer_host/render_widget_host_view_efl.cc
40 @@ -131,10 +131,19 @@ void RenderWidgetHostViewEfl::PreserveWindowKeyUp(Evas_Event_Key_Up* key_up) {
41  }
42  
43  void RenderWidgetHostViewEfl::PreserveWindowFocusIn() {
44 +  ShowCurrentCursor();
45 +  if (!host_)
46 +      return;
47 +
48 +  host_->GotFocus();
49 +  host_->SetActive(true);
50  }
51  
52  void RenderWidgetHostViewEfl::PreserveWindowFocusOut() {
53 -//  root_window_host_delegate_->OnHostLostMouseGrab();
54 +  if (host_ && !IsShowingContextMenu()) {
55 +    host_->SetActive(false);
56 +    host_->Blur();
57 +  }
58  }
59  
60  void RenderWidgetHostViewEfl::PreserveWindowShow() {
61 @@ -148,11 +157,15 @@ void RenderWidgetHostViewEfl::PreserveWindowMove(const gfx::Point& origin) {
62  }
63  
64  void RenderWidgetHostViewEfl::PreserveWindowResize(const gfx::Size& size) {
65 -  SetSize(size);
66 +  if (!host_)
67 +    return;
68 +    SetSize(size);
69  }
70  
71  void RenderWidgetHostViewEfl::PreserveWindowRepaint(const gfx::Rect& damage_rect) {
72 -  Paint(damage_rect);
73 +  if (!host_)
74 +    return;
75 +    Paint(damage_rect);
76  }
77  
78  bool RenderWidgetHostViewEfl::OnMessageReceived(const IPC::Message& message) {
79 @@ -169,12 +182,10 @@ bool RenderWidgetHostViewEfl::OnMessageReceived(const IPC::Message& message) {
80  
81  void RenderWidgetHostViewEfl::InitAsChild(
82      gfx::NativeView parent_view) {
83 -  Evas_Object* elm_box = reinterpret_cast<Evas_Object*>(parent_view);
84 -  Evas* evas = evas_object_evas_get(elm_box);
85 -  preserve_window_ = gfx::PreserveWindow::Create(this, evas);
86 +  preserve_window_ = gfx::PreserveWindow::Create(this, evas_object_evas_get(parent_view));
87    evas_object_size_hint_align_set(preserve_window_->SmartObject(), EVAS_HINT_FILL, EVAS_HINT_FILL);
88    evas_object_size_hint_weight_set(preserve_window_->SmartObject(), EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
89 -  elm_box_pack_end(elm_box, preserve_window_->SmartObject());
90 +  elm_box_pack_end(parent_view, preserve_window_->SmartObject());
91    evas_object_show(preserve_window_->SmartObject());
92    compositing_surface_ = elm_win_xwindow_get(preserve_window_->EvasWindow());
93  }
94 @@ -241,7 +252,7 @@ void RenderWidgetHostViewEfl::SetBounds(const gfx::Rect& rect) {
95  }
96  
97  gfx::NativeView RenderWidgetHostViewEfl::GetNativeView() const {
98 -  return reinterpret_cast<gfx::NativeView>(preserve_window_->SmartObject());
99 +  return preserve_window_->SmartObject();
100  }
101  
102  gfx::NativeViewId RenderWidgetHostViewEfl::GetNativeViewId() const {
103 diff --git a/content/browser/web_contents/web_contents_view_efl.cc b/content/browser/web_contents/web_contents_view_efl.cc
104 index ccdfbf3..3885d0b 100644
105 --- a/content/browser/web_contents/web_contents_view_efl.cc
106 +++ b/content/browser/web_contents/web_contents_view_efl.cc
107 @@ -70,7 +70,9 @@ void WebContentsViewEfl::OnTabCrashed(base::TerminationStatus status,
108  }
109  
110  void WebContentsViewEfl::Focus() {
111 -  // TODO: Focus.
112 +  if (delegate_) {
113 +    delegate_->Focus();
114 +  }
115  }
116  
117  void WebContentsViewEfl::SetInitialFocus() {
118 @@ -110,7 +112,7 @@ RenderWidgetHostView* WebContentsViewEfl::CreateViewForWidget(
119  
120    RenderWidgetHostView* view =
121        RenderWidgetHostView::CreateViewForWidget(render_widget_host);
122 -  view->InitAsChild(reinterpret_cast<gfx::NativeView>(view_container_box_));
123 +  view->InitAsChild(view_container_box_);
124    if (render_widget_host->IsRenderView()) {
125      RenderViewHost* rvh = RenderViewHost::From(render_widget_host);
126      if (!static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out())
127 @@ -158,7 +160,9 @@ void WebContentsViewEfl::GotFocus() {
128  // This is called when the renderer asks us to take focus back (i.e., it has
129  // iterated past the last focusable element on the page).
130  void WebContentsViewEfl::TakeFocus(bool reverse) {
131 -  /* TODO: Assign Focus to EFL evas_object */
132 +  if (!web_contents_->GetDelegate())
133 +    return;
134 +  web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse);
135  }
136  
137  void WebContentsViewEfl::UpdateDragDest(RenderViewHost* host) {
138 diff --git a/content/browser/web_contents/web_contents_view_efl.h b/content/browser/web_contents/web_contents_view_efl.h
139 index 3c6d2f6..e481009 100644
140 --- a/content/browser/web_contents/web_contents_view_efl.h
141 +++ b/content/browser/web_contents/web_contents_view_efl.h
142 @@ -81,6 +81,7 @@ class CONTENT_EXPORT WebContentsViewEfl
143    virtual void TakeFocus(bool reverse) OVERRIDE;
144  
145    void SetViewContainerBox(Evas_Object* container_box) { view_container_box_ = container_box; }
146 +  Evas_Object* ViewContainerBox() { return view_container_box_; }
147  
148   private:
149    void UpdateDragDest(RenderViewHost* new_host);
150 diff --git a/content/public/browser/web_contents_view_delegate.h b/content/public/browser/web_contents_view_delegate.h
151 index 605582b..aec9701 100644
152 --- a/content/public/browser/web_contents_view_delegate.h
153 +++ b/content/public/browser/web_contents_view_delegate.h
154 @@ -81,6 +81,8 @@ class CONTENT_EXPORT WebContentsViewDelegate {
155    virtual NSObject<RenderWidgetHostViewMacDelegate>*
156        CreateRenderWidgetHostViewDelegate(
157            RenderWidgetHost* render_widget_host) = 0;
158 +#elif defined(TOOLKIT_EFL)
159 +  virtual void Focus() = 0;
160  #endif
161  };
162  
163 diff --git a/content/shell/DEPS b/content/shell/DEPS
164 index 64bcfea..08bdc07 100644
165 --- a/content/shell/DEPS
166 +++ b/content/shell/DEPS
167 @@ -8,6 +8,9 @@ include_rules = [
168    # content's public API.
169    "+content/public",
170  
171 +  # content/shell/shell_web_contents_view_delegate_efl.cc illegally include "content/browser/web_contents/web_contents_view_efl.h"
172 +  "+content/browser",
173 +
174    # The content_shell is an embedder so it must work with resource bundles.
175    "+ui/base/l10n",
176    "+ui/base/resource",
177 diff --git a/content/shell/shell.cc b/content/shell/shell.cc
178 index 5eac7af..9e6576e 100644
179 --- a/content/shell/shell.cc
180 +++ b/content/shell/shell.cc
181 @@ -309,6 +309,12 @@ void Shell::DeactivateContents(WebContents* contents) {
182    contents->GetRenderViewHost()->Blur();
183  }
184  
185 +#if !defined(TOOLKIT_EFL)
186 +bool Shell::TakeFocus(WebContents* source, bool reverse) {
187 +  return false;
188 +}
189 +#endif
190 +
191  void Shell::Observe(int type,
192                      const NotificationSource& source,
193                      const NotificationDetails& details) {
194 diff --git a/content/shell/shell.h b/content/shell/shell.h
195 index e58bb42..2d9ba10 100644
196 --- a/content/shell/shell.h
197 +++ b/content/shell/shell.h
198 @@ -144,6 +144,8 @@ class Shell : public WebContentsDelegate,
199    virtual void RendererUnresponsive(WebContents* source) OVERRIDE;
200    virtual void ActivateContents(WebContents* contents) OVERRIDE;
201    virtual void DeactivateContents(WebContents* contents) OVERRIDE;
202 +  virtual bool TakeFocus(content::WebContents* source,
203 +                         bool reverse) OVERRIDE;
204  
205   private:
206    enum UIControl {
207 diff --git a/content/shell/shell_efl.cc b/content/shell/shell_efl.cc
208 index 557424e..e4ec4e5 100644
209 --- a/content/shell/shell_efl.cc
210 +++ b/content/shell/shell_efl.cc
211 @@ -105,4 +105,14 @@ void Shell::OnMainWindowDel(void* data, Evas* evas, Evas_Object* object,
212    delete shell;
213  }
214  
215 +bool Shell::TakeFocus(WebContents* source, bool reverse) {
216 +  DCHECK(source == web_contents_.get());
217 +  WebContentsView* content_view = web_contents_->GetView();
218 +  Evas_Object* view_box =
219 +      static_cast<WebContentsViewEfl*>(content_view)->ViewContainerBox();
220 +  elm_object_focus_next(view_box,
221 +                        reverse ? ELM_FOCUS_PREVIOUS : ELM_FOCUS_NEXT);
222 +  return true;
223 +}
224 +
225  }  // namespace content
226 diff --git a/content/shell/shell_web_contents_view_delegate.h b/content/shell/shell_web_contents_view_delegate.h
227 index 283f37f..8352438 100644
228 --- a/content/shell/shell_web_contents_view_delegate.h
229 +++ b/content/shell/shell_web_contents_view_delegate.h
230 @@ -26,6 +26,7 @@ class ShellWebContentsViewDelegate : public WebContentsViewDelegate {
231    virtual void ShowContextMenu(const ContextMenuParams& params,
232                                 ContextMenuSourceType type) OVERRIDE;
233    virtual WebDragDestDelegate* GetDragDestDelegate() OVERRIDE;
234 +  virtual void Focus() OVERRIDE;
235  
236  #if defined(TOOLKIT_GTK)
237    virtual void Initialize(GtkWidget* expanded_container,
238 diff --git a/content/shell/shell_web_contents_view_delegate_efl.cc b/content/shell/shell_web_contents_view_delegate_efl.cc
239 index 18498f3..60aaa16 100644
240 --- a/content/shell/shell_web_contents_view_delegate_efl.cc
241 +++ b/content/shell/shell_web_contents_view_delegate_efl.cc
242 @@ -4,7 +4,9 @@
243  
244  #include "content/shell/shell_web_contents_view_delegate.h"
245  
246 +#include <Elementary.h>
247  #include "base/command_line.h"
248 +#include "content/browser/web_contents/web_contents_view_efl.h"
249  #include "content/public/browser/render_process_host.h"
250  #include "content/public/browser/render_view_host.h"
251  #include "content/public/browser/render_widget_host_view.h"
252 @@ -48,4 +50,11 @@ WebDragDestDelegate* ShellWebContentsViewDelegate::GetDragDestDelegate() {
253    return NULL;
254  }
255  
256 +void ShellWebContentsViewDelegate::Focus() {
257 +  WebContentsView* content_view = web_contents_->GetView();
258 +  Evas_Object* view_box =
259 +      static_cast<WebContentsViewEfl*>(content_view)->ViewContainerBox();
260 +  elm_object_focus_set(view_box, EINA_TRUE);
261 +}
262 +
263  }  // namespace content
264 diff --git a/efl_webview/efl_webview.gyp b/efl_webview/efl_webview.gyp
265 index f6b959f..f49badd 100644
266 --- a/efl_webview/efl_webview.gyp
267 +++ b/efl_webview/efl_webview.gyp
268 @@ -61,6 +61,10 @@
269          'lib/message_pump_xwalk.h',
270          'lib/process_main.cc',
271          'lib/process_main.h',
272 +        'lib/web_contents_delegate_xwalk.cc',
273 +        'lib/web_contents_delegate_xwalk.h',
274 +        'lib/web_contents_view_delegate_xwalk.cc',
275 +        'lib/web_contents_view_delegate_xwalk.h',
276          'lib/web_runtime_context.cc',
277          'lib/web_runtime_context.h',
278          'lib/webview.cc',
279 diff --git a/efl_webview/examples/main.cc b/efl_webview/examples/main.cc
280 index f69ad43..a41c986 100644
281 --- a/efl_webview/examples/main.cc
282 +++ b/efl_webview/examples/main.cc
283 @@ -41,6 +41,8 @@ static void window_create()
284    /* Create window */
285    Evas_Object* elm_window = elm_win_util_standard_add("efl-webview-window", APP_NAME);
286    elm_win_autodel_set(elm_window, EINA_TRUE);
287 +  elm_object_focus_allow_set(elm_window, EINA_TRUE);
288 +  elm_win_focus_highlight_enabled_set(elm_window, EINA_TRUE);
289  
290    /* Create vertical layout */
291    Evas_Object* vertical_layout = elm_box_add(elm_window);
292 @@ -87,7 +89,7 @@ static void window_create()
293    evas_object_size_hint_weight_set(webview, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
294    evas_object_size_hint_align_set(webview, EVAS_HINT_FILL, EVAS_HINT_FILL);
295    elm_box_pack_end(vertical_layout, webview);
296 -  evas_object_focus_set(webview, EINA_TRUE);
297 +  elm_object_focus_set(webview, EINA_TRUE);
298    evas_object_show(webview);
299  
300    evas_object_smart_callback_add(back_button, "clicked",
301 diff --git a/efl_webview/lib/content_browser_client_xwalk.cc b/efl_webview/lib/content_browser_client_xwalk.cc
302 index b640320..cc2269e 100644
303 --- a/efl_webview/lib/content_browser_client_xwalk.cc
304 +++ b/efl_webview/lib/content_browser_client_xwalk.cc
305 @@ -5,8 +5,10 @@
306  #include "efl_webview/lib/content_browser_client_xwalk.h"
307  
308  #include "content/public/browser/browser_main_parts.h"
309 +#include "content/public/browser/web_contents.h"
310  #include "content/public/common/main_function_params.h"
311  #include "efl_webview/lib/browser_context_xwalk.h"
312 +#include "efl_webview/lib/web_contents_view_delegate_xwalk.h"
313  #include "efl_webview/lib/web_runtime_context.h"
314  
315  namespace xwalk {
316 @@ -59,4 +61,10 @@ net::URLRequestContextGetter* ContentBrowserClientXWalk::CreateRequestContext(
317        CreateRequestContext(protocol_handlers);
318  }
319  
320 +content::WebContentsViewDelegate*
321 +    ContentBrowserClientXWalk::GetWebContentsViewDelegate(
322 +    content::WebContents* web_contents) {
323 +  return new WebContentsViewDelegateXWalk(web_contents);
324 +}
325 +
326  } // namespace xwalk
327 diff --git a/efl_webview/lib/content_browser_client_xwalk.h b/efl_webview/lib/content_browser_client_xwalk.h
328 index c5c235d..a8ff6ae 100644
329 --- a/efl_webview/lib/content_browser_client_xwalk.h
330 +++ b/efl_webview/lib/content_browser_client_xwalk.h
331 @@ -19,6 +19,8 @@ class ContentBrowserClientXWalk : public content::ContentBrowserClient {
332    virtual net::URLRequestContextGetter* CreateRequestContext(
333        content::BrowserContext* browser_context,
334        content::ProtocolHandlerMap* protocol_handlers) OVERRIDE;
335 +  virtual content::WebContentsViewDelegate* GetWebContentsViewDelegate(
336 +      content::WebContents* web_contents) OVERRIDE;
337  
338   private:
339    DISALLOW_COPY_AND_ASSIGN(ContentBrowserClientXWalk);
340 diff --git a/efl_webview/lib/web_contents_delegate_xwalk.cc b/efl_webview/lib/web_contents_delegate_xwalk.cc
341 new file mode 100644
342 index 0000000..a6cb3a3
343 --- /dev/null
344 +++ b/efl_webview/lib/web_contents_delegate_xwalk.cc
345 @@ -0,0 +1,36 @@
346 +// Copyright (c) 2013 Intel Corporation. All rights reserved.
347 +// Use of this source code is governed by a BSD-style license that can be
348 +// found in the LICENSE file.
349 +
350 +#include "efl_webview/lib/web_contents_delegate_xwalk.h"
351 +
352 +#include <Elementary.h>
353 +#include "content/public/browser/web_contents.h"
354 +#include "efl_webview/lib/web_contents_view_delegate_xwalk.h"
355 +
356 +namespace xwalk {
357 +
358 +namespace {
359 +const int g_window_width = 800;
360 +const int g_window_height = 600;
361 +} // namespace
362 +
363 +WebContentsDelegateXWalk::WebContentsDelegateXWalk(
364 +    content::BrowserContext* browser_context, Evas_Object* view_box)
365 +    : view_box_(view_box)
366 +{
367 +  content::WebContents::CreateParams create_params(browser_context, 0);
368 +  create_params.initial_size = gfx::Size(g_window_width, g_window_height);
369 +
370 +  web_contents_.reset(content::WebContents::Create(create_params));
371 +  web_contents_->SetDelegate(this);
372 +}
373 +
374 +bool WebContentsDelegateXWalk::TakeFocus(
375 +    content::WebContents* source, bool reverse) {
376 +  elm_object_focus_next(view_box_,
377 +                        reverse ? ELM_FOCUS_PREVIOUS : ELM_FOCUS_NEXT);
378 +  return true;
379 +}
380 +
381 +}  // namespace xwalk
382 diff --git a/efl_webview/lib/web_contents_delegate_xwalk.h b/efl_webview/lib/web_contents_delegate_xwalk.h
383 new file mode 100644
384 index 0000000..182d2e8
385 --- /dev/null
386 +++ b/efl_webview/lib/web_contents_delegate_xwalk.h
387 @@ -0,0 +1,35 @@
388 +// Copyright (c) 2013 Intel Corporation. All rights reserved.
389 +// Use of this source code is governed by a BSD-style license that can be
390 +// found in the LICENSE file.
391 +
392 +#ifndef EFL_WEBVIEW_LIB_WEB_CONTENTS_DELEGATE_XWALK_H_
393 +#define EFL_WEBVIEW_LIB_WEB_CONTENTS_DELEGATE_XWALK_H_
394 +
395 +#include <Evas.h>
396 +
397 +#include "base/memory/scoped_ptr.h"
398 +#include "content/public/browser/web_contents_delegate.h"
399 +
400 +namespace content {
401 +class WebContentsViewDelegate;
402 +}
403 +
404 +namespace xwalk {
405 +
406 +class WebContentsDelegateXWalk : public content::WebContentsDelegate
407 +{
408 + public:
409 +  WebContentsDelegateXWalk(content::BrowserContext*, Evas_Object*);
410 +  virtual bool TakeFocus(content::WebContents* source,
411 +                         bool reverse) OVERRIDE;
412 +
413 +  content::WebContents* WebContents() { return web_contents_.get(); }
414 +
415 + private:
416 +  Evas_Object* view_box_;
417 +  scoped_ptr<content::WebContents> web_contents_;
418 +};
419 +
420 +} // namespace xwalk
421 +
422 +#endif // EFL_WEBVIEW_LIB_WEB_CONTENTS_DELEGATE_XWALK_H_
423 diff --git a/efl_webview/lib/web_contents_view_delegate_xwalk.cc b/efl_webview/lib/web_contents_view_delegate_xwalk.cc
424 new file mode 100644
425 index 0000000..40b59f7
426 --- /dev/null
427 +++ b/efl_webview/lib/web_contents_view_delegate_xwalk.cc
428 @@ -0,0 +1,40 @@
429 +// Copyright (c) 2013 Intel Corporation. All rights reserved.
430 +// Use of this source code is governed by a BSD-style license that can be
431 +// found in the LICENSE file.
432 +
433 +#include "efl_webview/lib/web_contents_view_delegate_xwalk.h"
434 +
435 +#include <Elementary.h>
436 +
437 +namespace xwalk {
438 +
439 +WebContentsViewDelegateXWalk::WebContentsViewDelegateXWalk(
440 +    content::WebContents* web_contents)
441 +    : web_contents_(web_contents)
442 +    , view_box_(NULL) {
443 +}
444 +
445 +WebContentsViewDelegateXWalk::~WebContentsViewDelegateXWalk() {
446 +}
447 +
448 +void WebContentsViewDelegateXWalk::Focus() {
449 +  if (!view_box_)
450 +    return;
451 +  elm_object_focus_set(view_box_, EINA_TRUE);
452 +}
453 +
454 +void WebContentsViewDelegateXWalk::ShowContextMenu(
455 +    const content::ContextMenuParams& params,
456 +    content::ContextMenuSourceType type) {
457 +}
458 +
459 +content::WebDragDestDelegate*
460 +    WebContentsViewDelegateXWalk::GetDragDestDelegate() {
461 +  return NULL;
462 +}
463 +
464 +void WebContentsViewDelegateXWalk::SetViewContainerBox(Evas_Object* view_box) {
465 +  view_box_ = view_box;
466 +}
467 +
468 +}  // namespace xwalk
469 diff --git a/efl_webview/lib/web_contents_view_delegate_xwalk.h b/efl_webview/lib/web_contents_view_delegate_xwalk.h
470 new file mode 100644
471 index 0000000..d5df813
472 --- /dev/null
473 +++ b/efl_webview/lib/web_contents_view_delegate_xwalk.h
474 @@ -0,0 +1,40 @@
475 +// Copyright (c) 2013 Intel Corporation. All rights reserved.
476 +// Use of this source code is governed by a BSD-style license that can be
477 +// found in the LICENSE file.
478 +
479 +#ifndef EFL_WEBVIEW_LIB_WEB_CONTENTS_VIEW_DELEGATE_XWALK_H_
480 +#define EFL_WEBVIEW_LIB_WEB_CONTENTS_VIEW_DELEGATE_XWALK_H_
481 +
482 +#include "base/compiler_specific.h"
483 +#include "content/public/browser/web_contents_view_delegate.h"
484 +
485 +namespace content {
486 +class WebContents;
487 +}
488 +
489 +namespace xwalk {
490 +
491 +class WebContentsViewDelegateXWalk : public content::WebContentsViewDelegate {
492 + public:
493 +  explicit WebContentsViewDelegateXWalk(content::WebContents*);
494 +  virtual ~WebContentsViewDelegateXWalk();
495 +
496 +  // Overridden from WebContentsViewDelegate:
497 +  virtual void ShowContextMenu(
498 +      const content::ContextMenuParams& params,
499 +      content::ContextMenuSourceType type) OVERRIDE;
500 +  virtual content::WebDragDestDelegate* GetDragDestDelegate() OVERRIDE;
501 +  virtual void Focus() OVERRIDE;
502 +
503 +  void SetViewContainerBox(Evas_Object*);
504 +
505 + private:
506 +  content::WebContents* web_contents_;
507 +  Evas_Object* view_box_;
508 +
509 +  DISALLOW_COPY_AND_ASSIGN(WebContentsViewDelegateXWalk);
510 +};
511 +
512 +} // namespace xwalk
513 +
514 +#endif // EFL_WEBVIEW_LIB_WEB_CONTENTS_VIEW_DELEGATE_XWALK_H_
515 diff --git a/efl_webview/lib/webview.cc b/efl_webview/lib/webview.cc
516 index 33b00de..061d30c 100644
517 --- a/efl_webview/lib/webview.cc
518 +++ b/efl_webview/lib/webview.cc
519 @@ -10,38 +10,13 @@
520  #include "base/files/file_path.h"
521  #include "content/browser/web_contents/web_contents_view_efl.h"
522  #include "content/public/browser/web_contents.h"
523 -#include "content/public/browser/web_contents_delegate.h"
524 +#include "efl_webview/lib/web_contents_delegate_xwalk.h"
525 +#include "efl_webview/lib/web_contents_view_delegate_xwalk.h"
526  #include "efl_webview/lib/web_runtime_context.h"
527  #include "net/base/net_util.h"
528  
529  namespace xwalk {
530  
531 -namespace {
532 -const int g_window_width = 800;
533 -const int g_window_height = 600;
534 -
535 -class WebContentsDelegateXWalk : public content::WebContentsDelegate
536 -{
537 - public:
538 -  explicit WebContentsDelegateXWalk(content::BrowserContext*);
539 -  content::WebContents* WebContents() { return web_contents_.get(); }
540 -
541 - private:
542 -  scoped_ptr<content::WebContents> web_contents_;
543 -};
544 -
545 -WebContentsDelegateXWalk::WebContentsDelegateXWalk(
546 -    content::BrowserContext* browser_context)
547 -{
548 -  content::WebContents::CreateParams create_params(browser_context, 0);
549 -  create_params.initial_size = gfx::Size(g_window_width, g_window_height);
550 -
551 -  web_contents_.reset(content::WebContents::Create(create_params));
552 -  web_contents_->SetDelegate(this);
553 -}
554 -
555 -} // namespace
556 -
557  struct WebView::Private {
558    Evas_Object* root_window;
559    Evas_Object* view_box;
560 @@ -82,16 +57,21 @@ WebView::WebView(Evas_Object* root_window)
561    }
562  
563    private_->root_window = root_window;
564 +  private_->view_box = elm_box_add(private_->root_window);
565 +  elm_object_focus_allow_set(private_->view_box, EINA_TRUE);
566 +
567    private_->context = WebRuntimeContext::current();
568    content::BrowserContext* browser_context =
569        private_->context->BrowserContext();
570    private_->webContentsDelegate.reset(
571 -      new WebContentsDelegateXWalk(browser_context));
572 -
573 -  private_->view_box = elm_box_add(private_->root_window);
574 -  content::WebContentsView* content_view =
575 -      private_->webContentsDelegate->WebContents()->GetView();
576 -  static_cast<content::WebContentsViewEfl*>(content_view)->
577 +      new WebContentsDelegateXWalk(browser_context, private_->view_box));
578 +
579 +  content::WebContentsViewEfl* content_view =
580 +      static_cast<content::WebContentsViewEfl*>(private_->
581 +          webContentsDelegate->WebContents()->GetView());
582 +  // FIXME: Don't pass elm_box to WebContentsViewEfl. Need focus handling of PreserveWindow evas object here.
583 +  content_view->SetViewContainerBox(private_->view_box);
584 +  static_cast<WebContentsViewDelegateXWalk*>(content_view->delegate())->
585        SetViewContainerBox(private_->view_box);
586  
587    LoadURL(WebView::Private::s_startup_url);
588 -- 
589 1.8.1.2
590