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.
8 #include <vconf/vconf.h>
11 #include "base/command_line.h"
12 #include "base/path_service.h"
13 #include "base/strings/string_number_conversions.h"
14 #include "common/content_switches_efl.h"
15 #include "common/render_messages_ewk.h"
16 #include "content/common/paths_efl.h"
17 #include "content/public/renderer/render_thread.h"
18 #include "content/public/renderer/render_view.h"
19 #include "content/renderer/render_view_impl.h"
20 #include "content/child/request_extra_data.h"
21 #include "renderer/editorclient_agent.h"
22 #include "renderer/plugins/plugin_placeholder_efl.h"
23 #include "renderer/render_frame_observer_efl.h"
24 #include "renderer/render_view_observer_efl.h"
25 #include "components/visitedlink/renderer/visitedlink_slave.h"
26 #include "content/public/renderer/content_renderer_client.h"
27 #include "third_party/WebKit/public/platform/WebURLError.h"
28 #include "third_party/WebKit/public/platform/WebURLRequest.h"
29 #include "third_party/WebKit/public/web/WebDataSource.h"
30 #include "third_party/WebKit/public/web/WebDocument.h"
31 #include "third_party/WebKit/public/web/WebFrame.h"
32 #include "third_party/WebKit/public/web/WebSettings.h"
33 #include "third_party/WebKit/public/web/WebView.h"
37 #include "content/common/tts_messages_efl.h"
38 #include "content/renderer/tts_dispatcher_efl.h"
41 #if defined(TIZEN_AUTOFILL_SUPPORT)
42 #include "components/autofill/content/renderer/autofill_agent.h"
43 #include "components/autofill/content/renderer/password_autofill_agent.h"
44 #include "components/autofill/content/renderer/password_generation_agent.h"
45 #include "components/autofill/core/common/password_generation_util.h"
48 #include "renderer/content_renderer_client_efl.h"
49 #include "common/navigation_policy_params.h"
50 #include "content/common/wrt/wrt_url_parse.h"
51 #include "wrt/wrtwidget.h"
53 #if defined(TIZEN_AUTOFILL_SUPPORT)
54 using autofill::AutofillAgent;
55 using autofill::PasswordAutofillAgent;
56 using autofill::PasswordGenerationAgent;
59 class WrtUrlParseImpl : public content::WrtUrlParseBase {
61 WrtUrlParseImpl(WrtWidget* wrt_widget) : wrt_widget_(wrt_widget) {}
62 GURL parseUrl(const GURL& old_url) const override {
63 if (!wrt_widget_->IsWidgetInfoSet())
66 wrt_widget_->ParseUrl(old_url, new_url);
71 WrtWidget* wrt_widget_;
74 ContentRendererClientEfl::ContentRendererClientEfl() {
77 ContentRendererClientEfl::~ContentRendererClientEfl() {
80 void ContentRendererClientEfl::RenderThreadStarted()
82 content::RenderThread* thread = content::RenderThread::Get();
84 const base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess();
85 if (command_line.HasSwitch(switches::kInjectedBundlePath)) {
86 wrt_widget_.reset(new WrtWidget);
87 thread->AddObserver(wrt_widget_->GetObserver());
88 wrt_url_parser_.reset(new WrtUrlParseImpl(wrt_widget_.get()));
90 std::string tizen_id = command_line.GetSwitchValueASCII(
92 std::string theme = command_line.GetSwitchValueASCII(
93 switches::kWidgetTheme);
94 std::string encoded_bundle = command_line.GetSwitchValueASCII(
95 switches::kWidgetEncodedBundle);
96 std::string scale = command_line.GetSwitchValueASCII(
97 switches::kWidgetScale);
98 double scale_factor = 0;
99 base::StringToDouble(scale, &scale_factor);
101 wrt_widget_->SetWidgetInfo(tizen_id, scale_factor,
102 theme, encoded_bundle);
105 render_process_observer_.reset(new RenderProcessObserverEfl(this));
106 thread->AddObserver(render_process_observer_.get());
108 visited_link_slave_.reset(new visitedlink::VisitedLinkSlave());
109 thread->AddObserver(visited_link_slave_.get());
112 void ContentRendererClientEfl::RenderFrameCreated(content::RenderFrame* render_frame) {
113 new content::RenderFrameObserverEfl(render_frame);
115 #if defined(TIZEN_AUTOFILL_SUPPORT)
116 PasswordAutofillAgent* password_autofill_agent =
117 new PasswordAutofillAgent(render_frame);
118 PasswordGenerationAgent* password_generation_agent =
119 new PasswordGenerationAgent(render_frame, password_autofill_agent);
120 new AutofillAgent(render_frame,
121 password_autofill_agent,
122 password_generation_agent);
126 void ContentRendererClientEfl::RenderViewCreated(content::RenderView* render_view) {
127 content::RenderViewImpl* rvi = static_cast<content::RenderViewImpl*>(render_view);
128 ApplyCustomSettings(rvi->webview());
130 // Deletes itself when render_view is destroyed.
131 new RenderViewObserverEfl(render_view, this);
132 new editing::EditorClientAgent(render_view);
134 #if !defined(EWK_BRINGUP)
135 render_view->SetWrtUrlParser(wrt_url_parser_.get());
139 bool ContentRendererClientEfl::OverrideCreatePlugin(
140 content::RenderFrame* render_frame,
141 blink::WebLocalFrame* frame,
142 const blink::WebPluginParams& params,
143 blink::WebPlugin** plugin) {
144 PluginPlaceholderEfl* placeholder =
145 PluginPlaceholderEfl::CreateMissingPlugin(render_frame, frame, params);
148 *plugin = placeholder->plugin();
152 bool ContentRendererClientEfl::WillSendRequest(blink::WebFrame* frame,
153 ui::PageTransition transition_type,
155 const GURL& first_party_for_cookies,
158 wrt_widget_->ParseUrl(url, *new_url);
166 void ContentRendererClientEfl::WillReleaseScriptContext(blink::WebFrame* frame,
167 v8::Handle<v8::Context> context,
170 wrt_widget_->StopSession(context);
173 unsigned long long ContentRendererClientEfl::VisitedLinkHash(const char* canonical_url,
175 return visited_link_slave_->ComputeURLFingerprint(canonical_url, length);
178 bool ContentRendererClientEfl::IsLinkVisited(unsigned long long link_hash) {
179 return visited_link_slave_->IsVisited(link_hash);
182 void ContentRendererClientEfl::GetNavigationErrorStrings(
183 content::RenderView* render_view,
184 blink::WebFrame* frame,
185 const blink::WebURLRequest& failed_request,
186 const blink::WebURLError& error,
187 std::string* error_html,
188 base::string16* error_description) {
191 std::string errorHead = std::string(dgettext(
192 "WebKit", "IDS_WEBVIEW_HEADER_THIS_WEBPAGE_IS_NOT_AVAILABLE"));
193 std::string errorMessage = std::string(dgettext(
195 "IDS_WEBVIEW_BODY_THE_SERVER_AT_PS_CANT_BE_FOUND_BECAUSE_THE_DNS_LOOK_UP_FAILED_MSG"));
196 errorMessage = base::StringPrintf(
197 errorMessage.c_str(), error.unreachableURL.string().utf8().c_str());
202 "<meta name='viewport' content='width=device-width,"
203 "initial-scale=1.0, user-scalable=no'>"
204 "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>"
206 *error_html += error.unreachableURL.string().utf8();
209 "<style type=text/css>"
212 " background-color: #fff;"
224 " border: 1px solid #BFA3A3;"
225 " border-radius: 1px;"
226 " word-wrap:break-word"
230 "<body bgcolor=\"#CFCFCF\">"
232 "<h2 align=\"center\">";
233 *error_html += errorHead;
234 *error_html += "</h2></br>";
235 *error_html += errorMessage;
244 blink::WebSpeechSynthesizer* ContentRendererClientEfl::OverrideSpeechSynthesizer(
245 blink::WebSpeechSynthesizerClient* client) {
246 #if defined(OS_TIZEN)
247 return new content::TtsDispatcherEfl(client);
253 void ContentRendererClientEfl::ApplyCustomSettings(blink::WebView* webview) {
254 blink::WebSettings* settings = webview->settings();
255 base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
256 if (cmdline->HasSwitch(switches::kUseMobileViewportStyle))
257 settings->setUseMobileViewportStyle(true);