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.
5 #include "content/shell/browser/shell.h"
8 #include <Ecore_Evas.h>
9 #include <Elementary.h>
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"
27 Impl(Shell* shell, Evas_Object* window)
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);
41 #if !defined(EWK_BRINGUP)
42 // [M47_2526] Temporary disabling the codes for switching to new chromium
44 if (!base::CommandLine::ForCurrentProcess()->
45 HasSwitch(switches::kDumpRenderTree))
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);
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);
63 Evas_Object *button_box = elm_box_add(wrapper);
64 elm_box_horizontal_set(button_box, EINA_TRUE);
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);
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");
79 (void)new_window_button;
82 evas_object_show(button_box);
83 elm_box_pack_start(wrapper, button_box);
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_);
97 elm_box_pack_end(box, wrapper);
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);
112 void SetAddressBarURL(const char* url) {
114 elm_object_text_set(url_bar_, url);
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);
128 static void OnBack(void* data, Evas_Object*, void*) {
129 static_cast<Shell::Impl*>(data)->shell_->GoBackOrForward(-1);
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"),
141 static void OnForward(void* data, Evas_Object*, void*) {
142 static_cast<Shell::Impl*>(data)->shell_->GoBackOrForward(1);
145 static void OnRefresh(void* data, Evas_Object*, void*) {
146 static_cast<Shell::Impl*>(data)->shell_->Reload();
149 static void OnStop(void* data, Evas_Object*, void*) {
150 static_cast<Shell::Impl*>(data)->shell_->Stop();
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());
159 static_cast<Shell::Impl*>(data)->shell_->LoadURL(url);
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_;
172 void OnShellWindowDelRequest(void* data, Evas_Object*, void*) {
173 Shell* shell = static_cast<Shell*>(data);
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";
184 void Shell::PlatformExit() {
185 LOG(INFO) << "EFL Shell platform exit";
188 void Shell::PlatformCleanUp() {
191 void Shell::PlatformEnableUIControl(UIControl control, bool is_enabled) {
192 impl_->ToggleControl(control, is_enabled);
195 void Shell::PlatformSetAddressBarURL(const GURL& url) {
196 impl_->SetAddressBarURL(url.spec().c_str());
199 void Shell::PlatformSetIsLoading(bool loading) {
202 void Shell::PlatformCreateWindow(int width, int height) {
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);
213 impl_ = new Impl(this, static_cast<Evas_Object*>(window_));
216 void Shell::PlatformResizeSubViews() {
219 void Shell::Close() {
220 LOG(INFO) << "Closing Content Shell EFL";
225 void Shell::PlatformSetTitle(const base::string16& title) {
226 elm_win_title_set(static_cast<Evas_Object*>(window_), UTF16ToUTF8(title).c_str());
229 bool Shell::PlatformHandleContextMenu(
230 const content::ContextMenuParams& params) {
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
240 if (command_line.HasSwitch(switches::kDumpRenderTree)) {
241 dialog_manager_.reset(new LayoutTestJavaScriptDialogManager);
243 dialog_manager_.reset(new JavaScriptDialogManagerEfl);
247 return dialog_manager_.get();
250 } // namespace content