Index: components/contextual_search/contextual_search_wrapper.cc |
diff --git a/components/contextual_search/contextual_search_wrapper.cc b/components/contextual_search/contextual_search_wrapper.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3afd1bc985ae74765f389ce789390de90bbe8efc |
--- /dev/null |
+++ b/components/contextual_search/contextual_search_wrapper.cc |
@@ -0,0 +1,99 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "components/contextual_search/contextual_search_wrapper.h" |
+ |
+#include "base/strings/string_util.h" |
+#include "components/contextual_search/contextual_search_api_service.mojom.h" |
+#include "content/public/common/service_registry.h" |
+#include "content/public/renderer/render_frame.h" |
+#include "gin/arguments.h" |
+#include "gin/handle.h" |
+#include "gin/object_template_builder.h" |
+#include "third_party/WebKit/public/web/WebFrame.h" |
+#include "third_party/WebKit/public/web/WebKit.h" |
+#include "third_party/WebKit/public/web/WebLocalFrame.h" |
+#include "v8/include/v8.h" |
+ |
+namespace contextual_search { |
+ |
+static const char kContextualSearchObjectName[] = "contextualSearch"; |
jochen (gone - plz use gerrit)
2015/11/17 14:58:12
prefer anonymous namespace over file-local static
Donn Denman
2015/11/19 01:11:29
Done.
|
+static const char kSetCaptionMethodName[] = "setCaption"; |
+ |
+// TODO(donnd): merge with the identical code in |
Donn Denman
2015/11/17 00:24:24
I tried your suggestion to "move this to content/p
jochen (gone - plz use gerrit)
2015/11/17 14:58:12
what's the link error you got?
Donn Denman
2015/11/19 01:11:29
An undefined reference here to content::GetOrCreat
jochen (gone - plz use gerrit)
2015/11/19 09:22:17
Sounds like you forgot to put CONTENT_EXPORT in fr
Donn Denman
2015/11/19 17:48:04
LOL! I'll give that a try!
|
+// chrome_object_extensions_utils (which chrome-android can't access). |
+v8::Local<v8::Object> GetOrCreateChromeObject(v8::Isolate* isolate, |
+ v8::Local<v8::Object> global) { |
+ v8::Local<v8::Object> chrome; |
+ v8::Local<v8::Value> chrome_value = |
+ global->Get(gin::StringToV8(isolate, "chrome")); |
+ if (chrome_value.IsEmpty() || !chrome_value->IsObject()) { |
+ chrome = v8::Object::New(isolate); |
+ global->Set(gin::StringToSymbol(isolate, "chrome"), chrome); |
+ } else { |
+ chrome = v8::Local<v8::Object>::Cast(chrome_value); |
+ } |
+ return chrome; |
+} |
+ |
+gin::WrapperInfo ContextualSearchWrapper::kWrapperInfo = { |
+ gin::kEmbedderNativeGin}; |
+ |
+// static |
+void ContextualSearchWrapper::Install(content::RenderFrame* render_frame) { |
+ // NOTE: Installing new v8 functions that can access Chrome native code |
+ // requires a security review! We did an exahustive search for a better |
+ // way to implement a communication channel between the page and Chrome, |
+ // but found nothing better. |
+ // TODO(donnd): use a better communication channel once that becomes |
+ // available, e.g. navigator.connect API. See crbug.com/541683. |
+ // TODO(donnd): refactor some of this boilerplate into a reusable |
+ // method. This was cribbed from MemoryBenchmarkingExtension. |
+ v8::Isolate* isolate = blink::mainThreadIsolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ v8::Local<v8::Context> context = |
+ render_frame->GetWebFrame()->mainWorldScriptContext(); |
+ if (context.IsEmpty()) |
+ return; |
+ |
+ v8::Context::Scope context_scope(context); |
+ gin::Handle<ContextualSearchWrapper> wrapper = |
+ gin::CreateHandle(isolate, new ContextualSearchWrapper(render_frame)); |
+ if (wrapper.IsEmpty()) |
+ return; |
+ |
+ v8::Local<v8::Object> chrome = |
+ GetOrCreateChromeObject(isolate, context->Global()); |
+ chrome->Set(gin::StringToV8(isolate, kContextualSearchObjectName), |
+ wrapper.ToV8()); |
+} |
+ |
+ContextualSearchWrapper::ContextualSearchWrapper( |
+ content::RenderFrame* render_frame) |
+ : render_frame_(render_frame) {} |
+ |
+ContextualSearchWrapper::~ContextualSearchWrapper() {} |
+ |
+gin::ObjectTemplateBuilder ContextualSearchWrapper::GetObjectTemplateBuilder( |
+ v8::Isolate* isolate) { |
+ return gin::Wrappable<ContextualSearchWrapper>::GetObjectTemplateBuilder( |
+ isolate) |
+ .SetMethod(kSetCaptionMethodName, &ContextualSearchWrapper::SetCaption); |
+} |
+ |
+void ContextualSearchWrapper::EnsureServiceConnected() { |
+ if (!contextual_search_api_service_ || |
+ !contextual_search_api_service_.is_bound()) { |
+ render_frame_->GetServiceRegistry()->ConnectToRemoteService( |
+ mojo::GetProxy(&contextual_search_api_service_)); |
+ } |
+} |
+ |
+void ContextualSearchWrapper::SetCaption(const std::string& caption) { |
+ EnsureServiceConnected(); |
+ DVLOG(0) << "ctxs SetCaption: caption: " << caption; |
+ contextual_search_api_service_->HandleSetCaption(caption); |
+} |
+ |
+} // namespace contextual_search |