// Copyright © 2019 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #pragma once #include "include/cef_v8.h" #include "..\CefSharp.Core\Internals\Messaging\Messages.h" #include "..\CefSharp.Core\Internals\Serialization\Primitives.h" #include "Serialization\V8Serialization.h" using namespace System; using namespace CefSharp::Internals::Messaging; using namespace CefSharp::Internals::Serialization; namespace CefSharp { const CefString kPostMessage = CefString("PostMessage"); const CefString kPostMessageCamelCase = CefString("postMessage"); private class JavascriptPostMessageHandler : public CefV8Handler { private: gcroot _javascriptCallbackRegistry; public: JavascriptPostMessageHandler(JavascriptCallbackRegistry^ javascriptCallbackRegistry) { _javascriptCallbackRegistry = javascriptCallbackRegistry; } bool Execute(const CefString& name, CefRefPtr object, const CefV8ValueList& arguments, CefRefPtr& retval, CefString& exception) OVERRIDE { if (arguments.size() == 0 || arguments.size() > 1) { //TODO: Improve error message exception = "Only a single param is accepted"; return true; } auto context = CefV8Context::GetCurrentContext(); if (context.get()) { auto frame = context->GetFrame(); if (frame.get() && frame->IsValid() && context->Enter()) { try { auto global = context->GetGlobal(); auto request = CefProcessMessage::Create(kJavascriptMessageReceived); auto argList = request->GetArgumentList(); auto params = CefListValue::Create(); SerializeV8Object(arguments[0], params, 0, _javascriptCallbackRegistry); //We're only interested in the first param if (params->GetSize() > 0) { argList->SetValue(0, params->GetValue(0)); } frame->SendProcessMessage(CefProcessId::PID_BROWSER, request); retval = CefV8Value::CreateNull(); } finally { context->Exit(); } } else { exception = "Unable to Enter Context"; } } else { exception = "Unable to get current context"; } return true; } IMPLEMENT_REFCOUNTING(JavascriptPostMessageHandler); }; }