[M120 Migration][WRTjs] Support NavigationPolicy on decide Navigation
[platform/framework/web/chromium-efl.git] / wrt / src / browser / wrt_render_message_filter.cc
1 // Copyright 2019 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 "wrt/src/browser/wrt_render_message_filter.h"
6
7 #include "third_party/blink/public/web/web_navigation_policy.h"
8 #include "tizen_src/ewk/efl_integration/common/render_messages_ewk.h"
9 #include "tizen_src/ewk/efl_integration/private/ewk_policy_decision_private.h"
10 #include "wrt/src/browser/native_web_runtime.h"
11
12 namespace {
13
14 const uint32_t kFilteredMessageClasses[] = {EwkMsgStart};
15
16 }  // namespace
17
18 namespace wrt {
19
20 WRTRenderMessageFilter::WRTRenderMessageFilter()
21     : BrowserMessageFilter(kFilteredMessageClasses,
22                            std::size(kFilteredMessageClasses)) {}
23
24 WRTRenderMessageFilter::~WRTRenderMessageFilter() {}
25
26 void WRTRenderMessageFilter::OverrideThreadForMessage(
27     const IPC::Message& message,
28     content::BrowserThread::ID* thread) {
29   switch (message.type()) {
30     case EwkHostMsg_DecideNavigationPolicy::ID:
31       *thread = content::BrowserThread::UI;
32       break;
33   }
34 }
35
36 bool WRTRenderMessageFilter::OnMessageReceived(const IPC::Message& message) {
37   bool handled = true;
38   IPC_BEGIN_MESSAGE_MAP(WRTRenderMessageFilter, message)
39   IPC_MESSAGE_HANDLER(EwkHostMsg_DecideNavigationPolicy,
40                       OnDecideNavigationPolicy)
41   IPC_MESSAGE_UNHANDLED(handled = false)
42   IPC_END_MESSAGE_MAP()
43   return handled;
44 }
45
46 void WRTRenderMessageFilter::OnDecideNavigationPolicy(
47     NavigationPolicyParams params,
48     bool* handled) {
49   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
50
51   std::unique_ptr<_Ewk_Policy_Decision> policy_decision(
52       new _Ewk_Policy_Decision(params));
53
54   if (NativeWebRuntime::GetInstance().ShouldAllowNavigation(params.url.spec()))
55     policy_decision->Use();
56   else
57     policy_decision->Ignore();
58
59   CHECK(!policy_decision->isSuspended());
60
61   *handled = policy_decision->GetNavigationPolicyHandler()->GetDecision() ==
62              NavigationPolicyHandlerEfl::Handled;
63 }
64
65 } // namespace wrt