[M108 Migration][VD][HBBTV][API] Support DVB scheme for HBBTV
[platform/framework/web/chromium-efl.git] / tizen_src / ewk / efl_integration / wrt / wrt_widget_host.cc
1 // Copyright (c) 2014,2015 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_widget_host.h"
6
7 #include "base/lazy_instance.h"
8 #include "common/render_messages_ewk.h"
9 #include "content/public/browser/browser_message_filter.h"
10 #include "content/public/browser/render_process_host.h"
11 #include "ipc/ipc_message_macros.h"
12 #include "ipc_message_start_ewk.h"
13 #include "net/url_request/url_request.h"
14 #include "url/gurl.h"
15
16 namespace {
17 // TODO(z.kostrzewa) I would prefer not make it a singleton, check out
18 // if it can't be a member of ContentMainDelegateEfl (but keep the static
19 // getter, maybe?).
20 base::LazyInstance<std::unique_ptr<WrtWidgetHost> > g_wrt_widget_host =
21     LAZY_INSTANCE_INITIALIZER;
22
23 bool SendToAllRenderers(IPC::Message* message) {
24   bool result = false;
25   content::RenderProcessHost::iterator it =
26       content::RenderProcessHost::AllHostsIterator();
27   while (!it.IsAtEnd()) {
28     if (it.GetCurrentValue()->Send(new IPC::Message(*message)))
29       result = true;
30     it.Advance();
31   }
32   delete message;
33   return result;
34 }
35
36 bool SendToRenderer(int renderer_id, IPC::Message* message) {
37   content::RenderProcessHost* host =
38       content::RenderProcessHost::FromID(renderer_id);
39   if (!host)
40     return false;
41
42   return host->Send(message);
43 }
44 }
45
46 class WrtWidgetHostMessageFilter : public content::BrowserMessageFilter {
47  public:
48   explicit WrtWidgetHostMessageFilter(WrtWidgetHost* wrt_widget_host);
49
50  private:
51   bool OnMessageReceived(const IPC::Message& message) override;
52
53   WrtWidgetHost* wrt_widget_host_;
54 };
55
56 WrtWidgetHostMessageFilter::WrtWidgetHostMessageFilter(
57     WrtWidgetHost* wrt_widget_host)
58     : content::BrowserMessageFilter(EwkMsgStart),
59       wrt_widget_host_(wrt_widget_host) {
60 }
61
62 bool WrtWidgetHostMessageFilter::OnMessageReceived(const IPC::Message& message) {
63   bool handled = true;
64   IPC_BEGIN_MESSAGE_MAP(WrtWidgetHostMessageFilter, message)
65     IPC_MESSAGE_FORWARD(WrtMsg_ParseUrlResponse, wrt_widget_host_, WrtWidgetHost::OnUrlRetrieved)
66     IPC_MESSAGE_UNHANDLED(handled = false)
67   IPC_END_MESSAGE_MAP()
68   return handled;
69 }
70
71 WrtWidgetHost* WrtWidgetHost::Get() {
72   // TODO(z.kostrzewa) LazyInstance is thread-safe but creating
73   // WrtWidgetHost is not - make it thread-safe.
74 #if !defined(EWK_BRINGUP)  // FIXME: m67 bringup
75   // FIXME: ‘New’ is not a member of
76   // ‘base::internal::ErrorMustSelectLazyOrDestructorAtExitForLazyInstance<std::unique_ptr<WrtWidgetHost>
77   // >’
78   if (!g_wrt_widget_host.Get().get())
79     g_wrt_widget_host.Get().reset(new WrtWidgetHost);
80   return g_wrt_widget_host.Get().get();
81 #endif
82 }
83
84 WrtWidgetHost::WrtWidgetHost()
85     : message_filter_(new WrtWidgetHostMessageFilter(this)) {
86 }
87
88 void WrtWidgetHost::GetUrlForRequest(
89     net::URLRequest* request,
90     base::OnceCallback<void(const GURL&)> callback) {
91   // TODO(z.kostrzewa) Check on which thread(s) callbacks_ is touched
92   // and provide synchronization if required (either via a lock or
93   // by assuring that it is referenced only on one thread)
94   int callback_id = callback_id_generator_.GetNext();
95   callbacks_[callback_id] = std::move(callback);
96
97 #if !defined(EWK_BRINGUP)  // FIXME: m85 bringup
98   int renderer_id, frame_id;
99   if (content::ResourceRequestInfo::GetRenderFrameForRequest(request, &renderer_id,
100                                                              &frame_id))
101     if (SendToRenderer(renderer_id, new WrtMsg_ParseUrl(callback_id, request->url())))
102       return;
103 #endif
104
105   std::move(callback).Run(GURL());
106   callbacks_.erase(callback_id);
107 }
108
109 void WrtWidgetHost::SendWrtMessage(
110     const Ewk_Wrt_Message_Data& message) {
111   SendToAllRenderers(new WrtMsg_SendWrtMessage(message));
112 }
113
114 // It's only used by the wrt_file_protocol_handler which is not going to be used in the future
115 // Candidate for deletion.
116 bool WrtWidgetHost::InWrt() const {
117   return false;
118 }
119
120 // It's only used by the wrt_file_protocol_handler which is not going to be used in the future
121 // Candidate for deletion.
122 std::string WrtWidgetHost::TizenAppId() const {
123   return std::string();
124 }
125
126 void WrtWidgetHost::OnUrlRetrieved(int callback_id, const GURL& url) {
127   auto it = callbacks_.find(callback_id);
128   if (callbacks_.end() == it)
129     return;
130
131   std::move(it->second).Run(url);
132   callbacks_.erase(it);
133 }
134