// Copyright © 2021 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.
using System;
using System.Threading;
using System.Threading.Tasks;
namespace CefSharp
{
///
/// Interface for common events/methods/properties for ChromiumWebBrowser and popup host implementations.
///
///
public interface IChromiumWebBrowserBase : IDisposable
{
///
/// Event handler for receiving Javascript console messages being sent from web pages.
/// It's important to note this event is fired on a CEF UI thread, which by default is not the same as your application UI
/// thread. It is unwise to block on this thread for any length of time as your browser will become unresponsive and/or hang..
/// To access UI elements you'll need to Invoke/Dispatch onto the UI Thread.
/// (The exception to this is when you're running with settings.MultiThreadedMessageLoop = false, then they'll be the same thread).
///
event EventHandler ConsoleMessage;
///
/// Event handler for changes to the status message.
/// It's important to note this event is fired on a CEF UI thread, which by default is not the same as your application UI
/// thread. It is unwise to block on this thread for any length of time as your browser will become unresponsive and/or hang.
/// To access UI elements you'll need to Invoke/Dispatch onto the UI Thread.
/// (The exception to this is when you're running with settings.MultiThreadedMessageLoop = false, then they'll be the same thread).
///
event EventHandler StatusMessage;
///
/// Event handler that will get called when the browser begins loading a frame. Multiple frames may be loading at the same
/// time. Sub-frames may start or continue loading after the main frame load has ended. This method may not be called for a
/// particular frame if the load request for that frame fails. For notification of overall browser load status use
/// OnLoadingStateChange instead.
/// It's important to note this event is fired on a CEF UI thread, which by default is not the same as your application UI
/// thread. It is unwise to block on this thread for any length of time as your browser will become unresponsive and/or hang..
/// To access UI elements you'll need to Invoke/Dispatch onto the UI Thread.
///
/// Whilst this may seem like a logical place to execute js, it's called before the DOM has been loaded, implement
/// as it's called when the underlying V8Context is created
///
event EventHandler FrameLoadStart;
///
/// Event handler that will get called when the browser is done loading a frame. Multiple frames may be loading at the same
/// time. Sub-frames may start or continue loading after the main frame load has ended. This method will always be called
/// for all frames irrespective of whether the request completes successfully.
/// It's important to note this event is fired on a CEF UI thread, which by default is not the same as your application UI
/// thread. It is unwise to block on this thread for any length of time as your browser will become unresponsive and/or hang..
/// To access UI elements you'll need to Invoke/Dispatch onto the UI Thread.
///
event EventHandler FrameLoadEnd;
///
/// Event handler that will get called when the resource load for a navigation fails or is canceled.
/// It's important to note this event is fired on a CEF UI thread, which by default is not the same as your application UI
/// thread. It is unwise to block on this thread for any length of time as your browser will become unresponsive and/or hang..
/// To access UI elements you'll need to Invoke/Dispatch onto the UI Thread.
///
event EventHandler LoadError;
///
/// Event handler that will get called when the Loading state has changed.
/// This event will be fired twice. Once when loading is initiated either programmatically or
/// by user action, and once when loading is terminated due to completion, cancellation of failure.
/// It's important to note this event is fired on a CEF UI thread, which by default is not the same as your application UI
/// thread. It is unwise to block on this thread for any length of time as your browser will become unresponsive and/or hang..
/// To access UI elements you'll need to Invoke/Dispatch onto the UI Thread.
///
event EventHandler LoadingStateChanged;
///
/// Loads the specified in the Main Frame.
/// Same as calling
///
/// The URL to be loaded.
///
/// This is exactly the same as calling Load(string), it was added
/// as the method name is more meaningful and easier to discover
/// via Intellisense.
///
void LoadUrl(string url);
///
/// Load the in the main frame of the browser
///
/// url to load
///
/// A that can be awaited to load the and return the HttpStatusCode and .
/// A HttpStatusCode equal to 200 and is considered a success.
///
Task LoadUrlAsync(string url);
///
/// This resolves when the browser navigates to a new URL or reloads.
/// It is useful for when you run code which will indirectly cause the browser to navigate.
/// A common use case would be when executing javascript that results in a navigation. e.g. clicks a link
/// This must be called before executing the action that navigates the browser. It may not resolve correctly
/// if called after.
///
///
/// Usage of the History API to change the URL is considered a navigation
///
/// optional timeout, if not specified defaults to five(5) seconds.
/// optional CancellationToken
/// Task which resolves when has been called with false.
/// or when is called to signify a load failure.
///
///
///
///
///
///
Task WaitForNavigationAsync(TimeSpan? timeout = null, CancellationToken cancellationToken = default);
///
/// A flag that indicates whether the WebBrowser is initialized (true) or not (false).
///
/// true if this instance is browser initialized; otherwise, false.
/// In the WPF control there are two IsBrowserInitialized properties, the ChromiumWebBrowser.IsBrowserInitialized
/// property is implemented as a Dependency Property and fully supports data binding. This property
/// can only be called from the UI Thread. The explicit IWebBrowser.IsBrowserInitialized interface implementation that
/// can be called from any Thread.
bool IsBrowserInitialized { get; }
///
/// A flag that indicates whether the WebBrowser has been disposed () or not ()
///
/// if this instance is disposed; otherwise,
bool IsDisposed { get; }
///
/// A flag that indicates whether the control is currently loading one or more web pages (true) or not (false).
///
/// true if this instance is loading; otherwise, false.
/// In the WPF control, this property is implemented as a Dependency Property and fully supports data
/// binding.
bool IsLoading { get; }
///
/// A flag that indicates whether the state of the control current supports the GoBack action (true) or not (false).
///
/// true if this instance can go back; otherwise, false.
/// In the WPF control, this property is implemented as a Dependency Property and fully supports data
/// binding.
bool CanGoBack { get; }
///
/// A flag that indicates whether the state of the control currently supports the GoForward action (true) or not (false).
///
/// true if this instance can go forward; otherwise, false.
/// In the WPF control, this property is implemented as a Dependency Property and fully supports data
/// binding.
bool CanGoForward { get; }
///
/// The address (URL) which the browser control is currently displaying.
/// Will automatically be updated as the user navigates to another page (e.g. by clicking on a link).
///
/// The address.
/// In the WPF control, this property is implemented as a Dependency Property and fully supports data
/// binding.
string Address { get; }
///
/// Attempts to give focus to the IWebBrowser control.
///
/// true if keyboard focus and logical focus were set to this element; false if only logical focus
/// was set to this element, or if the call to this method did not force the focus to change.
bool Focus();
///
/// Returns the current IBrowser Instance or null.
/// is the the underlying CefBrowser
/// instance and provides access to frames/browserhost etc.
///
IBrowser BrowserCore { get; }
}
}