[M47_2526] Chromium upversion to m47_2526 branch
[platform/framework/web/chromium-efl.git] / tizen_src / chromium_impl / content / shell / browser / shell_efl.cc
1 // Copyright 2014 Samsung Electronics. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/shell/browser/shell.h"
6
7 #include <Evas.h>
8 #include <Ecore_Evas.h>
9 #include <Elementary.h>
10
11 #include "base/command_line.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "content/public/browser/web_contents.h"
14 #include "content/public/common/content_switches.h"
15 #include "content/public/browser/render_view_host.h"
16 #include "content/shell/common/shell_switches.h"
17 #include "content/shell/browser/layout_test/layout_test_javascript_dialog_manager.h"
18 #include "components/js_dialogs_efl/javascript_dialog_manager_efl.h"
19 #include "efl/window_factory.h"
20 #include "ui/gl/gl_switches.h"
21 #include "cc/base/switches.h"
22
23 namespace content {
24
25 class Shell::Impl {
26  public:
27   Impl(Shell* shell, Evas_Object* window)
28       : url_bar_(NULL)
29       , refresh_btn_(NULL)
30       , stop_btn_(NULL)
31       , back_btn_(NULL)
32       , forward_btn_(NULL)
33       , shell_(shell) {
34
35     Evas_Object *box = elm_box_add(window);
36     evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
37     evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
38     elm_win_resize_object_add(window, box);
39     evas_object_show(box);
40
41 #if !defined(EWK_BRINGUP)
42 // [M47_2526] Temporary disabling the codes for switching to new chromium
43 //            FIXME:
44     if (!base::CommandLine::ForCurrentProcess()->
45             HasSwitch(switches::kDumpRenderTree))
46       CreateURLBar(box);
47 #endif
48
49     Evas_Object* view = static_cast<Evas_Object*>(
50         shell->web_contents()->GetNativeView());
51     evas_object_size_hint_align_set(view, EVAS_HINT_FILL, EVAS_HINT_FILL);
52     evas_object_size_hint_weight_set(view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
53     elm_box_pack_end(box, view);
54   }
55
56   void CreateURLBar(Evas_Object* box) {
57     Evas_Object* wrapper = elm_box_add(box);
58     elm_box_horizontal_set(wrapper, EINA_TRUE);
59     evas_object_size_hint_align_set(wrapper, EVAS_HINT_FILL, EVAS_HINT_FILL);
60     evas_object_size_hint_weight_set(wrapper, EVAS_HINT_EXPAND, 0.0f);
61     evas_object_show(wrapper);
62
63     Evas_Object *button_box = elm_box_add(wrapper);
64     elm_box_horizontal_set(button_box, EINA_TRUE);
65
66     Evas_Object* new_window_button = AddButton(button_box, "file", OnNewWindow);
67     back_btn_ = AddButton(button_box, "arrow_left", OnBack);
68     forward_btn_ = AddButton(button_box, "arrow_right", OnForward);
69     refresh_btn_ = AddButton(button_box, "refresh", OnRefresh);
70     stop_btn_ = AddButton(button_box, "close", OnStop);
71
72 #if !defined(OS_TIZEN)
73     elm_object_text_set(new_window_button, "New Window");
74     elm_object_text_set(back_btn_, "Back");
75     elm_object_text_set(forward_btn_, "Forward");
76     elm_object_text_set(refresh_btn_, "Refresh");
77     elm_object_text_set(stop_btn_, "Stop");
78 #else
79     (void)new_window_button;
80 #endif
81
82     evas_object_show(button_box);
83     elm_box_pack_start(wrapper, button_box);
84
85     url_bar_ = elm_entry_add(wrapper);
86     elm_entry_single_line_set(url_bar_, EINA_TRUE);
87     elm_entry_scrollable_set(url_bar_, EINA_TRUE);
88     evas_object_size_hint_align_set(url_bar_, EVAS_HINT_FILL, EVAS_HINT_FILL);
89     evas_object_size_hint_weight_set(url_bar_, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
90     elm_entry_input_panel_layout_set(url_bar_, ELM_INPUT_PANEL_LAYOUT_URL);
91     evas_object_size_hint_weight_set(url_bar_, EVAS_HINT_EXPAND, 0.0f);
92     evas_object_size_hint_align_set(url_bar_, EVAS_HINT_FILL, EVAS_HINT_FILL);
93     evas_object_smart_callback_add(url_bar_, "activated", OnURLEntered, this);
94     elm_box_pack_end(wrapper, url_bar_);
95     evas_object_show(url_bar_);
96
97     elm_box_pack_end(box, wrapper);
98   }
99
100   Evas_Object* AddButton(Evas_Object* parent_box,
101       const char* icon_name, Evas_Smart_Cb cb) {
102     Evas_Object* btn = elm_button_add(parent_box);
103     Evas_Object* icon = elm_icon_add(parent_box);
104     elm_icon_standard_set(icon, icon_name);
105     elm_object_part_content_set(btn, "icon", icon);
106     evas_object_smart_callback_add(btn, "clicked", cb, this);
107     elm_box_pack_end(parent_box, btn);
108     evas_object_show(btn);
109     return btn;
110   }
111
112   void SetAddressBarURL(const char* url) {
113     if (url_bar_)
114       elm_object_text_set(url_bar_, url);
115   }
116
117   void ToggleControl(UIControl control, bool is_enabled) {
118     if (control == BACK_BUTTON && back_btn_) {
119       elm_object_disabled_set(back_btn_, !is_enabled);
120     } else if (control == FORWARD_BUTTON && forward_btn_) {
121       elm_object_disabled_set(forward_btn_, !is_enabled);
122     } else if (control == STOP_BUTTON && stop_btn_) {
123       elm_object_disabled_set(stop_btn_, !is_enabled);
124     }
125   }
126
127  private:
128   static void OnBack(void* data, Evas_Object*, void*) {
129     static_cast<Shell::Impl*>(data)->shell_->GoBackOrForward(-1);
130   }
131
132   static void OnNewWindow(void* data, Evas_Object*, void*) {
133     Shell* shell = static_cast<Shell::Impl*>(data)->shell_;
134     gfx::Size initial_size = Shell::GetShellDefaultSize();
135     Shell::CreateNewWindow(shell->web_contents()->GetBrowserContext(),
136                            GURL("https://www.google.com"),
137                            NULL,
138                            initial_size);
139   }
140
141   static void OnForward(void* data, Evas_Object*, void*) {
142     static_cast<Shell::Impl*>(data)->shell_->GoBackOrForward(1);
143   }
144
145   static void OnRefresh(void* data, Evas_Object*, void*) {
146     static_cast<Shell::Impl*>(data)->shell_->Reload();
147   }
148
149   static void OnStop(void* data, Evas_Object*, void*) {
150     static_cast<Shell::Impl*>(data)->shell_->Stop();
151   }
152
153   static void OnURLEntered(void *data, Evas_Object *obj, void*) {
154     GURL url(elm_object_text_get(obj));
155     if (!url.has_scheme()) {
156       url = GURL(std::string("http://") + elm_object_text_get(obj));
157       elm_object_text_set(obj, url.spec().c_str());
158     }
159     static_cast<Shell::Impl*>(data)->shell_->LoadURL(url);
160   }
161
162   Evas_Object* url_bar_;
163   Evas_Object* refresh_btn_;
164   Evas_Object* stop_btn_;
165   Evas_Object* back_btn_;
166   Evas_Object* forward_btn_;
167
168   Shell* shell_;
169 };
170
171 namespace {
172 void OnShellWindowDelRequest(void* data, Evas_Object*, void*) {
173   Shell* shell = static_cast<Shell*>(data);
174   shell->Close();
175 }
176 }
177
178 // static
179 void Shell::PlatformInitialize(const gfx::Size& default_window_size) {
180   elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
181   LOG(INFO) << "EFL Shell platform initialized";
182 }
183
184 void Shell::PlatformExit() {
185   LOG(INFO) << "EFL Shell platform exit";
186 }
187
188 void Shell::PlatformCleanUp() {
189 }
190
191 void Shell::PlatformEnableUIControl(UIControl control, bool is_enabled) {
192   impl_->ToggleControl(control, is_enabled);
193 }
194
195 void Shell::PlatformSetAddressBarURL(const GURL& url) {
196   impl_->SetAddressBarURL(url.spec().c_str());
197 }
198
199 void Shell::PlatformSetIsLoading(bool loading) {
200 }
201
202 void Shell::PlatformCreateWindow(int width, int height) {
203 }
204
205 void Shell::PlatformSetContents() {
206   Evas_Object* win = efl::WindowFactory::GetHostWindow(web_contents_.get());
207   evas_object_smart_callback_add(win, "delete,request",
208       OnShellWindowDelRequest, this);
209   gfx::Size initial_size = Shell::GetShellDefaultSize();
210   evas_object_resize(win, initial_size.width(), initial_size.height());
211   evas_object_show(win);
212   window_ = win;
213   impl_ = new Impl(this, static_cast<Evas_Object*>(window_));
214 }
215
216 void Shell::PlatformResizeSubViews() {
217 }
218
219 void Shell::Close() {
220   LOG(INFO) << "Closing Content Shell EFL";
221   delete impl_;
222   delete this;
223 }
224
225 void Shell::PlatformSetTitle(const base::string16& title) {
226   elm_win_title_set(static_cast<Evas_Object*>(window_), UTF16ToUTF8(title).c_str());
227 }
228
229 bool Shell::PlatformHandleContextMenu(
230     const content::ContextMenuParams& params) {
231   return false;
232 }
233
234 JavaScriptDialogManager* Shell::GetJavaScriptDialogManager(WebContents* source) {
235   if (!dialog_manager_) {
236     const base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess();
237 #if !defined(EWK_BRINGUP)
238 // [M47_2526] Temporary disabling the codes for switching to new chromium
239 //            FIXME:
240     if (command_line.HasSwitch(switches::kDumpRenderTree)) {
241       dialog_manager_.reset(new LayoutTestJavaScriptDialogManager);
242     } else  {
243       dialog_manager_.reset(new JavaScriptDialogManagerEfl);
244     }
245 #endif
246   }
247   return dialog_manager_.get();
248 }
249
250 }  // namespace content