2015-04-25 02:45:21 -04:00
|
|
|
// Copyright © 2010-2015 The CefSharp Authors. All rights reserved.
|
2014-03-09 13:49:35 +01:00
|
|
|
//
|
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
|
|
|
|
|
|
2015-06-05 15:46:11 +10:00
|
|
|
#include "Stdafx.h"
|
2015-06-13 10:32:15 -04:00
|
|
|
|
|
|
|
|
#include "include/wrapper/cef_stream_resource_handler.h"
|
2014-03-09 13:49:35 +01:00
|
|
|
#include "ClientAdapter.h"
|
2015-06-05 15:46:11 +10:00
|
|
|
#include "CefRequestWrapper.h"
|
|
|
|
|
#include "CefContextMenuParamsWrapper.h"
|
2015-08-17 13:33:27 +10:00
|
|
|
#include "CefMenuModelWrapper.h"
|
2015-06-05 15:46:11 +10:00
|
|
|
#include "CefDragDataWrapper.h"
|
|
|
|
|
#include "TypeConversion.h"
|
|
|
|
|
#include "CefSharpBrowserWrapper.h"
|
2015-06-05 15:44:25 +10:00
|
|
|
#include "CefDownloadItemCallbackWrapper.h"
|
|
|
|
|
#include "CefBeforeDownloadCallbackWrapper.h"
|
|
|
|
|
#include "CefGeolocationCallbackWrapper.h"
|
|
|
|
|
#include "CefFileDialogCallbackWrapper.h"
|
|
|
|
|
#include "CefAuthCallbackWrapper.h"
|
2015-06-05 15:46:11 +10:00
|
|
|
#include "CefJSDialogCallbackWrapper.h"
|
|
|
|
|
#include "CefRequestCallbackWrapper.h"
|
2015-08-13 15:11:37 +10:00
|
|
|
#include "WindowInfo.h"
|
2015-06-29 15:08:53 +10:00
|
|
|
#include "Serialization\Primitives.h"
|
|
|
|
|
#include "Serialization\V8Serialization.h"
|
2015-08-06 10:25:33 +02:00
|
|
|
#include "Serialization\JsObjectsSerialization.h"
|
2015-07-13 16:35:22 +02:00
|
|
|
#include "Serialization\ObjectsSerialization.h"
|
2015-06-29 15:08:53 +10:00
|
|
|
#include "Messaging\Messages.h"
|
|
|
|
|
|
|
|
|
|
using namespace CefSharp::Internals::Messaging;
|
|
|
|
|
using namespace CefSharp::Internals::Serialization;
|
2014-03-09 13:49:35 +01:00
|
|
|
|
|
|
|
|
namespace CefSharp
|
|
|
|
|
{
|
|
|
|
|
namespace Internals
|
|
|
|
|
{
|
2015-06-11 13:33:35 +10:00
|
|
|
IBrowser^ ClientAdapter::GetBrowserWrapper(int browserId, bool isPopup)
|
2015-06-11 12:24:32 +10:00
|
|
|
{
|
2015-07-28 18:23:53 +10:00
|
|
|
if (_browserControl->HasParent)
|
|
|
|
|
{
|
|
|
|
|
return _browserAdapter->GetBrowser();
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-11 13:33:35 +10:00
|
|
|
if(isPopup)
|
2015-06-11 12:24:32 +10:00
|
|
|
{
|
2015-06-11 13:33:35 +10:00
|
|
|
IBrowser^ browserWrapper;
|
|
|
|
|
if (_popupBrowsers->TryGetValue(browserId, browserWrapper))
|
|
|
|
|
{
|
|
|
|
|
return browserWrapper;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto stackFrame = gcnew StackFrame(1);
|
|
|
|
|
auto callingMethodName = stackFrame->GetMethod()->Name;
|
2015-06-11 12:24:32 +10:00
|
|
|
|
2015-06-11 13:33:35 +10:00
|
|
|
ThrowUnknownPopupBrowser(gcnew String(L"ClientAdapter::" + callingMethodName));
|
|
|
|
|
}
|
2015-06-11 12:24:32 +10:00
|
|
|
|
2015-06-11 13:33:35 +10:00
|
|
|
return _browserAdapter->GetBrowser();
|
2015-06-11 12:24:32 +10:00
|
|
|
}
|
|
|
|
|
|
2014-12-19 16:30:59 +10:00
|
|
|
void ClientAdapter::CloseAllPopups(bool forceClose)
|
|
|
|
|
{
|
2015-05-17 17:41:44 -04:00
|
|
|
if (_popupBrowsers->Count > 0)
|
2014-12-19 16:30:59 +10:00
|
|
|
{
|
2015-05-17 17:41:44 -04:00
|
|
|
for each (IBrowser^ browser in _popupBrowsers->Values)
|
2014-12-19 16:30:59 +10:00
|
|
|
{
|
2015-06-01 11:19:06 +10:00
|
|
|
browser->GetHost()->CloseBrowser(forceClose);
|
2015-06-17 18:14:07 -04:00
|
|
|
// NOTE: We don't dispose the IBrowsers here
|
|
|
|
|
// because ->CloseBrowser() will invoke
|
|
|
|
|
// ->OnBeforeClose() for the browser.
|
|
|
|
|
// OnBeforeClose() disposes the IBrowser there.
|
2014-12-19 16:30:59 +10:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-03-09 13:49:35 +01:00
|
|
|
bool ClientAdapter::OnBeforePopup(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, const CefString& target_url,
|
2015-07-21 15:16:25 +10:00
|
|
|
const CefString& target_frame_name, CefLifeSpanHandler::WindowOpenDisposition target_disposition, bool user_gesture,
|
|
|
|
|
const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo,
|
2014-03-09 13:49:35 +01:00
|
|
|
CefRefPtr<CefClient>& client, CefBrowserSettings& settings, bool* no_javascript_access)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->LifeSpanHandler;
|
2015-07-28 17:17:12 +10:00
|
|
|
|
2014-03-09 13:49:35 +01:00
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2015-07-28 17:17:12 +10:00
|
|
|
|
|
|
|
|
IWebBrowser^ newBrowser = nullptr;
|
2015-06-11 11:21:55 +10:00
|
|
|
bool createdWrapper = false;
|
2015-07-22 15:36:44 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-11 11:21:55 +10:00
|
|
|
|
2015-06-29 14:03:10 +10:00
|
|
|
CefFrameWrapper frameWrapper(frame);
|
2015-08-13 15:11:37 +10:00
|
|
|
WindowInfo windowInfoWrapper(&windowInfo);
|
2015-07-01 13:53:17 +10:00
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
auto result = handler->OnBeforePopup(
|
|
|
|
|
_browserControl, browserWrapper,
|
2015-06-08 22:48:29 -04:00
|
|
|
%frameWrapper, StringUtils::ToClr(target_url),
|
2015-07-07 12:28:29 +10:00
|
|
|
StringUtils::ToClr(target_frame_name),
|
2015-07-28 11:14:06 +10:00
|
|
|
(CefSharp::WindowOpenDisposition)target_disposition,
|
|
|
|
|
user_gesture,
|
2015-07-28 17:17:12 +10:00
|
|
|
%windowInfoWrapper, *no_javascript_access, newBrowser);
|
2015-05-05 17:31:46 +01:00
|
|
|
|
2015-07-28 15:59:30 +10:00
|
|
|
if (newBrowser != nullptr)
|
2015-05-07 23:40:56 +01:00
|
|
|
{
|
2015-07-28 16:51:51 +10:00
|
|
|
auto newBrowserInternal = dynamic_cast<IWebBrowserInternal^>(newBrowser);
|
2015-05-05 17:31:46 +01:00
|
|
|
|
2015-05-08 11:14:29 +01:00
|
|
|
if (newBrowserInternal != nullptr)
|
2015-05-07 23:40:56 +01:00
|
|
|
{
|
2015-07-28 16:51:51 +10:00
|
|
|
newBrowserInternal->HasParent = true;
|
|
|
|
|
|
|
|
|
|
auto renderBrowser = dynamic_cast<IRenderWebBrowser^>(newBrowser);
|
2015-08-03 17:56:24 +10:00
|
|
|
if (renderBrowser == nullptr)
|
|
|
|
|
{
|
|
|
|
|
HWND hwnd = (HWND)newBrowserInternal->ControlHandle.ToPointer();
|
|
|
|
|
RECT rect;
|
|
|
|
|
GetClientRect(hwnd, &rect);
|
|
|
|
|
windowInfo.SetAsChild(hwnd, rect);
|
|
|
|
|
}
|
|
|
|
|
else
|
2015-05-08 11:14:29 +01:00
|
|
|
{
|
|
|
|
|
windowInfo.SetAsWindowless(windowInfo.parent_window, TRUE);
|
|
|
|
|
}
|
2015-05-05 17:31:46 +01:00
|
|
|
|
2015-07-28 16:51:51 +10:00
|
|
|
auto browserAdapter = dynamic_cast<ManagedCefBrowserAdapter^>(newBrowserInternal->BrowserAdapter);
|
2015-05-08 11:14:29 +01:00
|
|
|
if (browserAdapter != nullptr)
|
|
|
|
|
{
|
|
|
|
|
client = browserAdapter->GetClientAdapter().get();
|
2015-08-27 09:55:12 +02:00
|
|
|
|
|
|
|
|
auto renderClientAdapter = dynamic_cast<RenderClientAdapter*>(client.get());
|
|
|
|
|
if (renderClientAdapter != nullptr)
|
|
|
|
|
{
|
|
|
|
|
renderClientAdapter->CreateBitmapInfo();
|
|
|
|
|
}
|
2015-05-08 11:14:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
2015-05-07 23:40:56 +01:00
|
|
|
}
|
2015-05-05 17:31:46 +01:00
|
|
|
|
2015-05-17 17:41:44 -04:00
|
|
|
return result;
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnAfterCreated(CefRefPtr<CefBrowser> browser)
|
|
|
|
|
{
|
2015-07-28 16:51:51 +10:00
|
|
|
if (browser->IsPopup() && !_browserControl->HasParent)
|
2014-12-19 16:30:59 +10:00
|
|
|
{
|
2015-06-29 14:03:10 +10:00
|
|
|
auto browserWrapper = gcnew CefSharpBrowserWrapper(browser);
|
2014-12-19 16:30:59 +10:00
|
|
|
// Add to the list of popup browsers.
|
2015-05-17 17:41:44 -04:00
|
|
|
_popupBrowsers->Add(browser->GetIdentifier(), browserWrapper);
|
2014-12-19 16:30:59 +10:00
|
|
|
}
|
|
|
|
|
else
|
2014-03-09 13:49:35 +01:00
|
|
|
{
|
|
|
|
|
_browserHwnd = browser->GetHost()->GetWindowHandle();
|
|
|
|
|
_cefBrowser = browser;
|
2014-05-20 20:47:13 +02:00
|
|
|
|
2015-07-07 15:20:27 +10:00
|
|
|
if (!Object::ReferenceEquals(_browserAdapter, nullptr))
|
2014-04-04 20:32:15 +02:00
|
|
|
{
|
2015-06-11 11:44:35 +10:00
|
|
|
_browserAdapter->OnAfterBrowserCreated(browser->GetIdentifier());
|
2014-04-04 20:32:15 +02:00
|
|
|
}
|
2015-08-17 11:58:52 +10:00
|
|
|
}
|
2015-05-07 18:32:14 +01:00
|
|
|
|
2015-08-17 11:58:52 +10:00
|
|
|
auto handler = _browserControl->LifeSpanHandler;
|
2015-05-07 18:32:14 +01:00
|
|
|
|
2015-08-17 11:58:52 +10:00
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-05-07 18:32:14 +01:00
|
|
|
|
2015-08-17 11:58:52 +10:00
|
|
|
handler->OnAfterCreated(_browserControl, browserWrapper);
|
2015-07-28 17:19:50 +10:00
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
2015-08-17 13:46:28 +10:00
|
|
|
bool ClientAdapter::DoClose(CefRefPtr<CefBrowser> browser)
|
|
|
|
|
{
|
|
|
|
|
auto handler = _browserControl->LifeSpanHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
|
|
|
|
|
return handler->DoClose(_browserControl, browserWrapper);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-03-09 13:49:35 +01:00
|
|
|
void ClientAdapter::OnBeforeClose(CefRefPtr<CefBrowser> browser)
|
|
|
|
|
{
|
2015-08-30 20:00:37 +10:00
|
|
|
auto isPopup = browser->IsPopup() && !_browserControl->HasParent;
|
|
|
|
|
auto handler = _browserControl->LifeSpanHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), isPopup);
|
|
|
|
|
|
|
|
|
|
handler->OnBeforeClose(_browserControl, browserWrapper);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isPopup)
|
2014-12-19 16:30:59 +10:00
|
|
|
{
|
|
|
|
|
// Remove from the browser popup list.
|
2015-07-22 15:36:44 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), true);
|
2015-06-11 12:24:32 +10:00
|
|
|
_popupBrowsers->Remove(browser->GetIdentifier());
|
|
|
|
|
// Dispose the CefSharpBrowserWrapper
|
|
|
|
|
delete browserWrapper;
|
2014-12-19 16:30:59 +10:00
|
|
|
}
|
2015-07-28 17:07:25 +10:00
|
|
|
//TODO: When creating a new ChromiumWebBrowser and passing in a newBrowser to OnBeforePopup
|
|
|
|
|
//the handles don't match up (at least in WPF), need to investigate further.
|
|
|
|
|
else if (_browserHwnd == browser->GetHost()->GetWindowHandle() || _browserControl->HasParent)
|
2014-03-09 13:49:35 +01:00
|
|
|
{
|
2015-08-17 11:58:52 +10:00
|
|
|
_cefBrowser = NULL;
|
|
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnLoadingStateChange(CefRefPtr<CefBrowser> browser, bool isLoading, bool canGoBack, bool canGoForward)
|
|
|
|
|
{
|
2015-08-13 21:33:23 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
auto args = gcnew LoadingStateChangedEventArgs(browserWrapper, canGoBack, canGoForward, isLoading);
|
|
|
|
|
|
2015-08-17 11:54:40 +10:00
|
|
|
if (!browser->IsPopup())
|
2015-05-17 17:41:44 -04:00
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
_browserControl->SetLoadingStateChange(args);
|
2015-05-17 17:41:44 -04:00
|
|
|
}
|
2015-08-17 11:54:40 +10:00
|
|
|
|
|
|
|
|
auto handler = _browserControl->LoadHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
2015-05-17 17:41:44 -04:00
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
handler->OnLoadingStateChange(_browserControl, args);
|
2015-05-17 17:41:44 -04:00
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnAddressChange(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, const CefString& address)
|
|
|
|
|
{
|
2015-08-13 21:33:23 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-08-13 21:55:33 +10:00
|
|
|
auto args = gcnew AddressChangedEventArgs(browserWrapper, StringUtils::ToClr(address));
|
2015-08-13 21:33:23 +10:00
|
|
|
|
2015-08-17 11:54:40 +10:00
|
|
|
if (!browser->IsPopup())
|
2014-03-09 13:49:35 +01:00
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
_browserControl->SetAddress(args);
|
2015-08-13 21:33:23 +10:00
|
|
|
}
|
2015-08-17 11:54:40 +10:00
|
|
|
|
|
|
|
|
auto handler = _browserControl->DisplayHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
2015-08-13 21:33:23 +10:00
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
handler->OnAddressChanged(_browserControl, args);
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnTitleChange(CefRefPtr<CefBrowser> browser, const CefString& title)
|
|
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
auto args = gcnew TitleChangedEventArgs(StringUtils::ToClr(title));
|
|
|
|
|
|
|
|
|
|
if (browser->IsPopup() && !_browserControl->HasParent)
|
2014-12-19 14:09:17 +10:00
|
|
|
{
|
|
|
|
|
// Set the popup window title
|
|
|
|
|
auto hwnd = browser->GetHost()->GetWindowHandle();
|
|
|
|
|
SetWindowText(hwnd, std::wstring(title).c_str());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2015-08-13 21:33:23 +10:00
|
|
|
_browserControl->SetTitle(args);
|
2014-12-19 14:09:17 +10:00
|
|
|
}
|
2015-08-17 11:54:40 +10:00
|
|
|
|
|
|
|
|
auto handler = _browserControl->DisplayHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
handler->OnTitleChanged(_browserControl, args);
|
|
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
2015-05-07 13:50:19 +10:00
|
|
|
void ClientAdapter::OnFaviconURLChange(CefRefPtr<CefBrowser> browser, const std::vector<CefString>& iconUrls)
|
|
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
auto handler = _browserControl->DisplayHandler;
|
2015-06-11 12:24:32 +10:00
|
|
|
|
2015-08-17 10:56:40 +10:00
|
|
|
if (handler != nullptr)
|
2015-05-17 17:41:44 -04:00
|
|
|
{
|
2015-08-17 10:56:40 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-07-22 15:36:44 +10:00
|
|
|
|
2015-08-17 10:56:40 +10:00
|
|
|
handler->OnFaviconUrlChange(_browserControl, browserWrapper, StringUtils::ToClr(iconUrls));
|
2015-05-07 13:50:19 +10:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-03-09 13:49:35 +01:00
|
|
|
bool ClientAdapter::OnTooltip(CefRefPtr<CefBrowser> browser, CefString& text)
|
|
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
auto tooltip = StringUtils::ToClr(text);
|
|
|
|
|
bool hasChanged = tooltip != _tooltip;
|
2014-03-09 13:49:35 +01:00
|
|
|
|
2015-08-17 11:54:40 +10:00
|
|
|
//NOTE: Only called if tooltip changed otherwise called many times
|
2015-08-17 12:05:01 +10:00
|
|
|
// also only appears to be called with OSR rendering at the moment
|
2015-08-17 11:54:40 +10:00
|
|
|
if(hasChanged)
|
2014-03-09 13:49:35 +01:00
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
if (!browser->IsPopup())
|
|
|
|
|
{
|
|
|
|
|
_tooltip = tooltip;
|
|
|
|
|
_browserControl->SetTooltipText(_tooltip);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto handler = _browserControl->DisplayHandler;
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
return handler->OnTooltipChanged(_browserControl, tooltip);
|
|
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ClientAdapter::OnConsoleMessage(CefRefPtr<CefBrowser> browser, const CefString& message, const CefString& source, int line)
|
|
|
|
|
{
|
2015-08-13 21:33:23 +10:00
|
|
|
auto args = gcnew ConsoleMessageEventArgs(StringUtils::ToClr(message), StringUtils::ToClr(source), line);
|
2014-03-09 13:49:35 +01:00
|
|
|
|
2015-08-17 11:54:40 +10:00
|
|
|
if (!browser->IsPopup())
|
|
|
|
|
{
|
|
|
|
|
_browserControl->OnConsoleMessage(args);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto handler = _browserControl->DisplayHandler;
|
2015-08-17 12:11:40 +10:00
|
|
|
if (handler == nullptr)
|
2015-08-17 11:54:40 +10:00
|
|
|
{
|
2015-08-17 12:11:40 +10:00
|
|
|
return false;
|
2015-08-17 11:54:40 +10:00
|
|
|
}
|
2015-06-11 11:21:55 +10:00
|
|
|
|
2015-08-17 12:11:40 +10:00
|
|
|
return handler->OnConsoleMessage(_browserControl, args);
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
2014-08-08 14:29:12 -04:00
|
|
|
void ClientAdapter::OnStatusMessage(CefRefPtr<CefBrowser> browser, const CefString& value)
|
|
|
|
|
{
|
2015-08-13 21:33:23 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
auto args = gcnew StatusMessageEventArgs(browserWrapper, StringUtils::ToClr(value));
|
2015-06-11 11:21:55 +10:00
|
|
|
|
2015-08-17 11:54:40 +10:00
|
|
|
if (!browser->IsPopup())
|
2015-05-17 17:41:44 -04:00
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
_browserControl->OnStatusMessage(args);
|
2015-05-17 17:41:44 -04:00
|
|
|
}
|
2015-08-17 11:54:40 +10:00
|
|
|
|
|
|
|
|
auto handler = _browserControl->DisplayHandler;
|
|
|
|
|
if (handler != nullptr)
|
2015-05-17 17:41:44 -04:00
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
handler->OnStatusMessage(_browserControl, args);
|
2015-05-17 17:41:44 -04:00
|
|
|
}
|
2014-08-08 14:29:12 -04:00
|
|
|
}
|
|
|
|
|
|
2014-03-09 13:49:35 +01:00
|
|
|
bool ClientAdapter::OnKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event)
|
|
|
|
|
{
|
2015-08-17 10:51:24 +10:00
|
|
|
auto handler = _browserControl->KeyboardHandler;
|
2015-06-11 12:24:32 +10:00
|
|
|
|
2015-08-17 12:07:08 +10:00
|
|
|
if (handler == nullptr)
|
2015-05-29 01:33:44 -04:00
|
|
|
{
|
2015-08-17 12:07:08 +10:00
|
|
|
return false;
|
2015-05-29 01:33:44 -04:00
|
|
|
}
|
2015-08-17 12:07:08 +10:00
|
|
|
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
|
|
|
|
|
return handler->OnKeyEvent(
|
|
|
|
|
_browserControl, browserWrapper, (KeyType)event.type, event.windows_key_code,
|
|
|
|
|
event.native_key_code,
|
|
|
|
|
(CefEventFlags)event.modifiers, event.is_system_key == 1);
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
2014-06-10 16:57:45 +10:00
|
|
|
bool ClientAdapter::OnPreKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event, bool* is_keyboard_shortcut)
|
|
|
|
|
{
|
2015-08-17 10:51:24 +10:00
|
|
|
auto handler = _browserControl->KeyboardHandler;
|
2015-07-22 15:36:44 +10:00
|
|
|
|
2015-08-17 12:07:08 +10:00
|
|
|
if (handler == nullptr)
|
2015-05-29 01:33:44 -04:00
|
|
|
{
|
2015-08-17 12:07:08 +10:00
|
|
|
return false;
|
|
|
|
|
}
|
2015-06-08 22:48:29 -04:00
|
|
|
|
2015-08-17 12:07:08 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
|
|
|
|
|
return handler->OnPreKeyEvent(
|
|
|
|
|
_browserControl, browserWrapper, (KeyType)event.type, event.windows_key_code,
|
|
|
|
|
event.native_key_code, (CefEventFlags)event.modifiers, event.is_system_key == 1,
|
|
|
|
|
*is_keyboard_shortcut);
|
2014-06-10 16:57:45 +10:00
|
|
|
}
|
|
|
|
|
|
2014-03-09 13:49:35 +01:00
|
|
|
void ClientAdapter::OnLoadStart(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame)
|
|
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
CefFrameWrapper frameWrapper(frame);
|
|
|
|
|
|
|
|
|
|
if (!browser->IsPopup())
|
2014-03-09 13:49:35 +01:00
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
_browserControl->OnFrameLoadStart(gcnew FrameLoadStartEventArgs(browserWrapper, %frameWrapper));
|
2015-05-20 22:59:43 -04:00
|
|
|
}
|
2015-08-17 11:54:40 +10:00
|
|
|
|
|
|
|
|
auto handler = _browserControl->LoadHandler;
|
|
|
|
|
if (handler != nullptr)
|
2015-05-20 22:59:43 -04:00
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
handler->OnFrameLoadStart(_browserControl, gcnew FrameLoadStartEventArgs(browserWrapper, %frameWrapper));
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnLoadEnd(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, int httpStatusCode)
|
|
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
CefFrameWrapper frameWrapper(frame);
|
2015-07-22 15:36:44 +10:00
|
|
|
|
2015-08-17 11:54:40 +10:00
|
|
|
if (!browser->IsPopup())
|
2015-05-20 22:59:43 -04:00
|
|
|
{
|
2015-06-17 18:14:07 -04:00
|
|
|
_browserControl->OnFrameLoadEnd(gcnew FrameLoadEndEventArgs(browserWrapper, %frameWrapper, httpStatusCode));
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
2015-08-17 11:54:40 +10:00
|
|
|
|
|
|
|
|
auto handler = _browserControl->LoadHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
handler->OnFrameLoadEnd(_browserControl, gcnew FrameLoadEndEventArgs(browserWrapper, %frameWrapper, httpStatusCode));
|
|
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnLoadError(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, ErrorCode errorCode, const CefString& errorText, const CefString& failedUrl)
|
|
|
|
|
{
|
2015-08-17 11:54:40 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
CefFrameWrapper frameWrapper(frame);
|
2015-07-22 15:36:44 +10:00
|
|
|
|
2015-08-17 11:54:40 +10:00
|
|
|
if (!browser->IsPopup())
|
2015-05-20 22:59:43 -04:00
|
|
|
{
|
2015-08-13 21:33:23 +10:00
|
|
|
_browserControl->OnLoadError(gcnew LoadErrorEventArgs(browserWrapper, %frameWrapper,
|
|
|
|
|
(CefErrorCode)errorCode, StringUtils::ToClr(errorText), StringUtils::ToClr(failedUrl)));
|
2015-05-20 22:59:43 -04:00
|
|
|
}
|
2015-08-17 11:54:40 +10:00
|
|
|
|
|
|
|
|
auto handler = _browserControl->LoadHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
handler->OnLoadError(_browserControl,
|
|
|
|
|
gcnew LoadErrorEventArgs(browserWrapper, %frameWrapper, (CefErrorCode)errorCode, StringUtils::ToClr(errorText), StringUtils::ToClr(failedUrl)));
|
|
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
2014-11-18 12:05:55 +10:00
|
|
|
bool ClientAdapter::OnBeforeBrowse(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, bool isRedirect)
|
2014-03-09 13:49:35 +01:00
|
|
|
{
|
2015-08-17 11:03:30 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
2015-06-11 12:24:32 +10:00
|
|
|
|
2015-08-17 12:07:08 +10:00
|
|
|
if (handler == nullptr)
|
2015-05-29 01:33:44 -04:00
|
|
|
{
|
2015-08-17 12:07:08 +10:00
|
|
|
return false;
|
|
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
|
2015-08-17 12:07:08 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
CefFrameWrapper frameWrapper(frame);
|
|
|
|
|
CefRequestWrapper requestWrapper(request);
|
2015-06-11 11:21:55 +10:00
|
|
|
|
2015-08-17 12:07:08 +10:00
|
|
|
return handler->OnBeforeBrowse(_browserControl, browserWrapper, %frameWrapper, %requestWrapper, isRedirect);
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
2015-08-19 18:59:46 +10:00
|
|
|
bool ClientAdapter::OnOpenURLFromTab(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, const CefString& targetUrl,
|
|
|
|
|
CefRequestHandler::WindowOpenDisposition targetDisposition, bool userGesture)
|
|
|
|
|
{
|
|
|
|
|
auto handler = _browserControl->RequestHandler;
|
|
|
|
|
|
|
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
CefFrameWrapper frameWrapper(frame);
|
|
|
|
|
|
|
|
|
|
return handler->OnOpenUrlFromTab(_browserControl, browserWrapper, %frameWrapper, StringUtils::ToClr(targetUrl), (CefSharp::WindowOpenDisposition)targetDisposition, userGesture);
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-28 14:04:35 +10:00
|
|
|
bool ClientAdapter::OnCertificateError(CefRefPtr<CefBrowser> browser, cef_errorcode_t cert_error, const CefString& request_url, CefRefPtr<CefSSLInfo> ssl_info, CefRefPtr<CefRequestCallback> callback)
|
2014-11-25 15:51:55 -05:00
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
2015-07-22 15:36:44 +10:00
|
|
|
|
2014-11-25 15:51:55 -05:00
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-07 11:21:55 +10:00
|
|
|
// If callback is empty the error cannot be recovered from and the request will be canceled automatically.
|
|
|
|
|
// Still notify the user of the certificate error just don't provide a callback.
|
2015-06-05 15:44:25 +10:00
|
|
|
auto requestCallback = callback == NULL ? nullptr : gcnew CefRequestCallbackWrapper(callback);
|
2015-07-22 15:36:44 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-11 12:24:32 +10:00
|
|
|
|
2015-08-11 11:08:32 +10:00
|
|
|
return handler->OnCertificateError(_browserControl, browserWrapper, (CefErrorCode)cert_error, StringUtils::ToClr(request_url), nullptr, requestCallback);
|
2014-11-25 15:51:55 -05:00
|
|
|
}
|
|
|
|
|
|
2015-04-28 14:04:35 +10:00
|
|
|
bool ClientAdapter::OnQuotaRequest(CefRefPtr<CefBrowser> browser, const CefString& originUrl, int64 newSize, CefRefPtr<CefRequestCallback> callback)
|
2015-04-22 16:29:18 +10:00
|
|
|
{
|
2015-05-07 11:21:55 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
2015-07-22 15:36:44 +10:00
|
|
|
|
2015-04-22 16:29:18 +10:00
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2015-05-07 11:21:55 +10:00
|
|
|
|
2015-06-05 15:44:25 +10:00
|
|
|
auto requestCallback = gcnew CefRequestCallbackWrapper(callback);
|
2015-07-22 15:36:44 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-11 12:24:32 +10:00
|
|
|
|
|
|
|
|
return handler->OnQuotaRequest(_browserControl, browserWrapper, StringUtils::ToClr(originUrl), newSize, requestCallback);
|
2014-11-25 15:51:55 -05:00
|
|
|
}
|
|
|
|
|
|
2014-04-14 16:28:44 +02:00
|
|
|
// CEF3 API: public virtual bool OnBeforePluginLoad( CefRefPtr< CefBrowser > browser, const CefString& url, const CefString& policy_url, CefRefPtr< CefWebPluginInfo > info );
|
|
|
|
|
// ---
|
|
|
|
|
// return value:
|
|
|
|
|
// false: Load Plugin (do not block it)
|
|
|
|
|
// true: Ignore Plugin (Block it)
|
2015-01-08 11:40:53 +10:00
|
|
|
bool ClientAdapter::OnBeforePluginLoad(CefRefPtr<CefBrowser> browser, const CefString& url, const CefString& policy_url, CefRefPtr<CefWebPluginInfo> info)
|
2014-04-14 16:28:44 +02:00
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
2014-04-10 15:59:45 +02:00
|
|
|
|
|
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-08 11:40:53 +10:00
|
|
|
auto pluginInfo = TypeConversion::FromNative(info);
|
2015-07-22 15:36:44 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-11 12:24:32 +10:00
|
|
|
|
2015-06-11 11:49:02 +10:00
|
|
|
return handler->OnBeforePluginLoad(_browserControl, browserWrapper, StringUtils::ToClr(url), StringUtils::ToClr(policy_url), pluginInfo);
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
2014-05-27 00:02:01 +10:00
|
|
|
void ClientAdapter::OnPluginCrashed(CefRefPtr<CefBrowser> browser, const CefString& plugin_path)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
|
|
|
|
|
2014-05-27 00:02:01 +10:00
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
2015-07-22 15:36:44 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-11 12:24:32 +10:00
|
|
|
|
|
|
|
|
handler->OnPluginCrashed(_browserControl, browserWrapper, StringUtils::ToClr(plugin_path));
|
2015-06-17 18:14:07 -04:00
|
|
|
}
|
2014-05-27 00:02:01 +10:00
|
|
|
}
|
2014-05-25 13:36:34 +10:00
|
|
|
|
2015-08-17 13:59:48 +10:00
|
|
|
void ClientAdapter::OnRenderViewReady(CefRefPtr<CefBrowser> browser)
|
|
|
|
|
{
|
2015-08-17 14:22:57 +10:00
|
|
|
if (!Object::ReferenceEquals(_browserAdapter, nullptr))
|
|
|
|
|
{
|
|
|
|
|
auto objectRepository = _browserAdapter->JavascriptObjectRepository;
|
2015-08-18 09:29:50 +10:00
|
|
|
|
|
|
|
|
if (objectRepository->HasBoundObjects)
|
|
|
|
|
{
|
|
|
|
|
//transmit async bound objects
|
|
|
|
|
auto jsRootObjectMessage = CefProcessMessage::Create(kJavascriptRootObjectRequest);
|
|
|
|
|
auto argList = jsRootObjectMessage->GetArgumentList();
|
|
|
|
|
SerializeJsObject(objectRepository->AsyncRootObject, argList, 0);
|
|
|
|
|
SerializeJsObject(objectRepository->RootObject, argList, 1);
|
|
|
|
|
browser->SendProcessMessage(CefProcessId::PID_RENDERER, jsRootObjectMessage);
|
|
|
|
|
}
|
2015-08-17 14:22:57 +10:00
|
|
|
}
|
|
|
|
|
|
2015-08-17 13:59:48 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
|
|
|
|
|
handler->OnRenderViewReady(_browserControl, browserWrapper);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-12 14:16:39 +10:00
|
|
|
void ClientAdapter::OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser, TerminationStatus status)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
|
|
|
|
|
2014-06-12 14:16:39 +10:00
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
2015-07-22 15:36:44 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-11 12:24:32 +10:00
|
|
|
|
|
|
|
|
handler->OnRenderProcessTerminated(_browserControl, browserWrapper, (CefTerminationStatus)status);
|
2015-06-17 18:14:07 -04:00
|
|
|
}
|
2014-06-12 14:16:39 +10:00
|
|
|
}
|
|
|
|
|
|
2015-07-21 15:16:25 +10:00
|
|
|
void ClientAdapter::OnResourceRedirect(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, CefString& newUrl)
|
2015-04-22 16:59:02 +10:00
|
|
|
{
|
2015-08-17 11:03:30 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
2015-06-11 12:24:32 +10:00
|
|
|
|
2015-08-17 11:03:30 +10:00
|
|
|
if (handler != nullptr)
|
2015-06-03 00:14:43 -04:00
|
|
|
{
|
2015-08-17 11:03:30 +10:00
|
|
|
auto managedNewUrl = StringUtils::ToClr(newUrl);
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());;
|
|
|
|
|
CefFrameWrapper frameWrapper(frame);
|
|
|
|
|
CefRequestWrapper requestWrapper(request);
|
2015-06-03 00:14:43 -04:00
|
|
|
|
2015-08-17 11:03:30 +10:00
|
|
|
handler->OnResourceRedirect(_browserControl, browserWrapper, %frameWrapper, %requestWrapper, managedNewUrl);
|
2015-04-22 16:59:02 +10:00
|
|
|
|
2015-08-17 11:03:30 +10:00
|
|
|
newUrl = StringUtils::ToNative(managedNewUrl);
|
2015-06-03 00:14:43 -04:00
|
|
|
}
|
2015-04-22 17:07:55 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnProtocolExecution(CefRefPtr<CefBrowser> browser, const CefString& url, bool& allowOSExecution)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
|
|
|
|
|
2015-04-22 17:07:55 +10:00
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
2015-07-22 15:36:44 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-11 12:24:32 +10:00
|
|
|
|
|
|
|
|
allowOSExecution = handler->OnProtocolExecution(_browserControl, browserWrapper, StringUtils::ToClr(url));
|
2015-04-22 17:07:55 +10:00
|
|
|
}
|
2015-04-22 16:59:02 +10:00
|
|
|
}
|
|
|
|
|
|
2014-11-17 13:13:17 +10:00
|
|
|
// Called on the IO thread before a resource is loaded. To allow the resource
|
|
|
|
|
// to load normally return NULL. To specify a handler for the resource return
|
|
|
|
|
// a CefResourceHandler object. The |request| object should not be modified in
|
|
|
|
|
// this callback.
|
|
|
|
|
CefRefPtr<CefResourceHandler> ClientAdapter::GetResourceHandler(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request)
|
2014-03-09 13:49:35 +01:00
|
|
|
{
|
2015-03-02 23:07:40 -05:00
|
|
|
auto factory = _browserControl->ResourceHandlerFactory;
|
2014-03-09 13:49:35 +01:00
|
|
|
|
2015-03-12 12:38:23 +10:00
|
|
|
if (factory == nullptr || !factory->HasHandlers)
|
2014-03-09 13:49:35 +01:00
|
|
|
{
|
2014-11-17 13:22:47 +10:00
|
|
|
return NULL;
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
2015-07-22 15:36:44 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-29 14:03:10 +10:00
|
|
|
auto frameWrapper = gcnew CefFrameWrapper(frame);
|
2015-06-18 08:27:53 -04:00
|
|
|
auto requestWrapper = gcnew CefRequestWrapper(request);
|
|
|
|
|
|
2015-07-29 20:56:23 +10:00
|
|
|
auto handler = factory->GetResourceHandler(_browserControl, browserWrapper, frameWrapper, requestWrapper);
|
2014-03-09 13:49:35 +01:00
|
|
|
|
2015-07-29 20:56:23 +10:00
|
|
|
if (handler == nullptr)
|
2015-06-18 08:27:53 -04:00
|
|
|
{
|
|
|
|
|
// Clean up our disposables if our factory doesn't want
|
|
|
|
|
// this request.
|
|
|
|
|
delete frameWrapper;
|
|
|
|
|
delete requestWrapper;
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2015-06-11 12:24:32 +10:00
|
|
|
|
2015-07-29 20:56:23 +10:00
|
|
|
if (handler->GetType() == ResourceHandler::typeid)
|
2015-07-29 20:49:29 +10:00
|
|
|
{
|
2015-07-29 20:56:23 +10:00
|
|
|
auto resourceHandler = static_cast<ResourceHandler^>(handler);
|
|
|
|
|
if (resourceHandler->Type == ResourceHandlerType::File)
|
2015-07-29 20:49:29 +10:00
|
|
|
{
|
2015-07-29 20:56:23 +10:00
|
|
|
return new CefStreamResourceHandler(StringUtils::ToNative(resourceHandler->MimeType), CefStreamReader::CreateForFile(StringUtils::ToNative(resourceHandler->FilePath)));
|
2015-07-29 20:49:29 +10:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-18 08:27:53 -04:00
|
|
|
// No need to pass browserWrapper for disposable lifetime management here
|
|
|
|
|
// because GetBrowserWrapper returned IBrowser^s are already properly
|
|
|
|
|
// managed.
|
2015-07-29 20:56:23 +10:00
|
|
|
return new ResourceHandlerWrapper(handler, nullptr, frameWrapper, requestWrapper);
|
2014-11-17 13:22:47 +10:00
|
|
|
}
|
|
|
|
|
|
2015-04-28 14:04:35 +10:00
|
|
|
cef_return_value_t ClientAdapter::OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, CefRefPtr<CefRequestCallback> callback)
|
2014-11-17 13:22:47 +10:00
|
|
|
{
|
2015-08-17 11:03:30 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
2015-06-17 18:14:07 -04:00
|
|
|
|
2015-08-17 12:07:08 +10:00
|
|
|
if (handler == nullptr)
|
2015-06-03 00:14:43 -04:00
|
|
|
{
|
2015-08-17 12:07:08 +10:00
|
|
|
return cef_return_value_t::RV_CONTINUE;
|
|
|
|
|
}
|
2015-07-22 15:36:44 +10:00
|
|
|
|
2015-08-17 12:07:08 +10:00
|
|
|
auto frameWrapper = gcnew CefFrameWrapper(frame);
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
auto requestWrapper = gcnew CefRequestWrapper(request);
|
|
|
|
|
auto requestCallback = gcnew CefRequestCallbackWrapper(callback, frameWrapper, requestWrapper);
|
2015-08-17 11:03:30 +10:00
|
|
|
|
2015-08-17 12:07:08 +10:00
|
|
|
return (cef_return_value_t)handler->OnBeforeResourceLoad(_browserControl, browserWrapper, frameWrapper, requestWrapper, requestCallback);
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ClientAdapter::GetAuthCredentials(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, bool isProxy,
|
|
|
|
|
const CefString& host, int port, const CefString& realm, const CefString& scheme, CefRefPtr<CefAuthCallback> callback)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->RequestHandler;
|
2015-07-22 15:36:44 +10:00
|
|
|
|
2014-03-09 13:49:35 +01:00
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-29 14:03:10 +10:00
|
|
|
auto frameWrapper = gcnew CefFrameWrapper(frame);
|
2015-06-17 18:14:07 -04:00
|
|
|
auto callbackWrapper = gcnew CefAuthCallbackWrapper(callback, frameWrapper);
|
2014-03-09 13:49:35 +01:00
|
|
|
|
2015-06-11 09:45:55 +10:00
|
|
|
return handler->GetAuthCredentials(
|
2015-06-17 18:14:07 -04:00
|
|
|
_browserControl, browserWrapper, frameWrapper, isProxy,
|
2015-06-08 22:48:29 -04:00
|
|
|
StringUtils::ToClr(host), port, StringUtils::ToClr(realm),
|
2015-06-11 09:45:55 +10:00
|
|
|
StringUtils::ToClr(scheme), callbackWrapper);
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnBeforeContextMenu(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,
|
|
|
|
|
CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->MenuHandler;
|
2015-07-22 15:36:44 +10:00
|
|
|
|
2015-08-17 13:33:27 +10:00
|
|
|
if (handler != nullptr)
|
2014-11-05 12:10:04 +10:00
|
|
|
{
|
2015-08-17 13:33:27 +10:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
CefFrameWrapper frameWrapper(frame);
|
|
|
|
|
CefContextMenuParamsWrapper contextMenuParamsWrapper(params);
|
|
|
|
|
CefMenuModelWrapper menuModelWrapper(model);
|
|
|
|
|
|
|
|
|
|
handler->OnBeforeContextMenu(_browserControl, browserWrapper, %frameWrapper, %contextMenuParamsWrapper, %menuModelWrapper);
|
2015-08-17 13:40:56 +10:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ClientAdapter::OnContextMenuCommand(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,
|
|
|
|
|
CefRefPtr<CefContextMenuParams> params, int commandId, EventFlags eventFlags)
|
|
|
|
|
{
|
|
|
|
|
auto handler = _browserControl->MenuHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
CefFrameWrapper frameWrapper(frame);
|
|
|
|
|
CefContextMenuParamsWrapper contextMenuParamsWrapper(params);
|
|
|
|
|
|
|
|
|
|
return handler->OnContextMenuCommand(_browserControl, browserWrapper, %frameWrapper, %contextMenuParamsWrapper,
|
|
|
|
|
commandId, (CefEventFlags)eventFlags);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnContextMenuDismissed(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame)
|
|
|
|
|
{
|
|
|
|
|
auto handler = _browserControl->MenuHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
CefFrameWrapper frameWrapper(frame);
|
|
|
|
|
|
|
|
|
|
handler->OnContextMenuDismissed(_browserControl, browserWrapper, %frameWrapper);
|
|
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
2014-04-29 11:51:56 +10:00
|
|
|
void ClientAdapter::OnGotFocus(CefRefPtr<CefBrowser> browser)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->FocusHandler;
|
2014-11-25 22:29:35 +11:00
|
|
|
|
|
|
|
|
if (handler == nullptr)
|
2014-11-25 22:33:12 +11:00
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
2014-11-25 22:29:35 +11:00
|
|
|
|
2015-06-08 22:48:29 -04:00
|
|
|
// NOTE: a popup handler for OnGotFocus doesn't make sense yet because
|
|
|
|
|
// non-offscreen windows don't wrap popup browser's yet.
|
|
|
|
|
if (!browser->IsPopup())
|
|
|
|
|
{
|
|
|
|
|
handler->OnGotFocus();
|
|
|
|
|
}
|
2014-04-29 11:51:56 +10:00
|
|
|
}
|
|
|
|
|
|
2014-11-25 22:29:35 +11:00
|
|
|
bool ClientAdapter::OnSetFocus(CefRefPtr<CefBrowser> browser, FocusSource source)
|
2014-04-29 11:51:56 +10:00
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->FocusHandler;
|
2014-07-09 11:37:10 +10:00
|
|
|
|
2014-11-25 22:29:35 +11:00
|
|
|
if (handler == nullptr)
|
2014-11-25 22:33:12 +11:00
|
|
|
{
|
|
|
|
|
// Allow the focus to be set by default.
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2014-11-25 22:29:35 +11:00
|
|
|
|
2015-06-08 22:48:29 -04:00
|
|
|
// NOTE: a popup handler for OnGotFocus doesn't make sense yet because
|
|
|
|
|
// non-offscreen windows don't wrap popup browser's yet.
|
|
|
|
|
if (!browser->IsPopup())
|
|
|
|
|
{
|
|
|
|
|
return handler->OnSetFocus((CefFocusSource)source);
|
|
|
|
|
}
|
|
|
|
|
// Allow the focus to be set by default.
|
|
|
|
|
return false;
|
2014-04-29 11:51:56 +10:00
|
|
|
}
|
|
|
|
|
|
2014-03-09 13:49:35 +01:00
|
|
|
void ClientAdapter::OnTakeFocus(CefRefPtr<CefBrowser> browser, bool next)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->FocusHandler;
|
2014-11-25 22:29:35 +11:00
|
|
|
|
|
|
|
|
if (handler == nullptr)
|
2014-11-25 22:33:12 +11:00
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
2014-11-25 22:29:35 +11:00
|
|
|
|
2015-06-08 22:48:29 -04:00
|
|
|
// NOTE: a popup handler for OnGotFocus doesn't make sense yet because
|
|
|
|
|
// non-offscreen windows don't wrap popup browser's yet.
|
|
|
|
|
if (!browser->IsPopup())
|
|
|
|
|
{
|
|
|
|
|
handler->OnTakeFocus(next);
|
|
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ClientAdapter::OnJSDialog(CefRefPtr<CefBrowser> browser, const CefString& origin_url, const CefString& accept_lang,
|
|
|
|
|
JSDialogType dialog_type, const CefString& message_text, const CefString& default_prompt_text,
|
|
|
|
|
CefRefPtr<CefJSDialogCallback> callback, bool& suppress_message)
|
|
|
|
|
{
|
2015-05-07 12:53:36 +10:00
|
|
|
auto handler = _browserControl->JsDialogHandler;
|
2014-03-09 13:49:35 +01:00
|
|
|
|
|
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-05 15:44:25 +10:00
|
|
|
auto callbackWrapper = gcnew CefJSDialogCallbackWrapper(callback);
|
2015-06-17 18:14:07 -04:00
|
|
|
return handler->OnJSDialog(_browserControl, browserWrapper,
|
2015-06-08 22:48:29 -04:00
|
|
|
StringUtils::ToClr(origin_url), StringUtils::ToClr(accept_lang), (CefJsDialogType)dialog_type,
|
2015-06-11 09:45:55 +10:00
|
|
|
StringUtils::ToClr(message_text), StringUtils::ToClr(default_prompt_text), callbackWrapper, suppress_message);
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
2014-04-29 13:31:39 +01:00
|
|
|
|
2014-12-25 21:54:09 -06:00
|
|
|
bool ClientAdapter::OnBeforeUnloadDialog(CefRefPtr<CefBrowser> browser, const CefString& message_text, bool is_reload, CefRefPtr<CefJSDialogCallback> callback)
|
2014-12-25 14:07:42 -06:00
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->JsDialogHandler;
|
2014-12-25 14:07:42 -06:00
|
|
|
|
|
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-05 15:44:25 +10:00
|
|
|
auto callbackWrapper = gcnew CefJSDialogCallbackWrapper(callback);
|
2014-12-25 14:07:42 -06:00
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
return handler->OnJSBeforeUnload(_browserControl, browserWrapper, StringUtils::ToClr(message_text), is_reload, callbackWrapper);
|
2014-12-25 14:07:42 -06:00
|
|
|
}
|
|
|
|
|
|
2015-08-17 13:16:45 +10:00
|
|
|
void ClientAdapter::OnResetDialogState(CefRefPtr<CefBrowser> browser)
|
|
|
|
|
{
|
|
|
|
|
auto handler = _browserControl->JsDialogHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
|
|
|
|
|
handler->OnResetDialogState(_browserControl, browserWrapper);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnDialogClosed(CefRefPtr<CefBrowser> browser)
|
|
|
|
|
{
|
|
|
|
|
auto handler = _browserControl->JsDialogHandler;
|
|
|
|
|
|
|
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
|
|
|
|
|
handler->OnDialogClosed(_browserControl, browserWrapper);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-02 15:21:47 +10:00
|
|
|
bool ClientAdapter::OnFileDialog(CefRefPtr<CefBrowser> browser, FileDialogMode mode, const CefString& title,
|
2015-03-18 11:13:49 +10:00
|
|
|
const CefString& default_file_path, const std::vector<CefString>& accept_filters, int selected_accept_filter,
|
|
|
|
|
CefRefPtr<CefFileDialogCallback> callback)
|
2014-06-02 15:21:47 +10:00
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->DialogHandler;
|
2014-06-02 15:21:47 +10:00
|
|
|
|
|
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-01 16:27:42 +10:00
|
|
|
auto callbackWrapper = gcnew CefFileDialogCallbackWrapper(callback);
|
2014-06-02 15:21:47 +10:00
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
return handler->OnFileDialog(_browserControl, browserWrapper, (CefFileDialogMode)mode, StringUtils::ToClr(title), StringUtils::ToClr(default_file_path), StringUtils::ToClr(accept_filters), selected_accept_filter, callbackWrapper);
|
2014-06-02 15:21:47 +10:00
|
|
|
}
|
2014-11-28 08:42:20 -06:00
|
|
|
|
2014-11-28 11:32:27 -06:00
|
|
|
bool ClientAdapter::OnDragEnter(CefRefPtr<CefBrowser> browser, CefRefPtr<CefDragData> dragData, DragOperationsMask mask)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->DragHandler;
|
2014-11-28 11:32:27 -06:00
|
|
|
|
|
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
2014-11-30 08:35:31 +10:00
|
|
|
return false;
|
2014-11-28 11:32:27 -06:00
|
|
|
}
|
|
|
|
|
|
2015-06-11 12:25:38 +10:00
|
|
|
CefDragDataWrapper dragDataWrapper(dragData);
|
2015-06-17 18:14:07 -04:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2014-12-08 22:08:38 +10:00
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
return handler->OnDragEnter(_browserControl, browserWrapper, %dragDataWrapper, (CefSharp::DragOperationsMask)mask);
|
2014-11-28 11:32:27 -06:00
|
|
|
}
|
2015-01-26 14:16:46 -08:00
|
|
|
|
|
|
|
|
bool ClientAdapter::OnRequestGeolocationPermission(CefRefPtr<CefBrowser> browser, const CefString& requesting_url, int request_id, CefRefPtr<CefGeolocationCallback> callback)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto handler = _browserControl->GeolocationHandler;
|
2015-07-22 15:36:44 +10:00
|
|
|
|
2015-01-26 14:16:46 -08:00
|
|
|
if (handler == nullptr)
|
|
|
|
|
{
|
|
|
|
|
// Default deny, as CEF does.
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-01 11:56:50 +10:00
|
|
|
auto callbackWrapper = gcnew CefGeolocationCallbackWrapper(callback);
|
2015-01-26 14:16:46 -08:00
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
return handler->OnRequestGeolocationPermission(_browserControl, browserWrapper, StringUtils::ToClr(requesting_url), request_id, callbackWrapper);
|
2015-01-26 14:16:46 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnCancelGeolocationPermission(CefRefPtr<CefBrowser> browser, const CefString& requesting_url, int request_id)
|
|
|
|
|
{
|
2015-07-22 15:36:44 +10:00
|
|
|
auto handler = _browserControl->GeolocationHandler;
|
2015-06-11 11:21:55 +10:00
|
|
|
|
2015-01-26 14:16:46 -08:00
|
|
|
if (handler != nullptr)
|
|
|
|
|
{
|
2015-06-17 18:14:07 -04:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
|
|
|
|
handler->OnCancelGeolocationPermission(_browserControl, browserWrapper, StringUtils::ToClr(requesting_url), request_id);
|
2015-01-26 14:16:46 -08:00
|
|
|
}
|
|
|
|
|
}
|
2015-06-01 10:49:14 +10:00
|
|
|
|
|
|
|
|
void ClientAdapter::OnBeforeDownload(CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item,
|
|
|
|
|
const CefString& suggested_name, CefRefPtr<CefBeforeDownloadCallback> callback)
|
|
|
|
|
{
|
|
|
|
|
auto handler = _browserControl->DownloadHandler;
|
|
|
|
|
|
|
|
|
|
if(handler != nullptr)
|
|
|
|
|
{
|
|
|
|
|
auto downloadItem = TypeConversion::FromNative(download_item);
|
|
|
|
|
downloadItem->SuggestedFileName = StringUtils::ToClr(suggested_name);
|
|
|
|
|
|
2015-06-01 11:48:12 +10:00
|
|
|
auto callbackWrapper = gcnew CefBeforeDownloadCallbackWrapper(callback);
|
2015-06-17 18:14:07 -04:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-01 11:48:12 +10:00
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
handler->OnBeforeDownload(browserWrapper, downloadItem, callbackWrapper);
|
2015-06-01 10:49:14 +10:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void ClientAdapter::OnDownloadUpdated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item,
|
|
|
|
|
CefRefPtr<CefDownloadItemCallback> callback)
|
|
|
|
|
{
|
|
|
|
|
auto handler = _browserControl->DownloadHandler;
|
|
|
|
|
|
|
|
|
|
if(handler != nullptr)
|
|
|
|
|
{
|
2015-06-11 11:21:55 +10:00
|
|
|
auto callbackWrapper = gcnew CefDownloadItemCallbackWrapper(callback);
|
2015-06-17 18:14:07 -04:00
|
|
|
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
|
2015-06-11 11:21:55 +10:00
|
|
|
|
2015-06-17 18:14:07 -04:00
|
|
|
handler->OnDownloadUpdated(browserWrapper, TypeConversion::FromNative(download_item), callbackWrapper);
|
2015-06-01 10:49:14 +10:00
|
|
|
}
|
|
|
|
|
}
|
2015-06-27 17:01:51 +02:00
|
|
|
|
|
|
|
|
bool ClientAdapter::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message)
|
|
|
|
|
{
|
2015-06-29 15:08:53 +10:00
|
|
|
auto handled = false;
|
|
|
|
|
auto name = message->GetName();
|
2015-07-14 10:59:10 +02:00
|
|
|
auto argList = message->GetArgumentList();
|
2015-08-17 14:29:50 +10:00
|
|
|
IJavascriptCallbackFactory^ callbackFactory = _browserAdapter->JavascriptCallbackFactory;
|
2015-07-14 10:59:10 +02:00
|
|
|
|
2015-07-07 08:12:04 +02:00
|
|
|
if (name == kEvaluateJavascriptResponse || name == kJavascriptCallbackResponse)
|
2015-06-27 17:01:51 +02:00
|
|
|
{
|
2015-06-29 15:08:53 +10:00
|
|
|
auto success = argList->GetBool(0);
|
|
|
|
|
auto callbackId = GetInt64(argList, 1);
|
|
|
|
|
|
|
|
|
|
auto pendingTask = _pendingTaskRepository->RemovePendingTask(callbackId);
|
|
|
|
|
if (pendingTask != nullptr)
|
|
|
|
|
{
|
|
|
|
|
auto response = gcnew JavascriptResponse();
|
|
|
|
|
response->Success = success;
|
|
|
|
|
|
|
|
|
|
if (success)
|
|
|
|
|
{
|
2015-08-06 10:25:33 +02:00
|
|
|
response->Result = DeserializeObject(argList, 2, callbackFactory);
|
2015-06-29 15:08:53 +10:00
|
|
|
}
|
2015-07-08 18:27:32 +02:00
|
|
|
else
|
2015-06-29 15:08:53 +10:00
|
|
|
{
|
|
|
|
|
response->Message = StringUtils::ToClr(argList->GetString(2));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pendingTask->SetResult(response);
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-14 10:59:10 +02:00
|
|
|
handled = true;
|
|
|
|
|
}
|
2015-07-29 11:11:09 +02:00
|
|
|
else if (name == kJavascriptAsyncMethodCallRequest)
|
2015-07-14 10:59:10 +02:00
|
|
|
{
|
|
|
|
|
if (!browser->IsPopup())
|
|
|
|
|
{
|
|
|
|
|
auto objectId = GetInt64(argList, 0);
|
2015-07-14 12:43:59 +02:00
|
|
|
auto callbackId = GetInt64(argList, 1);
|
|
|
|
|
auto methodName = StringUtils::ToClr(argList->GetString(2));
|
|
|
|
|
auto arguments = argList->GetList(3);
|
|
|
|
|
auto methodInvocation = gcnew MethodInvocation(objectId, methodName, (callbackId > 0 ? Nullable<int64>(callbackId) : Nullable<int64>()));
|
2015-07-14 10:59:10 +02:00
|
|
|
for (auto i = 0; i < arguments->GetSize(); i++)
|
|
|
|
|
{
|
2015-08-06 10:25:33 +02:00
|
|
|
methodInvocation->Parameters->Add(DeserializeObject(arguments, i, callbackFactory));
|
2015-07-14 10:59:10 +02:00
|
|
|
}
|
2015-07-14 11:08:06 +02:00
|
|
|
|
|
|
|
|
_browserAdapter->MethodRunnerQueue->Enqueue(methodInvocation);
|
2015-07-14 10:59:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2015-06-29 15:08:53 +10:00
|
|
|
handled = true;
|
2015-06-27 17:01:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return handled;
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-09 12:01:44 +10:00
|
|
|
Task<JavascriptResponse^>^ ClientAdapter::EvaluateScriptAsync(int browserId, bool isBrowserPopup, int64 frameId, String^ script, Nullable<TimeSpan> timeout)
|
2015-06-27 18:24:32 +02:00
|
|
|
{
|
2015-06-29 15:08:53 +10:00
|
|
|
//create a new taskcompletionsource
|
|
|
|
|
auto idAndComplectionSource = _pendingTaskRepository->CreatePendingTask(timeout);
|
|
|
|
|
|
|
|
|
|
auto message = CefProcessMessage::Create(kEvaluateJavascriptRequest);
|
|
|
|
|
auto argList = message->GetArgumentList();
|
2015-07-09 12:01:44 +10:00
|
|
|
SetInt64(frameId, argList, 0);
|
|
|
|
|
SetInt64(idAndComplectionSource.Key, argList, 1);
|
|
|
|
|
argList->SetString(2, StringUtils::ToNative(script));
|
2015-06-29 15:08:53 +10:00
|
|
|
|
2015-07-09 12:01:44 +10:00
|
|
|
auto browserWrapper = static_cast<CefSharpBrowserWrapper^>(GetBrowserWrapper(browserId, isBrowserPopup));
|
|
|
|
|
|
2015-07-09 23:36:31 +02:00
|
|
|
browserWrapper->SendProcessMessage(CefProcessId::PID_RENDERER, message);
|
2015-06-29 15:08:53 +10:00
|
|
|
|
|
|
|
|
return idAndComplectionSource.Value->Task;
|
2015-06-27 18:24:32 +02:00
|
|
|
}
|
2015-07-07 19:10:20 +02:00
|
|
|
|
|
|
|
|
PendingTaskRepository<JavascriptResponse^>^ ClientAdapter::GetPendingTaskRepository()
|
|
|
|
|
{
|
|
|
|
|
return _pendingTaskRepository;
|
|
|
|
|
}
|
2015-07-14 12:43:59 +02:00
|
|
|
|
|
|
|
|
void ClientAdapter::MethodInvocationComplete(MethodInvocationResult^ result)
|
|
|
|
|
{
|
|
|
|
|
if (result->CallbackId.HasValue)
|
|
|
|
|
{
|
2015-07-29 11:11:09 +02:00
|
|
|
auto message = CefProcessMessage::Create(kJavascriptAsyncMethodCallResponse);
|
2015-07-14 12:43:59 +02:00
|
|
|
auto argList = message->GetArgumentList();
|
|
|
|
|
SetInt64(result->CallbackId.Value, argList, 0);
|
|
|
|
|
argList->SetBool(1, result->Success);
|
|
|
|
|
if (result->Success)
|
|
|
|
|
{
|
|
|
|
|
SerializeV8Object(result->Result, argList, 2);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
argList->SetString(2, StringUtils::ToNative(result->Message));
|
|
|
|
|
}
|
|
|
|
|
_cefBrowser->SendProcessMessage(CefProcessId::PID_RENDERER, message);
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-03-09 13:49:35 +01:00
|
|
|
}
|
|
|
|
|
}
|