1 // Copyright 2015 The Chromium Authors. 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 "components/contextual_search/content/renderer/overlay_js_render_frame_observer.h"
6 
7 #include <utility>
8 
9 #include "base/bind.h"
10 #include "components/contextual_search/content/renderer/contextual_search_wrapper.h"
11 #include "content/public/renderer/render_frame.h"
12 #include "services/service_manager/public/cpp/binder_registry.h"
13 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
14 #include "third_party/blink/public/platform/web_url.h"
15 #include "third_party/blink/public/web/web_document.h"
16 #include "v8/include/v8.h"
17 
18 namespace contextual_search {
19 
OverlayJsRenderFrameObserver(content::RenderFrame * render_frame,service_manager::BinderRegistry * registry)20 OverlayJsRenderFrameObserver::OverlayJsRenderFrameObserver(
21     content::RenderFrame* render_frame,
22     service_manager::BinderRegistry* registry)
23     : RenderFrameObserver(render_frame) {}
24 
~OverlayJsRenderFrameObserver()25 OverlayJsRenderFrameObserver::~OverlayJsRenderFrameObserver() {}
26 
DidClearWindowObject()27 void OverlayJsRenderFrameObserver::DidClearWindowObject() {
28   if (!did_start_enabling_js_api_) {
29     blink::WebURL url = render_frame()->GetWebFrame()->GetDocument().Url();
30     GURL gurl(url);
31     if (!url.IsEmpty() && EnsureServiceConnected()) {
32       did_start_enabling_js_api_ = true;
33       contextual_search_js_api_service_->ShouldEnableJsApi(
34           gurl, base::BindOnce(&OverlayJsRenderFrameObserver::EnableJsApi,
35                                weak_factory_.GetWeakPtr()));
36     }
37   }
38 }
39 
EnableJsApi(bool should_enable)40 void OverlayJsRenderFrameObserver::EnableJsApi(bool should_enable) {
41   if (!should_enable)
42     return;
43   contextual_search::ContextualSearchWrapper::Install(render_frame());
44 }
45 
EnsureServiceConnected()46 bool OverlayJsRenderFrameObserver::EnsureServiceConnected() {
47   if (render_frame() && !contextual_search_js_api_service_) {
48     render_frame()->GetBrowserInterfaceBroker()->GetInterface(
49         contextual_search_js_api_service_.BindNewPipeAndPassReceiver());
50     return true;
51   }
52   return false;
53 }
54 
OnDestruct()55 void OverlayJsRenderFrameObserver::OnDestruct() {
56   delete this;
57 }
58 
59 }  // namespace contextual_search
60