|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2022 - Raw Material Software Limited
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 7 End-User License
- Agreement and JUCE Privacy Policy.
-
- End User License Agreement: www.juce.com/juce-7-licence
- Privacy Policy: www.juce.com/juce-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- namespace juce
- {
-
- #if JUCE_WEB_BROWSER || DOXYGEN
-
- //==============================================================================
- /**
- A component that displays an embedded web browser.
-
- The browser itself will be platform-dependent. On Mac and iOS it will be
- WebKit, on Android it will be Chrome, and on Linux it will be WebKit.
-
- On Windows it will be IE, but if JUCE_USE_WIN_WEBVIEW2 is enabled then using
- the WindowsWebView2WebBrowserComponent wrapper instead of this class directly
- will attempt to use the Microsoft Edge (Chromium) WebView2. See the documentation
- of that class for more information about its requirements.
-
- @tags{GUI}
- */
- class JUCE_API WebBrowserComponent : public Component
- {
- public:
- //==============================================================================
- /** Creates a WebBrowserComponent.
-
- Once it's created and visible, send the browser to a URL using goToURL().
-
- @param unloadPageWhenBrowserIsHidden if this is true, then when the browser
- component is taken offscreen, it'll clear the current page
- and replace it with a blank page - this can be handy to stop
- the browser using resources in the background when it's not
- actually being used.
- */
- explicit WebBrowserComponent (bool unloadPageWhenBrowserIsHidden = true);
-
- /** Destructor. */
- ~WebBrowserComponent() override;
-
- //==============================================================================
- /** Sends the browser to a particular URL.
-
- @param url the URL to go to.
- @param headers an optional set of parameters to put in the HTTP header. If
- you supply this, it should be a set of string in the form
- "HeaderKey: HeaderValue"
- @param postData an optional block of data that will be attached to the HTTP
- POST request
- */
- void goToURL (const String& url,
- const StringArray* headers = nullptr,
- const MemoryBlock* postData = nullptr);
-
- /** Stops the current page loading. */
- void stop();
-
- /** Sends the browser back one page. */
- void goBack();
-
- /** Sends the browser forward one page. */
- void goForward();
-
- /** Refreshes the browser. */
- void refresh();
-
- /** Clear cookies that the OS has stored for the WebComponents of this application */
- static void clearCookies();
-
- //==============================================================================
- /** This callback is called when the browser is about to navigate
- to a new location.
-
- You can override this method to perform some action when the user
- tries to go to a particular URL. To allow the operation to carry on,
- return true, or return false to stop the navigation happening.
- */
- virtual bool pageAboutToLoad (const String& newURL) { ignoreUnused (newURL); return true; }
-
- /** This callback happens when the browser has finished loading a page. */
- virtual void pageFinishedLoading (const String& url) { ignoreUnused (url); }
-
- /** This callback happens when a network error was encountered while
- trying to load a page.
-
- You can override this method to show some other error page by calling
- goToURL. Return true to allow the browser to carry on to the internal
- browser error page.
-
- The errorInfo contains some platform dependent string describing the
- error.
- */
- virtual bool pageLoadHadNetworkError (const String& errorInfo) { ignoreUnused (errorInfo); return true; }
-
- /** This callback occurs when a script or other activity in the browser asks for
- the window to be closed.
- */
- virtual void windowCloseRequest() {}
-
- /** This callback occurs when the browser attempts to load a URL in a new window.
- This won't actually load the window but gives you a chance to either launch a
- new window yourself or just load the URL into the current window with goToURL().
- */
- virtual void newWindowAttemptingToLoad (const String& newURL) { ignoreUnused (newURL); }
-
- //==============================================================================
- /** @internal */
- void paint (Graphics&) override;
- /** @internal */
- void resized() override;
- /** @internal */
- void parentHierarchyChanged() override;
- /** @internal */
- void visibilityChanged() override;
- /** @internal */
- void focusGained (FocusChangeType) override;
-
- /** @internal */
- class Pimpl;
-
- protected:
- friend class WindowsWebView2WebBrowserComponent;
-
- /** @internal */
- struct ConstructWithoutPimpl
- {
- explicit ConstructWithoutPimpl (bool unloadOnHide) : unloadWhenHidden (unloadOnHide) {}
- const bool unloadWhenHidden;
- };
- explicit WebBrowserComponent (ConstructWithoutPimpl);
-
- private:
- //==============================================================================
- std::unique_ptr<Pimpl> browser;
- bool blankPageShown = false, unloadPageWhenHidden;
- String lastURL;
- StringArray lastHeaders;
- MemoryBlock lastPostData;
-
- void reloadLastURL();
- void checkWindowAssociation();
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebBrowserComponent)
- };
-
- //==============================================================================
- /** Class used to create a set of preferences to pass to the WindowsWebView2WebBrowserComponent
- wrapper constructor to modify aspects of its behaviour and settings.
-
- You can chain together a series of calls to this class's methods to create a set of whatever
- preferences you want to specify.
-
- @tags{GUI}
- */
- class JUCE_API WebView2Preferences
- {
- public:
- //==============================================================================
- /** Sets a custom location for the WebView2Loader.dll that is not a part of the
- standard system DLL search paths.
- */
- JUCE_NODISCARD WebView2Preferences withDLLLocation (const File& location) const { return with (&WebView2Preferences::dllLocation, location); }
-
- /** Sets a non-default location for storing user data for the browser instance. */
- WebView2Preferences withUserDataFolder (const File& folder) const { return with (&WebView2Preferences::userDataFolder, folder); }
-
- /** If this is set, the status bar usually displayed in the lower-left of the webview
- will be disabled.
- */
- JUCE_NODISCARD WebView2Preferences withStatusBarDisabled() const { return with (&WebView2Preferences::disableStatusBar, true); }
-
- /** If this is set, a blank page will be displayed on error instead of the default
- built-in error page.
- */
- JUCE_NODISCARD WebView2Preferences withBuiltInErrorPageDisabled() const { return with (&WebView2Preferences::disableBuiltInErrorPage, true); }
-
- /** Sets the background colour that WebView2 renders underneath all web content.
-
- This colour must either be fully opaque or transparent. On Windows 7 this
- colour must be opaque.
- */
- JUCE_NODISCARD WebView2Preferences withBackgroundColour (const Colour& colour) const
- {
- // the background colour must be either fully opaque or transparent!
- jassert (colour.isOpaque() || colour.isTransparent());
-
- return with (&WebView2Preferences::backgroundColour, colour);
- }
-
- //==============================================================================
- File getDLLLocation() const { return dllLocation; }
- File getUserDataFolder() const { return userDataFolder; }
- bool getIsStatusBarDisabled() const noexcept { return disableStatusBar; }
- bool getIsBuiltInErrorPageDisabled() const noexcept { return disableBuiltInErrorPage; }
- Colour getBackgroundColour() const { return backgroundColour; }
-
- private:
- //==============================================================================
- template <typename Member, typename Item>
- WebView2Preferences with (Member&& member, Item&& item) const
- {
- auto options = *this;
- options.*member = std::forward<Item> (item);
-
- return options;
- }
-
- File dllLocation, userDataFolder;
- bool disableStatusBar = false, disableBuiltInErrorPage = false;
- Colour backgroundColour = Colours::white;
- };
-
- /**
- If you have enabled the JUCE_USE_WIN_WEBVIEW2 flag then this wrapper will attempt to
- use the Microsoft Edge (Chromium) WebView2 control instead of IE on Windows. It will
- behave the same as WebBrowserComponent on all other platforms and will fall back to
- IE on Windows if the WebView2 requirements are not met.
-
- This requires Microsoft Edge (minimum version 82.0.488.0) to be installed at runtime.
-
- Currently this also requires that WebView2Loader.dll, which can be found in the
- Microsoft.Web.WebView package, is installed at runtime. As this is not a standard
- system DLL, we can't rely on it being found via the normal system DLL search paths.
- Therefore in order to use WebView2 you need to ensure that WebView2Loader.dll is
- installed either to a location covered by the Windows DLL system search paths or
- to the folder specified in the WebView2Preferences.
-
- @tags{GUI}
- */
- class WindowsWebView2WebBrowserComponent : public WebBrowserComponent
- {
- public:
- //==============================================================================
- /** Creates a WebBrowserComponent that is compatible with the WebView2 control
- on Windows.
-
- @param unloadPageWhenBrowserIsHidden if this is true, then when the browser
- component is taken offscreen, it'll clear the current page
- and replace it with a blank page - this can be handy to stop
- the browser using resources in the background when it's not
- actually being used.
- @param preferences a set of preferences used to control aspects of the webview's
- behaviour.
-
- @see WebView2Preferences
- */
- WindowsWebView2WebBrowserComponent (bool unloadPageWhenBrowserIsHidden = true,
- const WebView2Preferences& preferences = {});
-
- // This constructor has been deprecated. Use the new constructor that takes a
- // WebView2Preferences instead.
- explicit WindowsWebView2WebBrowserComponent (bool unloadPageWhenBrowserIsHidden = true,
- const File& dllLocation = {},
- const File& userDataFolder = {})
- : WindowsWebView2WebBrowserComponent (unloadPageWhenBrowserIsHidden,
- WebView2Preferences().withDLLLocation (dllLocation)
- .withUserDataFolder (userDataFolder))
- {
- }
- };
-
- #endif
-
- } // namespace juce
|