Index: chrome/renderer/contextualsearch/contextual_search_wrapper.cc |
diff --git a/chrome/renderer/contextualsearch/contextual_search_wrapper.cc b/chrome/renderer/contextualsearch/contextual_search_wrapper.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b132b4f770d933426b4da81b62b180d2fa1f5c61 |
--- /dev/null |
+++ b/chrome/renderer/contextualsearch/contextual_search_wrapper.cc |
@@ -0,0 +1,84 @@ |
+// 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 "chrome/renderer/contextualsearch/contextual_search_wrapper.h" |
+ |
+#include "base/strings/string_util.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 "v8/include/v8.h" |
+ |
+namespace search { |
+ |
+static const char kContextualSearchObjectName[] = "contextualSearch"; |
+static const char kSetCaptionMethodName[] = "setCaption"; |
+ |
+// TODO(donnd): merge with the identical code in |
+// chrome_object_extensions_utils (which chrome-android can't access). |
+v8::Local<v8::Object> GetOrCreateChromeObject(v8::Isolate* isolate, |
jochen (gone - plz use gerrit)
2015/10/20 08:09:56
I'd move this to content/public/renderer/chrome_ob
Donn Denman
2015/10/20 21:56:46
I tried this, but I couldn't get it to link, so I'
|
+ 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(blink::WebFrame* 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 = frame->mainWorldScriptContext(); |
+ if (context.IsEmpty()) |
+ return; |
+ |
+ v8::Context::Scope context_scope(context); |
+ gin::Handle<ContextualSearchWrapper> wrapper = |
+ gin::CreateHandle(isolate, new ContextualSearchWrapper()); |
+ if (wrapper.IsEmpty()) |
+ return; |
+ |
+ v8::Local<v8::Object> chrome = |
+ GetOrCreateChromeObject(isolate, context->Global()); |
+ chrome->Set(gin::StringToV8(isolate, kContextualSearchObjectName), |
+ wrapper.ToV8()); |
+} |
+ |
+ContextualSearchWrapper::ContextualSearchWrapper() {} |
+ |
+ContextualSearchWrapper::~ContextualSearchWrapper() {} |
+ |
+gin::ObjectTemplateBuilder ContextualSearchWrapper::GetObjectTemplateBuilder( |
+ v8::Isolate* isolate) { |
+ return gin::Wrappable<ContextualSearchWrapper>::GetObjectTemplateBuilder( |
+ isolate) |
+ .SetMethod(kSetCaptionMethodName, &ContextualSearchWrapper::SetCaption); |
+} |
+ |
+// static |
+void ContextualSearchWrapper::SetCaption(const std::string& caption) { |
+ DVLOG(0) << "ctxs SetCaption: caption: " << caption; |
+ // TODO(donnd): send the caption to the Browser! |
+} |
+ |
+} // namespace search |