Upstream version 6.34.113.0
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / renderer / xwalk_content_renderer_client.cc
1 // Copyright (c) 2013 Intel Corporation. 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 "xwalk/runtime/renderer/xwalk_content_renderer_client.h"
6
7 #include "base/strings/utf_string_conversions.h"
8 #include "components/visitedlink/renderer/visitedlink_slave.h"
9 #include "content/public/renderer/render_thread.h"
10 #include "grit/xwalk_application_resources.h"
11 #include "grit/xwalk_sysapps_resources.h"
12 #include "third_party/WebKit/public/platform/WebString.h"
13 #include "third_party/WebKit/public/web/WebDocument.h"
14 #include "third_party/WebKit/public/web/WebSecurityPolicy.h"
15 #include "xwalk/application/common/constants.h"
16 #include "xwalk/application/renderer/application_native_module.h"
17 #include "xwalk/extensions/renderer/xwalk_js_module.h"
18
19 #if defined(OS_ANDROID)
20 #include "xwalk/runtime/renderer/android/xwalk_permission_client.h"
21 #include "xwalk/runtime/renderer/android/xwalk_render_process_observer.h"
22 #include "xwalk/runtime/renderer/android/xwalk_render_view_ext.h"
23 #else
24 #include "third_party/WebKit/public/web/WebFrame.h"
25 #endif
26
27 #if defined(OS_TIZEN_MOBILE)
28 #include "xwalk/runtime/renderer/tizen/xwalk_content_renderer_client_tizen.h"
29 #endif
30
31 namespace xwalk {
32
33 namespace {
34 XWalkContentRendererClient* g_renderer_client;
35 }
36
37 XWalkContentRendererClient* XWalkContentRendererClient::Get() {
38   return g_renderer_client;
39 }
40
41 XWalkContentRendererClient::XWalkContentRendererClient() {
42   DCHECK(!g_renderer_client);
43   g_renderer_client = this;
44 }
45
46 XWalkContentRendererClient::~XWalkContentRendererClient() {
47   g_renderer_client = NULL;
48 }
49
50 void XWalkContentRendererClient::RenderThreadStarted() {
51   extension_controller_.reset(
52       new extensions::XWalkExtensionRendererController(this));
53
54   blink::WebString application_scheme(
55       base::ASCIIToUTF16(application::kApplicationScheme));
56   blink::WebSecurityPolicy::registerURLSchemeAsSecure(application_scheme);
57   blink::WebSecurityPolicy::registerURLSchemeAsCORSEnabled(application_scheme);
58
59   content::RenderThread* thread = content::RenderThread::Get();
60   xwalk_render_process_observer_.reset(new XWalkRenderProcessObserver);
61   thread->AddObserver(xwalk_render_process_observer_.get());
62 #if defined(OS_ANDROID)
63   visited_link_slave_.reset(new visitedlink::VisitedLinkSlave);
64   thread->AddObserver(visited_link_slave_.get());
65 #endif
66 }
67
68 void XWalkContentRendererClient::RenderFrameCreated(
69     content::RenderFrame* render_frame) {
70 #if defined(OS_ANDROID)
71   new XWalkPermissionClient(render_frame);
72 #endif
73 }
74
75 void XWalkContentRendererClient::RenderViewCreated(
76     content::RenderView* render_view) {
77 #if defined(OS_ANDROID)
78   XWalkRenderViewExt::RenderViewCreated(render_view);
79 #endif
80 }
81
82 void XWalkContentRendererClient::DidCreateScriptContext(
83     blink::WebFrame* frame, v8::Handle<v8::Context> context,
84     int extension_group, int world_id) {
85   extension_controller_->DidCreateScriptContext(frame, context);
86 #if !defined(OS_ANDROID)
87   xwalk_render_process_observer_->DidCreateScriptContext(
88       frame, context, extension_group, world_id);
89 #endif
90 }
91
92 void XWalkContentRendererClient::WillReleaseScriptContext(
93     blink::WebFrame* frame, v8::Handle<v8::Context> context, int world_id) {
94   extension_controller_->WillReleaseScriptContext(frame, context);
95 }
96
97 void XWalkContentRendererClient::DidCreateModuleSystem(
98     extensions::XWalkModuleSystem* module_system) {
99   scoped_ptr<extensions::XWalkNativeModule> app_module(
100       new application::ApplicationNativeModule());
101   module_system->RegisterNativeModule("application", app_module.Pass());
102   module_system->RegisterNativeModule("sysapps_common",
103       extensions::CreateJSModuleFromResource(IDR_XWALK_SYSAPPS_COMMON_API));
104   module_system->RegisterNativeModule("sysapps_promise",
105       extensions::CreateJSModuleFromResource(
106           IDR_XWALK_SYSAPPS_COMMON_PROMISE_API));
107   module_system->RegisterNativeModule("widget_common",
108       extensions::CreateJSModuleFromResource(
109           IDR_XWALK_APPLICATION_WIDGET_COMMON_API));
110 }
111
112 #if defined(OS_ANDROID)
113 unsigned long long XWalkContentRendererClient::VisitedLinkHash(
114     const char* canonical_url, size_t length) {
115   return visited_link_slave_->ComputeURLFingerprint(canonical_url, length);
116 }
117
118 bool XWalkContentRendererClient::IsLinkVisited(unsigned long long link_hash) {
119   return visited_link_slave_->IsVisited(link_hash);
120 }
121 #endif
122
123 bool XWalkContentRendererClient::WillSendRequest(blink::WebFrame* frame,
124                      content::PageTransition transition_type,
125                      const GURL& url,
126                      const GURL& first_party_for_cookies,
127                      GURL* new_url) {
128 #if defined(OS_ANDROID)
129   return false;
130 #else
131   if (!xwalk_render_process_observer_->IsWarpMode())
132     return false;
133   GURL origin_url(frame->document().url());
134   if (origin_url.spec().empty() ||
135      frame->document().securityOrigin().canRequest(url)) {
136     LOG(INFO) << "[PASS] " << origin_url.spec() << " request " << url.spec();
137     return false;
138   }
139
140   LOG(INFO) << "[BLOCK] " << origin_url.spec() << " request " << url.spec();
141   *new_url = GURL();
142   return true;
143 #endif
144 }
145 }  // namespace xwalk