SIGN IN SIGN UP
cefsharp / CefSharp UNCLAIMED

.NET (WPF and Windows Forms) bindings for the Chromium Embedded Framework

0 0 1 C#
// Copyright © 2015 The CefSharp Authors. All rights reserved.
2015-05-02 23:32:22 -04:00
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#include "Stdafx.h"
#include <msclr/lock.h>
2015-05-02 23:32:22 -04:00
#include "UrlRequest.h"
#include "Request.h"
#include "Internals\CefBrowserWrapper.h"
#include "Internals\CefFrameWrapper.h"
#include "Internals\CefStringVisitorAdapter.h"
#include "Internals\ClientAdapter.h"
#include "Internals\Serialization\Primitives.h"
#include "Internals\Messaging\Messages.h"
#include "Internals\CefURLRequestClientAdapter.h"
Refactor CefSharp.Core into CefSharp.Core.Runtime (#3311) * Net Core - Rename CefSharp.Core.dll to CefSharp.Core.Runtime.dll Partial rename, only Net Core, folder not renamed * Net Core - Rename CefSharp.Core.RefAssembly to CefSharp.Core.netcore Remove GenApi * Core - Rename CefDragDataWrapper to DragData Move into CefSharp.Core namespace * WinForms/WPF/OffScreen - Migrate from GitLink command line to Nuget package * Net Core - Refactor to have CefSharp.Core.dll contain only public Api * Net Core - Remove CefSharp.Core.RefAssembly * Net Core - Change CefSharp.Core.netcore output folder * Net Core - Restructure nuget packages * Net Core - Add Cefsharp.Core.Runtime.RefAssembly * Net Core - Hide CLI/C++ classes from intellisense Make sure users don't attempt to load them directly * Rename CefSharp.Core to CefSharp.Core.Runtime * Core - Restructure Net 4.5.2 packages to use CefSharp.Core.dll anycpu variant Attempt to load CefSharp.Core.Runtime at runtime rather than having to use msbuild to copy the correct version * Rename CefSharp.Core.netcore to CefSharp.Core * WPF/WinForms/OffScreen - Change from x86/64 to AnyCPU As they are all managed assemblies they can target AnyCPU. Includes CefSharp.dll * Convert RequestContextBuilder from C++ to C# Now part of the CefSharp.Core PublicApi * Update version number to 87.1.11 * Migrate more of the public Api to C# * Net Core - Basic restructure complete * Net Core - ModuleInitializer (Doesn't work yet) * Remove direct references to BrowserSettings * Net Core - ModuleInitializer load CefShar.Core.Runtime.dl * Net Core - Load libcef.dll via CLR Module initializer If no RID is specified then we can load libcef.dll using the module initializer * Add version to CefSharp.Core * Remove dependency on CefSharp.Core.Runtime Rewrite common targets * AnyCPU app.config transform Improve AnyCPU support * Improve Net Core 3 support Only delete CefSharp.Core.Runtime.dll when AnyCPU * Nuget - Add CefSharp.Core.Runtime reference when TargetFramework = NetCore * Fix Typos Based on #3306 * Net Core - Rename CefSharp.Core.Runtime RefAssembly source file * Net Full - Generate CefSharp.Core.Runtime Ref Assembly For now the powershell build script generates the .cs file based on a x86 release build.ps1 It's not possible to directly install GenApi as it requires a Sdk style project * Net Core - Old packages copy files to required folders * Test - Install newer .Net Compiler and set Lang Version to 7.3 * Net Core - Exclude Net 452 Runtime generated reference source * Core - Add Refactoring TODO * Ref Assembly - Generate source as part of build - Move ref assembly source generate into GenerateRefAssemblySource.ps1 - Call before project build Runs locally, see if Appveyor has a problem with the powershell script execution * Core - Add more factory methods to create instances of managed wrappers * Net Core - Make Initialzier properties internal Not quite sure what the public API should look like as yet, so making internal for now.
2020-12-16 10:47:34 +10:00
using namespace CefSharp::Core;
using namespace CefSharp::Internals::Messaging;
using namespace CefSharp::Internals::Serialization;
2015-05-02 23:32:22 -04:00
///
// True if this object is currently attached to a valid frame.
///
/*--cef()--*/
2015-05-04 19:15:57 -04:00
bool CefFrameWrapper::IsValid::get()
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
2015-05-02 23:32:22 -04:00
return _frame->IsValid();
}
///
// Execute undo in this frame.
///
/*--cef()--*/
void CefFrameWrapper::Undo()
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
_frame->Undo();
}
///
// Execute redo in this frame.
///
/*--cef()--*/
void CefFrameWrapper::Redo()
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
_frame->Redo();
}
///
// Execute cut in this frame.
///
/*--cef()--*/
void CefFrameWrapper::Cut()
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
_frame->Cut();
}
///
// Execute copy in this frame.
///
/*--cef()--*/
void CefFrameWrapper::Copy()
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
_frame->Copy();
}
///
// Execute paste in this frame.
///
/*--cef()--*/
void CefFrameWrapper::Paste()
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
_frame->Paste();
}
///
// Execute delete in this frame.
///
/*--cef(capi_name=del)--*/
void CefFrameWrapper::Delete()
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
_frame->Delete();
}
///
// Execute select all in this frame.
///
/*--cef()--*/
void CefFrameWrapper::SelectAll()
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
_frame->SelectAll();
}
///
// Save this frame's HTML source to a temporary file and open it in the
// default text viewing application. This method can only be called from the
// browser process.
///
/*--cef()--*/
void CefFrameWrapper::ViewSource()
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
_frame->ViewSource();
}
///
// Retrieve this frame's HTML source as a string sent to the specified
// visitor.
///
/*--cef()--*/
Task<String^>^ CefFrameWrapper::GetSourceAsync()
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
auto taskStringVisitor = gcnew TaskStringVisitor();
_frame->GetSource(new CefStringVisitorAdapter(taskStringVisitor));
return taskStringVisitor->Task;
2015-05-02 23:32:22 -04:00
}
///
// Retrieve this frame's HTML source as a string sent to the specified
// visitor.
///
/*--cef()--*/
void CefFrameWrapper::GetSource(IStringVisitor^ visitor)
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
_frame->GetSource(new CefStringVisitorAdapter(visitor));
}
2015-05-02 23:32:22 -04:00
///
// Retrieve this frame's display text as a string sent to the specified
// visitor.
///
/*--cef()--*/
Task<String^>^ CefFrameWrapper::GetTextAsync()
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
auto taskStringVisitor = gcnew TaskStringVisitor();
_frame->GetText(new CefStringVisitorAdapter(taskStringVisitor));
return taskStringVisitor->Task;
2015-05-02 23:32:22 -04:00
}
///
// Retrieve this frame's display text as a string sent to the specified
// visitor.
///
/*--cef()--*/
void CefFrameWrapper::GetText(IStringVisitor^ visitor)
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
_frame->GetText(new CefStringVisitorAdapter(visitor));
}
2015-05-02 23:32:22 -04:00
///
// Load the request represented by the |request| object.
///
/*--cef()--*/
void CefFrameWrapper::LoadRequest(IRequest^ request)
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
auto requestWrapper = (Request^)request->UnWrap();
_frame->LoadRequest(requestWrapper);
}
2015-05-02 23:32:22 -04:00
///
// Load the specified |url|.
///
/*--cef()--*/
void CefFrameWrapper::LoadUrl(String^ url)
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
_frame->LoadURL(StringUtils::ToNative(url));
}
///
// Execute a string of JavaScript code in this frame. The |script_url|
// parameter is the URL where the script in question can be found, if any.
// The renderer may request this URL to show the developer the source of the
// error. The |start_line| parameter is the base line number to use for error
// reporting.
///
/*--cef(optional_param=script_url)--*/
2015-05-04 18:39:17 -04:00
void CefFrameWrapper::ExecuteJavaScriptAsync(String^ code, String^ scriptUrl, int startLine)
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
_frame->ExecuteJavaScript(StringUtils::ToNative(code), StringUtils::ToNative(scriptUrl), startLine);
}
Task<JavascriptResponse^>^ CefFrameWrapper::EvaluateScriptAsync(String^ script, String^ scriptUrl, int startLine, Nullable<TimeSpan> timeout, bool useImmediatelyInvokedFuncExpression)
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
auto browser = _frame->GetBrowser();
auto host = browser->GetHost();
//If we're unable to get the underlying browser/browserhost then return null
if (!browser.get() || !host.get())
{
return nullptr;
}
auto client = static_cast<ClientAdapter*>(host->GetClient().get());
auto pendingTaskRepository = client->GetPendingTaskRepository();
//create a new taskcompletionsource
auto idAndComplectionSource = pendingTaskRepository->CreatePendingTask(timeout);
if (useImmediatelyInvokedFuncExpression)
{
script = "(function() { let cefSharpInternalCallbackId = " + idAndComplectionSource.Key + "; " + script + " })();";
}
auto message = CefProcessMessage::Create(kEvaluateJavascriptRequest);
auto argList = message->GetArgumentList();
SetInt64(argList, 0, idAndComplectionSource.Key);
argList->SetString(1, StringUtils::ToNative(script));
argList->SetString(2, StringUtils::ToNative(scriptUrl));
argList->SetInt(3, startLine);
_frame->SendProcessMessage(CefProcessId::PID_RENDERER, message);
return idAndComplectionSource.Value->Task;
2015-05-02 23:32:22 -04:00
}
///
// Returns true if this is the main (top-level) frame.
///
/*--cef()--*/
2015-05-04 19:15:57 -04:00
bool CefFrameWrapper::IsMain::get()
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
return _frame->IsMain();
}
///
// Returns true if this is the focused frame.
///
/*--cef()--*/
2015-05-04 19:15:57 -04:00
bool CefFrameWrapper::IsFocused::get()
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
return _frame->IsFocused();
}
///
// Returns the name for this frame. If the frame has an assigned name (for
// example, set via the iframe "name" attribute) then that value will be
// returned. Otherwise a unique name will be constructed based on the frame
// parent hierarchy. The main (top-level) frame will always have an empty name
// value.
///
/*--cef()--*/
2015-05-04 19:15:57 -04:00
String^ CefFrameWrapper::Name::get()
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
return StringUtils::ToClr(_frame->GetName());
}
///
// Returns the globally unique identifier for this frame.
///
/*--cef()--*/
2015-05-04 19:15:57 -04:00
Int64 CefFrameWrapper::Identifier::get()
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
2015-05-02 23:32:22 -04:00
return _frame->GetIdentifier();
}
///
// Returns the parent of this frame or NULL if this is the main (top-level)
// frame.
///
/*--cef()--*/
2015-05-04 19:15:57 -04:00
IFrame^ CefFrameWrapper::Parent::get()
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-06-08 22:48:29 -04:00
if (_parentFrame != nullptr)
2015-05-02 23:32:22 -04:00
{
return _parentFrame;
2015-06-08 22:48:29 -04:00
}
// Be paranoid about creating the cached IFrame.
msclr::lock sync(_syncRoot);
if (_parentFrame != nullptr)
2015-06-08 22:48:29 -04:00
{
return _parentFrame;
2015-05-02 23:32:22 -04:00
}
auto parent = _frame->GetParent();
if (parent == nullptr)
{
return nullptr;
}
_parentFrame = gcnew CefFrameWrapper(parent);
return _parentFrame;
2015-05-02 23:32:22 -04:00
}
///
// Returns the URL currently loaded in this frame.
///
/*--cef()--*/
2015-05-04 19:15:57 -04:00
String^ CefFrameWrapper::Url::get()
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-05-02 23:32:22 -04:00
return StringUtils::ToClr(_frame->GetURL());
}
///
// Returns the browser that this frame belongs to.
///
/*--cef()--*/
2015-05-04 19:15:57 -04:00
IBrowser^ CefFrameWrapper::Browser::get()
2015-05-02 23:32:22 -04:00
{
ThrowIfDisposed();
ThrowIfFrameInvalid();
2015-06-08 22:48:29 -04:00
if (_owningBrowser != nullptr)
{
return _owningBrowser;
}
// Be paranoid about creating the cached IBrowser.
msclr::lock sync(_syncRoot);
2015-06-08 22:48:29 -04:00
if (_owningBrowser != nullptr)
{
return _owningBrowser;
}
_owningBrowser = gcnew CefBrowserWrapper(_frame->GetBrowser());
2015-06-08 22:48:29 -04:00
return _owningBrowser;
}
IRequest^ CefFrameWrapper::CreateRequest(bool initializePostData)
{
auto request = CefRequest::Create();
if (initializePostData)
{
request->SetPostData(CefPostData::Create());
}
return gcnew Request(request);
}
IUrlRequest^ CefFrameWrapper::CreateUrlRequest(IRequest^ request, IUrlRequestClient^ client)
{
ThrowIfDisposed();
if (request == nullptr)
{
throw gcnew ArgumentNullException("request");
}
if (client == nullptr)
{
throw gcnew ArgumentNullException("client");
}
auto urlRequest = _frame->CreateURLRequest(
(Request^)request->UnWrap(),
new CefUrlRequestClientAdapter(client));
return gcnew UrlRequest(urlRequest);
}
void CefFrameWrapper::ThrowIfFrameInvalid()
{
if (_frame->IsValid() == false)
{
throw gcnew Exception(L"The underlying frame is no longer valid - please check the IsValid property before calling!");
}
}