Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / renderer / xwalk_content_renderer_client.cc
index b084d7e..c52d288 100644 (file)
@@ -4,7 +4,9 @@
 
 #include "xwalk/runtime/renderer/xwalk_content_renderer_client.h"
 
+#include "base/command_line.h"
 #include "base/strings/utf_string_conversions.h"
+#include "components/nacl/renderer/ppb_nacl_private_impl.h"
 #include "components/visitedlink/renderer/visitedlink_slave.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_frame_observer.h"
 #include "grit/xwalk_application_resources.h"
 #include "grit/xwalk_sysapps_resources.h"
 #include "third_party/WebKit/public/platform/WebString.h"
+#include "third_party/WebKit/public/platform/WebURLRequest.h"
 #include "third_party/WebKit/public/web/WebDocument.h"
 #include "third_party/WebKit/public/web/WebSecurityPolicy.h"
 #include "xwalk/application/common/constants.h"
 #include "xwalk/application/renderer/application_native_module.h"
+#include "xwalk/extensions/common/xwalk_extension_switches.h"
 #include "xwalk/extensions/renderer/xwalk_js_module.h"
+#include "xwalk/runtime/common/xwalk_localized_error.h"
+#include "xwalk/runtime/renderer/isolated_file_system.h"
+#include "xwalk/runtime/renderer/pepper/pepper_helper.h"
 
 #if defined(OS_ANDROID)
+#include "xwalk/runtime/browser/android/net/url_constants.h"
 #include "xwalk/runtime/renderer/android/xwalk_permission_client.h"
 #include "xwalk/runtime/renderer/android/xwalk_render_process_observer.h"
 #include "xwalk/runtime/renderer/android/xwalk_render_view_ext.h"
 #else
-#include "third_party/WebKit/public/web/WebFrame.h"
+#include "third_party/WebKit/public/web/WebLocalFrame.h"
 #endif
 
 #if defined(OS_TIZEN)
 #include "xwalk/runtime/renderer/tizen/xwalk_content_renderer_client_tizen.h"
 #endif
 
+#if defined(OS_TIZEN)
+#include "xwalk/runtime/renderer/tizen/xwalk_render_view_ext_tizen.h"
+#endif
+
+#if !defined(DISABLE_NACL)
+#include "components/nacl/renderer/nacl_helper.h"
+#endif
+
 namespace xwalk {
 
 namespace {
@@ -54,12 +70,24 @@ class XWalkFrameHelper
   virtual ~XWalkFrameHelper() {}
 
   // RenderFrameObserver implementation.
-  virtual void WillReleaseScriptContext(v8::Handle<v8::Context> context,
-                                        int world_id) OVERRIDE {
-    extension_controller_->WillReleaseScriptContext(
-        render_frame()->GetWebFrame(), context);
+  void WillReleaseScriptContext(v8::Handle<v8::Context> context,
+                                int world_id) override {
+    if (extension_controller_)
+      extension_controller_->WillReleaseScriptContext(
+          render_frame()->GetWebFrame(), context);
   }
 
+#if defined(OS_TIZEN)
+  void DidCommitProvisionalLoad(bool is_new_navigation) override {
+    blink::WebLocalFrame* frame = render_frame()->GetWebFrame();
+    GURL url(frame->document().url());
+    if (url.SchemeIs(application::kApplicationScheme)) {
+      blink::WebSecurityOrigin origin = frame->document().securityOrigin();
+      origin.grantLoadLocalResources();
+    }
+  }
+#endif
+
  private:
   extensions::XWalkExtensionRendererController* extension_controller_;
 
@@ -82,8 +110,10 @@ XWalkContentRendererClient::~XWalkContentRendererClient() {
 }
 
 void XWalkContentRendererClient::RenderThreadStarted() {
-  extension_controller_.reset(
-      new extensions::XWalkExtensionRendererController(this));
+  CommandLine* cmd_line = CommandLine::ForCurrentProcess();
+  if (!cmd_line->HasSwitch(switches::kXWalkDisableExtensions))
+    extension_controller_.reset(
+        new extensions::XWalkExtensionRendererController(this));
 
   blink::WebString application_scheme(
       base::ASCIIToUTF16(application::kApplicationScheme));
@@ -94,6 +124,10 @@ void XWalkContentRendererClient::RenderThreadStarted() {
   xwalk_render_process_observer_.reset(new XWalkRenderProcessObserver);
   thread->AddObserver(xwalk_render_process_observer_.get());
 #if defined(OS_ANDROID)
+  blink::WebString content_scheme(
+      base::ASCIIToUTF16(xwalk::kContentScheme));
+  blink::WebSecurityPolicy::registerURLSchemeAsLocal(content_scheme);
+
   visited_link_slave_.reset(new visitedlink::VisitedLinkSlave);
   thread->AddObserver(visited_link_slave_.get());
 #endif
@@ -105,23 +139,30 @@ void XWalkContentRendererClient::RenderFrameCreated(
 #if defined(OS_ANDROID)
   new XWalkPermissionClient(render_frame);
 #endif
+
+#if defined(ENABLE_PLUGINS)
+  new PepperHelper(render_frame);
+#endif
+
+#if !defined(DISABLE_NACL)
+  new nacl::NaClHelper(render_frame);
+#endif
 }
 
 void XWalkContentRendererClient::RenderViewCreated(
     content::RenderView* render_view) {
 #if defined(OS_ANDROID)
   XWalkRenderViewExt::RenderViewCreated(render_view);
+#elif defined(OS_TIZEN)
+  XWalkRenderViewExtTizen::RenderViewCreated(render_view);
 #endif
 }
 
 void XWalkContentRendererClient::DidCreateScriptContext(
     blink::WebFrame* frame, v8::Handle<v8::Context> context,
     int extension_group, int world_id) {
-  extension_controller_->DidCreateScriptContext(frame, context);
-#if !defined(OS_ANDROID)
-  xwalk_render_process_observer_->DidCreateScriptContext(
-      frame, context, extension_group, world_id);
-#endif
+  if (extension_controller_)
+    extension_controller_->DidCreateScriptContext(frame, context);
 }
 
 void XWalkContentRendererClient::DidCreateModuleSystem(
@@ -129,6 +170,10 @@ void XWalkContentRendererClient::DidCreateModuleSystem(
   scoped_ptr<extensions::XWalkNativeModule> app_module(
       new application::ApplicationNativeModule());
   module_system->RegisterNativeModule("application", app_module.Pass());
+  scoped_ptr<extensions::XWalkNativeModule> isolated_file_system_module(
+      new extensions::IsolatedFileSystem());
+  module_system->RegisterNativeModule("isolated_file_system",
+      isolated_file_system_module.Pass());
   module_system->RegisterNativeModule("sysapps_common",
       extensions::CreateJSModuleFromResource(IDR_XWALK_SYSAPPS_COMMON_API));
   module_system->RegisterNativeModule("sysapps_promise",
@@ -139,6 +184,23 @@ void XWalkContentRendererClient::DidCreateModuleSystem(
           IDR_XWALK_APPLICATION_WIDGET_COMMON_API));
 }
 
+const void* XWalkContentRendererClient::CreatePPAPIInterface(
+    const std::string& interface_name) {
+#if defined(ENABLE_PLUGINS) && !defined(DISABLE_NACL)
+  if (interface_name == PPB_NACL_PRIVATE_INTERFACE)
+    return nacl::GetNaClPrivateInterface();
+#endif
+  return NULL;
+}
+
+bool XWalkContentRendererClient::IsExternalPepperPlugin(
+    const std::string& module_name) {
+  // TODO(bbudge) remove this when the trusted NaCl plugin has been removed.
+  // We must defer certain plugin events for NaCl instances since we switch
+  // from the in-process to the out-of-process proxy after instantiating them.
+  return module_name == "Native Client";
+}
+
 #if defined(OS_ANDROID)
 unsigned long long XWalkContentRendererClient::VisitedLinkHash( // NOLINT
     const char* canonical_url, size_t length) {
@@ -151,29 +213,50 @@ bool XWalkContentRendererClient::IsLinkVisited(unsigned long long link_hash) { /
 #endif
 
 bool XWalkContentRendererClient::WillSendRequest(blink::WebFrame* frame,
-                     content::PageTransition transition_type,
+                     ui::PageTransition transition_type,
                      const GURL& url,
                      const GURL& first_party_for_cookies,
                      GURL* new_url) {
 #if defined(OS_ANDROID)
   return false;
 #else
-  if (!xwalk_render_process_observer_->IsWarpMode())
+  if (!xwalk_render_process_observer_->IsWarpMode()
+#if defined(OS_TIZEN)
+      && !xwalk_render_process_observer_->IsCSPMode()
+#endif
+      )
     return false;
 
   GURL origin_url(frame->document().url());
   GURL app_url(xwalk_render_process_observer_->app_url());
-  if ((url.scheme() == app_url.scheme() &&
-       url.host() == app_url.host()) ||
-      frame->document().securityOrigin().canRequest(url)) {
-    LOG(INFO) << "[PASS] " << origin_url.spec() << " request " << url.spec();
+#if defined(OS_TIZEN)
+  // if under CSP mode.
+  if (xwalk_render_process_observer_->IsCSPMode()) {
+    if (url.GetOrigin() != app_url.GetOrigin() &&
+        origin_url != first_party_for_cookies &&
+        !first_party_for_cookies.is_empty() &&
+        first_party_for_cookies.GetOrigin() != app_url.GetOrigin() &&
+        !blink::WebSecurityOrigin::create(app_url).canRequest(url)) {
+      LOG(INFO) << "[BLOCK] allow-navigation: " << url.spec();
+      content::RenderThread::Get()->Send(new ViewMsg_OpenLinkExternal(url));
+      *new_url = GURL();
+      return true;
+    }
+    return false;
+  }
+#endif
+  // if under WARP mode.
+  if (url.GetOrigin() == app_url.GetOrigin() ||
+      blink::WebSecurityOrigin::create(app_url).canRequest(url)) {
+    DLOG(INFO) << "[PASS] " << origin_url.spec() << " request " << url.spec();
     return false;
   }
 
   LOG(INFO) << "[BLOCK] " << origin_url.spec() << " request " << url.spec();
-
 #if defined(OS_TIZEN)
-  if (origin_url.spec().empty())
+  if (url.GetOrigin() != app_url.GetOrigin() &&
+      origin_url != first_party_for_cookies &&
+      first_party_for_cookies.GetOrigin() != app_url.GetOrigin())
     content::RenderThread::Get()->Send(new ViewMsg_OpenLinkExternal(url));
 #endif
 
@@ -181,4 +264,21 @@ bool XWalkContentRendererClient::WillSendRequest(blink::WebFrame* frame,
   return true;
 #endif
 }
+
+void XWalkContentRendererClient::GetNavigationErrorStrings(
+    content::RenderView* render_view,
+    blink::WebFrame* frame,
+    const blink::WebURLRequest& failed_request,
+    const blink::WebURLError& error,
+    std::string* error_html,
+    base::string16* error_description) {
+  bool is_post = EqualsASCII(failed_request.httpMethod(), "POST");
+
+  // TODO(guangzhen): Check whether error_html is needed in xwalk runtime.
+
+  if (error_description) {
+    *error_description = LocalizedError::GetErrorDetails(error, is_post);
+  }
+}
+
 }  // namespace xwalk