|
@@ -1,11 +1,15 @@
|
|
|
|
|
|
|
|
|
|
+#include <list>
|
|
|
|
|
+
|
|
|
#include <SDL/include/SDL.h>
|
|
#include <SDL/include/SDL.h>
|
|
|
#include <ThirdParty/SDL/include/SDL_syswm.h>
|
|
#include <ThirdParty/SDL/include/SDL_syswm.h>
|
|
|
|
|
|
|
|
#include <ThirdParty/CEF/include/cef_app.h>
|
|
#include <ThirdParty/CEF/include/cef_app.h>
|
|
|
#include <ThirdParty/CEF/include/cef_client.h>
|
|
#include <ThirdParty/CEF/include/cef_client.h>
|
|
|
-#include <ThirdParty/CEF/include/cef_render_handler.h>
|
|
|
|
|
#include <ThirdParty/CEF/include/wrapper/cef_helpers.h>
|
|
#include <ThirdParty/CEF/include/wrapper/cef_helpers.h>
|
|
|
|
|
+#include <ThirdParty/CEF/include/base/cef_bind.h>
|
|
|
|
|
+#include <ThirdParty/CEF/include/wrapper/cef_closure_task.h>
|
|
|
|
|
+
|
|
|
|
|
|
|
|
#include <Atomic/Core/ProcessUtils.h>
|
|
#include <Atomic/Core/ProcessUtils.h>
|
|
|
#include <Atomic/Core/CoreEvents.h>
|
|
#include <Atomic/Core/CoreEvents.h>
|
|
@@ -16,38 +20,97 @@
|
|
|
#include "WebClient.h"
|
|
#include "WebClient.h"
|
|
|
#include "WebBrowserHost.h"
|
|
#include "WebBrowserHost.h"
|
|
|
|
|
|
|
|
-class SimpleApp : public CefApp,
|
|
|
|
|
- public CefBrowserProcessHandler {
|
|
|
|
|
|
|
+namespace Atomic
|
|
|
|
|
+{
|
|
|
|
|
+
|
|
|
|
|
+#ifdef ATOMIC_PLATFORM_OSX
|
|
|
|
|
+void* GetNSWindowContentView(void* window);
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
|
|
+class WebBrowserHostPrivate : public CefLifeSpanHandler
|
|
|
|
|
+{
|
|
|
|
|
+ friend class WebBrowserHost;
|
|
|
|
|
+
|
|
|
public:
|
|
public:
|
|
|
- SimpleApp();
|
|
|
|
|
|
|
|
|
|
- // CefApp methods:
|
|
|
|
|
- virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler()
|
|
|
|
|
- OVERRIDE { return this; }
|
|
|
|
|
|
|
+ WebBrowserHostPrivate(WebBrowserHost* host)
|
|
|
|
|
+ {
|
|
|
|
|
|
|
|
- // CefBrowserProcessHandler methods:
|
|
|
|
|
- virtual void OnContextInitialized() OVERRIDE;
|
|
|
|
|
|
|
+ host_ = host;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-private:
|
|
|
|
|
- // Include the default reference counting implementation.
|
|
|
|
|
- IMPLEMENT_REFCOUNTING(SimpleApp);
|
|
|
|
|
-};
|
|
|
|
|
|
|
+ virtual ~WebBrowserHostPrivate()
|
|
|
|
|
+ {
|
|
|
|
|
+ host_ = 0;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-SimpleApp::SimpleApp() {
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ // CefLifeSpanHandler methods:
|
|
|
|
|
+ virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) OVERRIDE
|
|
|
|
|
+ {
|
|
|
|
|
+ CEF_REQUIRE_UI_THREAD();
|
|
|
|
|
+ browsers_.Push(browser);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-void SimpleApp::OnContextInitialized() {
|
|
|
|
|
|
|
+ virtual bool DoClose(CefRefPtr<CefBrowser> browser) OVERRIDE
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- CEF_REQUIRE_UI_THREAD();
|
|
|
|
|
|
|
+ virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) OVERRIDE
|
|
|
|
|
+ {
|
|
|
|
|
+ CEF_REQUIRE_UI_THREAD();
|
|
|
|
|
+
|
|
|
|
|
+ // Remove from the list of existing browsers.
|
|
|
|
|
+ Vector<CefRefPtr<CefBrowser>>::Iterator itr = browsers_.Begin();
|
|
|
|
|
+ while (itr != browsers_.End())
|
|
|
|
|
+ {
|
|
|
|
|
+ if ((*itr)->IsSame(browser))
|
|
|
|
|
+ {
|
|
|
|
|
+ browsers_.Erase(itr);
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ itr++;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ void CloseAllBrowsers(bool force_close)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (!CefCurrentlyOn(TID_UI))
|
|
|
|
|
+ {
|
|
|
|
|
+ // Execute on the UI thread.
|
|
|
|
|
+ CefPostTask(TID_UI,
|
|
|
|
|
+ base::Bind(&WebBrowserHostPrivate::CloseAllBrowsers, this, force_close));
|
|
|
|
|
|
|
|
-namespace Atomic
|
|
|
|
|
-{
|
|
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-#ifdef ATOMIC_PLATFORM_OSX
|
|
|
|
|
-void* GetNSWindowContentView(void* window);
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+ if (!browsers_.Size())
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
+ // make a copy of vector, as we'll be erasing as we go
|
|
|
|
|
+ Vector<CefRefPtr<CefBrowser>> browsers = browsers_;
|
|
|
|
|
+
|
|
|
|
|
+ Vector<CefRefPtr<CefBrowser>>::Iterator itr = browsers.Begin();
|
|
|
|
|
+
|
|
|
|
|
+ while (itr != browsers.End())
|
|
|
|
|
+ {
|
|
|
|
|
+ (*itr)->GetHost()->CloseBrowser(force_close);
|
|
|
|
|
+ itr++;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ browsers_.Clear();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ IMPLEMENT_REFCOUNTING(WebBrowserHostPrivate);
|
|
|
|
|
+
|
|
|
|
|
+private:
|
|
|
|
|
+
|
|
|
|
|
+ Vector<CefRefPtr<CefBrowser>> browsers_;
|
|
|
|
|
+
|
|
|
|
|
+ WeakPtr<WebBrowserHost> host_;
|
|
|
|
|
+
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
WebBrowserHost::WebBrowserHost(Context* context) : Object (context)
|
|
WebBrowserHost::WebBrowserHost(Context* context) : Object (context)
|
|
|
{
|
|
{
|
|
@@ -79,15 +142,25 @@ WebBrowserHost::WebBrowserHost(Context* context) : Object (context)
|
|
|
LOGERROR("CefInitialize - Error");
|
|
LOGERROR("CefInitialize - Error");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ d_ = new WebBrowserHostPrivate(this);
|
|
|
|
|
+ d_->AddRef();
|
|
|
|
|
+
|
|
|
SubscribeToEvent(E_BEGINFRAME, HANDLER(WebBrowserHost, HandleBeginFrame));
|
|
SubscribeToEvent(E_BEGINFRAME, HANDLER(WebBrowserHost, HandleBeginFrame));
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
WebBrowserHost::~WebBrowserHost()
|
|
WebBrowserHost::~WebBrowserHost()
|
|
|
{
|
|
{
|
|
|
|
|
+ d_->CloseAllBrowsers(true);
|
|
|
|
|
+ d_->Release();
|
|
|
CefShutdown();
|
|
CefShutdown();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+CefLifeSpanHandler* WebBrowserHost::GetCefLifeSpanHandler()
|
|
|
|
|
+{
|
|
|
|
|
+ return d_;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
bool WebBrowserHost::CreateBrowser(WebClient* webClient)
|
|
bool WebBrowserHost::CreateBrowser(WebClient* webClient)
|
|
|
{
|
|
{
|
|
|
CefWindowInfo windowInfo;
|
|
CefWindowInfo windowInfo;
|