diff options
Diffstat (limited to 'indra')
19 files changed, 166 insertions, 236 deletions
| diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake index 9cfb7d14c7..b8e569d3a8 100644 --- a/indra/cmake/CEFPlugin.cmake +++ b/indra/cmake/CEFPlugin.cmake @@ -6,7 +6,7 @@ if (USESYSTEMLIBS)      set(CEFPLUGIN OFF CACHE BOOL          "CEFPLUGIN support for the llplugin/llmedia test apps.")  else (USESYSTEMLIBS) -    use_prebuilt_binary(llceflib) +    use_prebuilt_binary(dullahan)      set(CEFPLUGIN ON CACHE BOOL          "CEFPLUGIN support for the llplugin/llmedia test apps.")          set(CEF_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/cef) @@ -16,7 +16,7 @@ if (WINDOWS)      set(CEF_PLUGIN_LIBRARIES          libcef.lib          libcef_dll_wrapper.lib -        llceflib.lib +        dullahan.lib      )  elseif (DARWIN)      FIND_LIBRARY(APPKIT_LIBRARY AppKit) @@ -31,7 +31,7 @@ elseif (DARWIN)      set(CEF_PLUGIN_LIBRARIES          ${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.a -        ${ARCH_PREBUILT_DIRS_RELEASE}/libLLCefLib.a +        ${ARCH_PREBUILT_DIRS_RELEASE}/libdullahan.a          ${APPKIT_LIBRARY}          ${CEF_LIBRARY}         ) diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 754306b5d2..d28a7f177f 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1758,7 +1758,7 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async)  LLSD LLWindowMacOSX::getNativeKeyData()  {  	LLSD result = LLSD::emptyMap(); -#if 1 +  	if(mRawKeyEvent)  	{          result["event_type"] = LLSD::Integer(mRawKeyEvent->mEventType); @@ -1768,7 +1768,6 @@ LLSD LLWindowMacOSX::getNativeKeyData()          result["event_umodchars"] = (mRawKeyEvent->mEventUnmodChars) ? LLSD(LLSD::Integer(mRawKeyEvent->mEventUnmodChars)) : LLSD();          result["event_isrepeat"] = LLSD::Boolean(mRawKeyEvent->mEventRepeat);  	} -#endif  	LL_DEBUGS() << "native key data is: " << result << LL_ENDL; diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt index 1c41fadcaf..bc924eabf0 100644 --- a/indra/media_plugins/cef/CMakeLists.txt +++ b/indra/media_plugins/cef/CMakeLists.txt @@ -93,6 +93,9 @@ if (DARWIN)      LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"    ) +  ## turns on C++11 using Cmake +  target_compile_features(media_plugin_cef PRIVATE cxx_range_for) +    add_custom_command(TARGET media_plugin_cef      POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "@executable_path/Chromium Embedded Framework"          "@executable_path/../../../../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index eaba71a6ad..90bdeb082c 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -36,10 +36,9 @@  #include "llpluginmessageclasses.h"  #include "media_plugin_base.h" -#include "boost/function.hpp" -#include "boost/bind.hpp" -#include "llCEFLib.h" -//#include "volume_catcher.h" +#include <functional> + +#include "dullahan.h"  ////////////////////////////////////////////////////////////////////////////////  // @@ -56,7 +55,7 @@ public:  private:  	bool init(); -	void onPageChangedCallback(unsigned char* pixels, int x, int y, int width, int height, bool is_popup); +	void onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height, bool is_popup);  	void onCustomSchemeURLCallback(std::string url);  	void onConsoleMessageCallback(std::string message, std::string source, int line);  	void onStatusMessageCallback(std::string value); @@ -67,17 +66,15 @@ private:  	void onAddressChangeCallback(std::string url);  	void onNavigateURLCallback(std::string url, std::string target);  	bool onHTTPAuthCallback(const std::string host, const std::string realm, std::string& username, std::string& password); -	void onCursorChangedCallback(LLCEFLib::ECursorType type, unsigned int handle); +	void onCursorChangedCallback(dullahan::ECursorType type);  	void onFileDownloadCallback(std::string filename);  	const std::string onFileDialogCallback();  	void postDebugMessage(const std::string& msg);  	void authResponse(LLPluginMessage &message); -	LLCEFLib::EKeyboardModifier decodeModifiers(std::string &modifiers); -	void deserializeKeyboardData(LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers); -	void keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data); -	void unicodeInput(const std::string &utf8str, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data); +	void keyEvent(dullahan::EKeyEvent key_event, LLSD native_key_data); +	void unicodeInput(LLSD native_key_data);  	void checkEditState();      void setVolume(F32 vol); @@ -97,7 +94,7 @@ private:  	std::string mCachePath;  	std::string mCookiePath;  	std::string mPickedFile; -	LLCEFLib* mLLCEFLib; +	dullahan* mCEFLib;  	U8 *mPopupBuffer;  	U32 mPopupW; @@ -130,7 +127,7 @@ MediaPluginBase(host_send_func, host_user_data)  	mCachePath = "";  	mCookiePath = "";  	mPickedFile = ""; -	mLLCEFLib = new LLCEFLib(); +	mCEFLib = new dullahan();  	mPopupBuffer = NULL;  	mPopupW = 0; @@ -164,7 +161,7 @@ void MediaPluginCEF::postDebugMessage(const std::string& msg)  ////////////////////////////////////////////////////////////////////////////////  // -void MediaPluginCEF::onPageChangedCallback(unsigned char* pixels, int x, int y, int width, int height, bool is_popup) +void MediaPluginCEF::onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height, bool is_popup)  {  	if( is_popup )  	{ @@ -252,8 +249,8 @@ void MediaPluginCEF::onLoadStartCallback()  {  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");  	//message.setValue("uri", event.getEventUri());  // not easily available here in CEF - needed? -	message.setValueBoolean("history_back_available", mLLCEFLib->canGoBack()); -	message.setValueBoolean("history_forward_available", mLLCEFLib->canGoForward()); +	message.setValueBoolean("history_back_available", mCEFLib->canGoBack()); +	message.setValueBoolean("history_forward_available", mCEFLib->canGoForward());  	sendMessage(message);  } @@ -261,7 +258,7 @@ void MediaPluginCEF::onLoadStartCallback()  //  void MediaPluginCEF::onRequestExitCallback()  { -	mLLCEFLib->shutdown(); +	mCEFLib->shutdown();  	LLPluginMessage message("base", "goodbye");  	sendMessage(message); @@ -274,8 +271,8 @@ void MediaPluginCEF::onLoadEndCallback(int httpStatusCode)  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");  	//message.setValue("uri", event.getEventUri());  // not easily available here in CEF - needed?  	message.setValueS32("result_code", httpStatusCode); -	message.setValueBoolean("history_back_available", mLLCEFLib->canGoBack()); -	message.setValueBoolean("history_forward_available", mLLCEFLib->canGoForward()); +	message.setValueBoolean("history_back_available", mCEFLib->canGoBack()); +	message.setValueBoolean("history_forward_available", mCEFLib->canGoForward());  	sendMessage(message);  } @@ -358,25 +355,25 @@ const std::string MediaPluginCEF::onFileDialogCallback()  	return mPickedFile;  } -void MediaPluginCEF::onCursorChangedCallback(LLCEFLib::ECursorType type, unsigned int handle) +void MediaPluginCEF::onCursorChangedCallback(dullahan::ECursorType type)  {  	std::string name = "";  	switch (type)  	{ -		case LLCEFLib::CT_POINTER: +		case dullahan::CT_POINTER:  			name = "arrow";  			break; -		case LLCEFLib::CT_IBEAM: +		case dullahan::CT_IBEAM:  			name = "ibeam";  			break; -		case LLCEFLib::CT_NORTHSOUTHRESIZE: +		case dullahan::CT_NORTHSOUTHRESIZE:  			name = "splitv";  			break; -		case LLCEFLib::CT_EASTWESTRESIZE: +		case dullahan::CT_EASTWESTRESIZE:  			name = "splith";  			break; -		case LLCEFLib::CT_HAND: +		case dullahan::CT_HAND:  			name = "hand";  			break; @@ -428,7 +425,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  			}  			else if (message_name == "idle")  			{ -				mLLCEFLib->update(); +				mCEFLib->update();  				// this seems bad but unless the state changes (it won't until we figure out  				// how to get CEF to tell us if copy/cut/paste is available) then this function @@ -437,7 +434,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  			}  			else if (message_name == "cleanup")  			{ -				mLLCEFLib->requestExit(); +				mCEFLib->requestExit();  			}  			else if (message_name == "shm_added")  			{ @@ -479,47 +476,50 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  		{  			if (message_name == "init")  			{ -				// event callbacks from LLCefLib -				mLLCEFLib->setOnPageChangedCallback(boost::bind(&MediaPluginCEF::onPageChangedCallback, this, _1, _2, _3, _4, _5, _6)); -				mLLCEFLib->setOnCustomSchemeURLCallback(boost::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, _1)); -				mLLCEFLib->setOnConsoleMessageCallback(boost::bind(&MediaPluginCEF::onConsoleMessageCallback, this, _1, _2, _3)); -				mLLCEFLib->setOnStatusMessageCallback(boost::bind(&MediaPluginCEF::onStatusMessageCallback, this, _1)); -				mLLCEFLib->setOnTitleChangeCallback(boost::bind(&MediaPluginCEF::onTitleChangeCallback, this, _1)); -				mLLCEFLib->setOnLoadStartCallback(boost::bind(&MediaPluginCEF::onLoadStartCallback, this)); -				mLLCEFLib->setOnLoadEndCallback(boost::bind(&MediaPluginCEF::onLoadEndCallback, this, _1)); -				mLLCEFLib->setOnAddressChangeCallback(boost::bind(&MediaPluginCEF::onAddressChangeCallback, this, _1)); -				mLLCEFLib->setOnNavigateURLCallback(boost::bind(&MediaPluginCEF::onNavigateURLCallback, this, _1, _2)); -				mLLCEFLib->setOnHTTPAuthCallback(boost::bind(&MediaPluginCEF::onHTTPAuthCallback, this, _1, _2, _3, _4)); -				mLLCEFLib->setOnFileDownloadCallback(boost::bind(&MediaPluginCEF::onFileDownloadCallback, this, _1)); -				mLLCEFLib->setOnFileDialogCallback(boost::bind(&MediaPluginCEF::onFileDialogCallback, this)); -				mLLCEFLib->setOnCursorChangedCallback(boost::bind(&MediaPluginCEF::onCursorChangedCallback, this, _1, _2)); -				mLLCEFLib->setOnRequestExitCallback(boost::bind(&MediaPluginCEF::onRequestExitCallback, this)); - -				LLCEFLib::LLCEFLibSettings settings; -				settings.initial_width = 1024; -				settings.initial_height = 1024; -				// The LLCEFLibSettings struct in the Windows 32-bit -				// llceflib's build 500907 does not have a page_zoom_factor -				// member. Set below. -				//settings.page_zoom_factor = message_in.getValueReal("factor"); -				settings.plugins_enabled = mPluginsEnabled; -				settings.media_stream_enabled = false; // MAINT-6060 - WebRTC media removed until we can add granualrity/query UI -				settings.javascript_enabled = mJavascriptEnabled; -				settings.cookies_enabled = mCookiesEnabled; -				settings.cookie_store_path = mCookiePath; +				// event callbacks from Dullahan +				mCEFLib->setOnPageChangedCallback(std::bind(&MediaPluginCEF::onPageChangedCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6)); +				mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1)); +				mCEFLib->setOnConsoleMessageCallback(std::bind(&MediaPluginCEF::onConsoleMessageCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); +				mCEFLib->setOnStatusMessageCallback(std::bind(&MediaPluginCEF::onStatusMessageCallback, this, std::placeholders::_1)); +				mCEFLib->setOnTitleChangeCallback(std::bind(&MediaPluginCEF::onTitleChangeCallback, this, std::placeholders::_1)); +				mCEFLib->setOnLoadStartCallback(std::bind(&MediaPluginCEF::onLoadStartCallback, this)); +				mCEFLib->setOnLoadEndCallback(std::bind(&MediaPluginCEF::onLoadEndCallback, this, std::placeholders::_1)); +				mCEFLib->setOnAddressChangeCallback(std::bind(&MediaPluginCEF::onAddressChangeCallback, this, std::placeholders::_1)); +				mCEFLib->setOnNavigateURLCallback(std::bind(&MediaPluginCEF::onNavigateURLCallback, this, std::placeholders::_1, std::placeholders::_2)); +				mCEFLib->setOnHTTPAuthCallback(std::bind(&MediaPluginCEF::onHTTPAuthCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); +				mCEFLib->setOnFileDownloadCallback(std::bind(&MediaPluginCEF::onFileDownloadCallback, this, std::placeholders::_1)); +				mCEFLib->setOnFileDialogCallback(std::bind(&MediaPluginCEF::onFileDialogCallback, this)); +				mCEFLib->setOnCursorChangedCallback(std::bind(&MediaPluginCEF::onCursorChangedCallback, this, std::placeholders::_1)); +				mCEFLib->setOnRequestExitCallback(std::bind(&MediaPluginCEF::onRequestExitCallback, this)); + +				dullahan::dullahan_settings settings; +				settings.accept_language_list = mHostLanguage; +				settings.background_color = 0xffffff;  				settings.cache_enabled = true;  				settings.cache_path = mCachePath; -				settings.accept_language_list = mHostLanguage; -				settings.user_agent_substring = mLLCEFLib->makeCompatibleUserAgentString(mUserAgentSubtring); +				settings.cookie_store_path = mCookiePath; +				settings.cookies_enabled = mCookiesEnabled; +				settings.flash_enabled = mPluginsEnabled; +				settings.flip_mouse_y = false; +				settings.flip_pixels_y = true; +				settings.frame_rate = 60; +				settings.initial_height = 1024; +				settings.initial_width = 1024; +				settings.java_enabled = false; +				settings.javascript_enabled = mJavascriptEnabled; +				settings.media_stream_enabled = false; // MAINT-6060 - WebRTC media removed until we can add granualrity/query UI +				settings.plugins_enabled = mPluginsEnabled; +				settings.user_agent_substring = mCEFLib->makeCompatibleUserAgentString(mUserAgentSubtring); +				settings.webgl_enabled = true; -				bool result = mLLCEFLib->init(settings); +				bool result = mCEFLib->init(settings);  				if (!result)  				{  					// if this fails, the media system in viewer will put up a message  				}  				// now we can set page zoom factor -				mLLCEFLib->setPageZoom(message_in.getValueReal("factor")); +				mCEFLib->setPageZoom(message_in.getValueReal("factor"));  				// Plugin gets to decide the texture parameters to use.  				mDepth = 4; @@ -563,7 +563,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  					};  				}; -				mLLCEFLib->setSize(mWidth, mHeight); +				mCEFLib->setSize(mWidth, mHeight);  				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");  				message.setValue("name", name); @@ -581,7 +581,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  			else if (message_name == "load_uri")  			{  				std::string uri = message_in.getValue("uri"); -				mLLCEFLib->navigate(uri); +				mCEFLib->navigate(uri);  			}  			else if (message_name == "set_cookie")  			{ @@ -592,7 +592,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  				std::string path = message_in.getValue("path");  				bool httponly = message_in.getValueBoolean("httponly");  				bool secure = message_in.getValueBoolean("secure"); -				mLLCEFLib->setCookie(uri, name, value, domain, path, httponly, secure); +				mCEFLib->setCookie(uri, name, value, domain, path, httponly, secure);  			}  			else if (message_name == "mouse_event")  			{ @@ -601,18 +601,16 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  				S32 x = message_in.getValueS32("x");  				S32 y = message_in.getValueS32("y"); -				y = mHeight - y; - -				// only even send left mouse button events to LLCEFLib +				// only even send left mouse button events to the CEF library  				// (partially prompted by crash in OS X CEF when sending right button events)  				// we catch the right click in viewer and display our own context menu anyway  				S32 button = message_in.getValueS32("button"); -				LLCEFLib::EMouseButton btn = LLCEFLib::MB_MOUSE_BUTTON_LEFT; +				dullahan::EMouseButton btn = dullahan::MB_MOUSE_BUTTON_LEFT;  				if (event == "down" && button == 0)  				{ -					mLLCEFLib->mouseButton(btn, LLCEFLib::ME_MOUSE_DOWN, x, y); -					mLLCEFLib->setFocus(true); +					mCEFLib->mouseButton(btn, dullahan::ME_MOUSE_DOWN, x, y); +					mCEFLib->setFocus();  					std::stringstream str;  					str << "Mouse down at = " << x << ", " << y; @@ -620,7 +618,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  				}  				else if (event == "up" && button == 0)  				{ -					mLLCEFLib->mouseButton(btn, LLCEFLib::ME_MOUSE_UP, x, y); +					mCEFLib->mouseButton(btn, dullahan::ME_MOUSE_UP, x, y);  					std::stringstream str;  					str << "Mouse up at = " << x << ", " << y; @@ -628,11 +626,11 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  				}  				else if (event == "double_click")  				{ -					mLLCEFLib->mouseButton(btn, LLCEFLib::ME_MOUSE_DOUBLE_CLICK, x, y); +					mCEFLib->mouseButton(btn, dullahan::ME_MOUSE_DOUBLE_CLICK, x, y);  				}  				else  				{ -					mLLCEFLib->mouseMove(x, y); +					mCEFLib->mouseMove(x, y);  				}  			}  			else if (message_name == "scroll_event") @@ -642,68 +640,47 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  				const int scaling_factor = 40;  				y *= -scaling_factor; -				mLLCEFLib->mouseWheel(x, y); +				mCEFLib->mouseWheel(x, y);  			}  			else if (message_name == "text_event")  			{ -				std::string text = message_in.getValue("text"); -				std::string modifiers = message_in.getValue("modifiers");  				LLSD native_key_data = message_in.getValueLLSD("native_key_data"); - -				unicodeInput(text, decodeModifiers(modifiers), native_key_data); +				unicodeInput(native_key_data);  			}  			else if (message_name == "key_event")  			{  #if LL_DARWIN  				std::string event = message_in.getValue("event"); -				S32 key = message_in.getValueS32("key");                  LLSD native_key_data = message_in.getValueLLSD("native_key_data"); -#if 0 -				if (event == "down") -				{ -					//mLLCEFLib->keyPress(key, true); -					mLLCEFLib->keyboardEvent(LLCEFLib::KE_KEY_DOWN, (uint32_t)key, 0, LLCEFLib::KM_MODIFIER_NONE, 0, 0, 0); - -				} -				else if (event == "up") -				{ -					//mLLCEFLib->keyPress(key, false); -					mLLCEFLib->keyboardEvent(LLCEFLib::KE_KEY_UP, (uint32_t)key, 0, LLCEFLib::KM_MODIFIER_NONE, 0, 0, 0); -				} -#else -                // Treat unknown events as key-up for safety. -                LLCEFLib::EKeyEvent key_event = LLCEFLib::KE_KEY_UP; +                dullahan::EKeyEvent key_event = dullahan::KE_KEY_UP;                  if (event == "down")                  { -                    key_event = LLCEFLib::KE_KEY_DOWN; +                    key_event = dullahan::KE_KEY_DOWN;                  }                  else if (event == "repeat")                  { -                    key_event = LLCEFLib::KE_KEY_REPEAT; +                    key_event = dullahan::KE_KEY_REPEAT;                  } -                keyEvent(key_event, key, LLCEFLib::KM_MODIFIER_NONE, native_key_data); +                keyEvent(key_event, native_key_data); -#endif  #elif LL_WINDOWS  				std::string event = message_in.getValue("event"); -				S32 key = message_in.getValueS32("key"); -				std::string modifiers = message_in.getValue("modifiers");  				LLSD native_key_data = message_in.getValueLLSD("native_key_data");  				// Treat unknown events as key-up for safety. -				LLCEFLib::EKeyEvent key_event = LLCEFLib::KE_KEY_UP; +				dullahan::EKeyEvent key_event = dullahan::KE_KEY_UP;  				if (event == "down")  				{ -					key_event = LLCEFLib::KE_KEY_DOWN; +					key_event = dullahan::KE_KEY_DOWN;  				}  				else if (event == "repeat")  				{ -					key_event = LLCEFLib::KE_KEY_REPEAT; +					key_event = dullahan::KE_KEY_REPEAT;  				} -				keyEvent(key_event, key, decodeModifiers(modifiers), native_key_data); +				keyEvent(key_event, native_key_data);  #endif  			}  			else if (message_name == "enable_media_plugin_debugging") @@ -720,15 +697,15 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  			}  			if (message_name == "edit_cut")  			{ -				mLLCEFLib->editCut(); +				mCEFLib->editCut();  			}  			if (message_name == "edit_copy")  			{ -				mLLCEFLib->editCopy(); +				mCEFLib->editCopy();  			}  			if (message_name == "edit_paste")  			{ -				mLLCEFLib->editPaste(); +				mCEFLib->editPaste();  			}  		}  		else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER) @@ -736,24 +713,24 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  			if (message_name == "set_page_zoom_factor")  			{  				F32 factor = (F32)message_in.getValueReal("factor"); -				mLLCEFLib->setPageZoom(factor); +				mCEFLib->setPageZoom(factor);  			}  			if (message_name == "browse_stop")  			{ -				mLLCEFLib->stop(); +				mCEFLib->stop();  			}  			else if (message_name == "browse_reload")  			{  				bool ignore_cache = true; -				mLLCEFLib->reload(ignore_cache); +				mCEFLib->reload(ignore_cache);  			}  			else if (message_name == "browse_forward")  			{ -				mLLCEFLib->goForward(); +				mCEFLib->goForward();  			}  			else if (message_name == "browse_back")  			{ -				mLLCEFLib->goBack(); +				mCEFLib->goBack();  			}  			else if (message_name == "cookies_enabled")  			{ @@ -765,7 +742,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  			}  			else if (message_name == "show_web_inspector")  			{ -				mLLCEFLib->showDevTools(true); +				mCEFLib->showDevTools();  			}  			else if (message_name == "plugins_enabled")  			{ @@ -790,100 +767,39 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  	}  } -LLCEFLib::EKeyboardModifier MediaPluginCEF::decodeModifiers(std::string &modifiers) -{ -	int result = 0; - -	if (modifiers.find("shift") != std::string::npos) -		result |= LLCEFLib::KM_MODIFIER_SHIFT; - -	if (modifiers.find("alt") != std::string::npos) -		result |= LLCEFLib::KM_MODIFIER_ALT; - -	if (modifiers.find("control") != std::string::npos) -		result |= LLCEFLib::KM_MODIFIER_CONTROL; - -	if (modifiers.find("meta") != std::string::npos) -		result |= LLCEFLib::KM_MODIFIER_META; - -	return (LLCEFLib::EKeyboardModifier)result; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void MediaPluginCEF::deserializeKeyboardData(LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers) -{ -	native_scan_code = 0; -	native_virtual_key = 0; -	native_modifiers = 0; - -	if (native_key_data.isMap()) -	{ -#if LL_DARWIN -		native_scan_code = (uint32_t)(native_key_data["char_code"].asInteger()); -		native_virtual_key = (uint32_t)(native_key_data["key_code"].asInteger()); -		native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger()); -#elif LL_WINDOWS -		native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger()); -		native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger()); -		// TODO: I don't think we need to do anything with native modifiers here -- please verify -#endif -	}; -}; -  ////////////////////////////////////////////////////////////////////////////////  // -void MediaPluginCEF::keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::EKeyboardModifier modifiers_x, LLSD native_key_data = LLSD::emptyMap()) +void MediaPluginCEF::keyEvent(dullahan::EKeyEvent key_event, LLSD native_key_data = LLSD::emptyMap())  {  #if LL_DARWIN - -    if (!native_key_data.has("event_type") || -            !native_key_data.has("event_modifiers") || -            !native_key_data.has("event_keycode") || -            !native_key_data.has("event_isrepeat")) -        return; - -    uint32_t eventType = native_key_data["event_type"].asInteger(); -    if (!eventType) -        return; -    uint32_t eventModifiers = native_key_data["event_modifiers"].asInteger(); -    uint32_t eventKeycode = native_key_data["event_keycode"].asInteger(); -    char eventChars = static_cast<char>(native_key_data["event_chars"].isUndefined() ? 0 : native_key_data["event_chars"].asInteger()); -    char eventUChars = static_cast<char>(native_key_data["event_umodchars"].isUndefined() ? 0 : native_key_data["event_umodchars"].asInteger()); -    bool eventIsRepeat = native_key_data["event_isrepeat"].asBoolean(); - -    mLLCEFLib->keyboardEventOSX(eventType, eventModifiers, (eventChars) ? &eventChars : NULL, -                                (eventUChars) ? &eventUChars : NULL, eventIsRepeat, eventKeycode); - +	U32 event_modifiers = native_key_data["event_modifiers"].asInteger(); +	U32 event_keycode = native_key_data["event_keycode"].asInteger(); +	U32 event_chars = native_key_data["event_chars"].asInteger(); +	U32 event_umodchars = native_key_data["event_umodchars"].asInteger(); +	bool event_isrepeat = native_key_data["event_isrepeat"].asBoolean(); + +	mCEFLib->nativeKeyboardEventOSX(key_event, event_modifiers,  +									event_keycode, event_chars,  +									event_umodchars, event_isrepeat);  #elif LL_WINDOWS  	U32 msg = ll_U32_from_sd(native_key_data["msg"]);  	U32 wparam = ll_U32_from_sd(native_key_data["w_param"]);  	U64 lparam = ll_U32_from_sd(native_key_data["l_param"]); -	mLLCEFLib->nativeKeyboardEvent(msg, wparam, lparam); +	mCEFLib->nativeKeyboardEventWin(msg, wparam, lparam);  #endif  }; -void MediaPluginCEF::unicodeInput(const std::string &utf8str, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap()) +void MediaPluginCEF::unicodeInput(LLSD native_key_data = LLSD::emptyMap())  {  #if LL_DARWIN -	//mLLCEFLib->keyPress(utf8str[0], true); -	//mLLCEFLib->keyboardEvent(LLCEFLib::KE_KEY_DOWN, (uint32_t)(utf8str[0]), 0, LLCEFLib::KM_MODIFIER_NONE, 0, 0, 0); -    if (!native_key_data.has("event_chars") || !native_key_data.has("event_umodchars") || -            !native_key_data.has("event_keycode") || !native_key_data.has("event_modifiers")) -        return; -    uint32_t unicodeChar = native_key_data["event_chars"].asInteger(); -    uint32_t unmodifiedChar = native_key_data["event_umodchars"].asInteger(); -    uint32_t keyCode = native_key_data["event_keycode"].asInteger(); -    uint32_t rawmodifiers = native_key_data["event_modifiers"].asInteger(); - -    mLLCEFLib->injectUnicodeText(unicodeChar, unmodifiedChar, keyCode, rawmodifiers); - +	// code to send keys here doesn't seem to be required for Darwin - in fact, +	// not having reliable key event type info here means we don't know what to send anyway  #elif LL_WINDOWS  	U32 msg = ll_U32_from_sd(native_key_data["msg"]);  	U32 wparam = ll_U32_from_sd(native_key_data["w_param"]);  	U64 lparam = ll_U32_from_sd(native_key_data["l_param"]); -	mLLCEFLib->nativeKeyboardEvent(msg, wparam, lparam); +	mCEFLib->nativeKeyboardEventWin(msg, wparam, lparam);  #endif  }; @@ -891,9 +807,9 @@ void MediaPluginCEF::unicodeInput(const std::string &utf8str, LLCEFLib::EKeyboar  //  void MediaPluginCEF::checkEditState()  { -	bool can_cut = mLLCEFLib->editCanCut(); -	bool can_copy = mLLCEFLib->editCanCopy(); -	bool can_paste = mLLCEFLib->editCanPaste(); +	bool can_cut = mCEFLib->editCanCut(); +	bool can_copy = mCEFLib->editCanCopy(); +	bool can_paste = mCEFLib->editCanPaste();  	if ((can_cut != mCanCut) || (can_copy != mCanCopy) || (can_paste != mCanPaste))  	{ diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ed86145e10..15b8ecfcea 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -125,10 +125,8 @@  #include "llcoros.h"  #include "llexception.h"  #if !LL_LINUX -#include "cef/llceflib.h" -#if LL_WINDOWS +#include "cef/dullahan.h"  #include "vlc/libvlc_version.h" -#endif // LL_WINDOWS  #endif // LL_LINUX  // Third party library includes @@ -334,10 +332,10 @@ BOOL				gDisconnected = FALSE;  // used to restore texture state after a mode switch  LLFrameTimer	gRestoreGLTimer;  BOOL			gRestoreGL = FALSE; -BOOL			gUseWireframe = FALSE; +bool			gUseWireframe = FALSE;  //use for remember deferred mode in wireframe switch -BOOL			gInitialDeferredModeForWireframe = FALSE; +bool			gInitialDeferredModeForWireframe = FALSE;  // VFS globals - see llappviewer.h  LLVFS* gStaticVFS = NULL; @@ -3393,20 +3391,28 @@ LLSD LLAppViewer::getViewerInfo() const  	}  #if !LL_LINUX -	info["LLCEFLIB_VERSION"] = LLCEFLIB_VERSION; +	std::ostringstream cef_ver_codec; +	cef_ver_codec << "Dullahan: "; +	cef_ver_codec << DULLAHAN_VERSION_MAJOR; +	cef_ver_codec << "."; +	cef_ver_codec << DULLAHAN_VERSION_MINOR; +	cef_ver_codec << "."; +	cef_ver_codec << DULLAHAN_VERSION_BUILD; +	cef_ver_codec << " - CEF: "; +	cef_ver_codec << CEF_VERSION; +	info["LIBCEF_VERSION"] = cef_ver_codec.str();  #else -	info["LLCEFLIB_VERSION"] = "Undefined"; - +	info["LIBCEF_VERSION"] = "Undefined";  #endif -#if LL_WINDOWS -	std::ostringstream ver_codec; -	ver_codec << LIBVLC_VERSION_MAJOR; -	ver_codec << "."; -	ver_codec << LIBVLC_VERSION_MINOR; -	ver_codec << "."; -	ver_codec << LIBVLC_VERSION_REVISION; -	info["LIBVLC_VERSION"] = ver_codec.str(); +#if !LL_LINUX +	std::ostringstream vlc_ver_codec; +	vlc_ver_codec << LIBVLC_VERSION_MAJOR; +	vlc_ver_codec << "."; +	vlc_ver_codec << LIBVLC_VERSION_MINOR; +	vlc_ver_codec << "."; +	vlc_ver_codec << LIBVLC_VERSION_REVISION; +	info["LIBVLC_VERSION"] = vlc_ver_codec.str();  #else  	info["LIBVLC_VERSION"] = "Undefined";  #endif diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 948d316009..d4875cc7c1 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -391,8 +391,8 @@ extern BOOL		gDisconnected;  extern LLFrameTimer	gRestoreGLTimer;  extern BOOL			gRestoreGL; -extern BOOL		gUseWireframe; -extern BOOL		gInitialDeferredModeForWireframe; +extern bool		gUseWireframe; +extern bool		gInitialDeferredModeForWireframe;  // VFS globals - gVFS is for general use  // gStaticVFS is read-only and is shipped w/ the viewer diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml index 779b168ae0..7654f0dcd6 100644 --- a/indra/newview/skins/default/xui/da/floater_about.xml +++ b/indra/newview/skins/default/xui/da/floater_about.xml @@ -24,7 +24,7 @@ Grafik kort: [GRAPHICS_CARD]  J2C Decoder Version: [J2C_VERSION]  Audio Driver Version: [AUDIO_DRIVER_VERSION] -LLCEFLib/CEF Version: [LLCEFLIB_VERSION] +CEF Version: [LIBCEF_VERSION]  LibVLC Version: [LIBVLC_VERSION]  Voice Server Version: [VOICE_VERSION]  	</floater.string> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 4a2cbcc81f..d3d0423d44 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -79,7 +79,7 @@ Erstellungszeit VFS (Cache): [VFS_TIME]  	<string name="AboutLibs">  		J2C-Decoderversion: [J2C_VERSION]  Audiotreiberversion: [AUDIO_DRIVER_VERSION] -LLCEFLib/CEF-Version: [LLCEFLIB_VERSION] +CEF-Version: [LIBCEF_VERSION]  LibVLC-Version: [LIBVLC_VERSION]  Voice-Server-Version: [VOICE_VERSION]  	</string> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 6b3422d892..c19ab5a570 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -61,7 +61,7 @@ VFS (cache) creation time: [VFS_TIME]  	<string name="AboutLibs">  J2C Decoder Version: [J2C_VERSION]  Audio Driver Version: [AUDIO_DRIVER_VERSION] -LLCEFLib/CEF Version: [LLCEFLIB_VERSION] +CEF Version: [LIBCEF_VERSION]  LibVLC Version: [LIBVLC_VERSION]  Voice Server Version: [VOICE_VERSION]  	</string> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 192d32c267..a56d7d6de7 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -70,8 +70,8 @@ Tiempo de creación de VFS (caché): [VFS_TIME]  	<string name="AboutLibs">  		Versión de J2C Decoder: [J2C_VERSION]  Versión de Audio Driver: [AUDIO_DRIVER_VERSION] -Versión de LLCEFLib/CEF: [LLCEFLIB_VERSION] -Versión de LibVLC: [LLCEFLIB_VERSION] +Versión de CEF: [LIBCEF_VERSION] +Versión de LibVLC: [LIBVLC_VERSION]  Versión de Voice Server: [VOICE_VERSION]  	</string>  	<string name="AboutTraffic"> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 40a41b93ab..10c9be0795 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -79,7 +79,7 @@ Durée de création VFS (cache) : [VFS_TIME]  	<string name="AboutLibs">  		Version J2C Decoder : [J2C_VERSION]  Version Audio Driver : [AUDIO_DRIVER_VERSION] -Version LLCEFLib/CEF : [LLCEFLIB_VERSION] +Version CEF : [LIBCEF_VERSION]  Version LibVLC : [LIBVLC_VERSION]  Version serveur vocal : [VOICE_VERSION]  	</string> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 8246f91d17..d158cfd311 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -76,7 +76,7 @@ Data/ora creazione VFS (cache): [VFS_TIME]  	<string name="AboutLibs">  		Versione J2C Decoder: [J2C_VERSION]  Versione Driver audio: [AUDIO_DRIVER_VERSION] -Versione LLCEFLib/CEF: [LLCEFLIB_VERSION] +Versione CEF: [LIBCEF_VERSION]  Versione LibVLC: [LIBVLC_VERSION]  Versione Server voice: [VOICE_VERSION]  	</string> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 586b8ab2d3..b3c92dbe8d 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -79,7 +79,7 @@ VFS(キャッシュ)作成時間: [VFS_TIME]  	<string name="AboutLibs">  		J2C デコーダバージョン:[J2C_VERSION]  オーディオドライババージョン:[AUDIO_DRIVER_VERSION] -LLCEFLib/CEF バージョン: [LLCEFLIB_VERSION] +CEF バージョン: [LIBCEF_VERSION]  LibVLC バージョン: [LIBVLC_VERSION]  ボイスサーバーバージョン:[VOICE_VERSION]  	</string> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index e9dd18043d..9aece1221d 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -43,7 +43,7 @@ Wersja OpenGL: [OPENGL_VERSION]  Wersja dekodera J2C: [J2C_VERSION]  Wersja sterownika dźwięku (Audio Driver): [AUDIO_DRIVER_VERSION] -Wersja LLCEFLib/CEF: [LLCEFLIB_VERSION] +Wersja CEF: [LIBCEF_VERSION]  Wersja LibVLC: [LIBVLC_VERSION]  Wersja serwera głosu (Voice Server): [VOICE_VERSION]  	</string> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 207b4e7097..0d7585a424 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -70,7 +70,7 @@ Tempo de criação de VFS (cache): [VFS_TIME]  	<string name="AboutLibs">  		Versão do J2C Decoder: [J2C_VERSION]  Versão do driver de áudio: [AUDIO_DRIVER_VERSION] -Versão de LLCEFLib/CEF: [LLCEFLIB_VERSION] +Versão de CEF: [LIBCEF_VERSION]  Versão da LibVLC: [LIBVLC_VERSION]  Versão do servidor de voz: [VOICE_VERSION]  	</string> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index e44d63b3b9..7b1dcae021 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -79,7 +79,7 @@ SLURL: <nolink>[SLURL]</nolink>  	<string name="AboutLibs">  		Версия декодера J2C: [J2C_VERSION]  Версия драйвера звука: [AUDIO_DRIVER_VERSION] -Версия LLCEFLib/CEF: [LLCEFLIB_VERSION] +Версия CEF: [LIBCEF_VERSION]  Версия LibVLC: [LIBVLC_VERSION]  Версия голосового сервера: [VOICE_VERSION]  	</string> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index 7b4bf1fca6..dda7902e94 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -79,7 +79,7 @@ VFS (önbellek) oluşturma zamanı: [VFS_TIME]  	<string name="AboutLibs">  		J2C Kod Çözücü Sürümü: [J2C_VERSION]  Ses Sürücüsü Sürümü: [AUDIO_DRIVER_VERSION] -LLCEFLib/CEF Sürümü: [LLCEFLIB_VERSION] +CEF Sürümü: [LIBCEF_VERSION]  LibVLC Sürümü: [LIBVLC_VERSION]  Ses Sunucusu Sürümü: [VOICE_VERSION]  	</string> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index ec08c9f91e..9e88e96284 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -79,7 +79,7 @@ VFS(快取)建立時間:[VFS_TIME]  	<string name="AboutLibs">  		J2C 解碼器版本: [J2C_VERSION]  音效驅動程式版本: [AUDIO_DRIVER_VERSION] -LLCEFLib/CEF版本:[LLCEFLIB_VERSION] +CEF版本:[LIBCEF_VERSION]  LibVLC版本:[LIBVLC_VERSION]N]  語音伺服器版本: [VOICE_VERSION]  	</string> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 6fb9479564..3b80f519f4 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -447,7 +447,7 @@ class WindowsManifest(ViewerManifest):                  self.path("libcef.dll")                  self.path("libEGL.dll")                  self.path("libGLESv2.dll") -                self.path("llceflib_host.exe") +                self.path("dullahan_host.exe")                  self.path("natives_blob.bin")                  self.path("snapshot_blob.bin")                  self.path("widevinecdmadapter.dll") @@ -461,7 +461,7 @@ class WindowsManifest(ViewerManifest):                  self.path("libcef.dll")                  self.path("libEGL.dll")                  self.path("libGLESv2.dll") -                self.path("llceflib_host.exe") +                self.path("dullahan_host.exe")                  self.path("natives_blob.bin")                  self.path("snapshot_blob.bin")                  self.path("widevinecdmadapter.dll") @@ -839,26 +839,32 @@ class DarwinManifest(ViewerManifest):                          except OSError as err:                              print "Can't symlink %s -> %s: %s" % (src, dst, err) -                # LLCefLib helper apps go inside SLPlugin.app +                # Dullahan helper apps go inside SLPlugin.app                  if self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"): -                    for helperappfile in ('LLCefLib Helper.app', -                                          'LLCefLib Helper EH.app'): +                    for helperappfile in ('DullahanHelper.app'):                          self.path2basename(relpkgdir, helperappfile)                      pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework');                      # Putting a Frameworks directory under Contents/MacOS -                    # isn't canonical, but the path baked into LLCefLib -                    # Helper.app/Contents/MacOS/LLCefLib Helper is: +                    # isn't canonical, but the path baked into Dullahan +                    # Helper.app/Contents/MacOS/DullahanHelper is:                      # @executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework                      # (notice, not @executable_path/../Frameworks/etc.)                      # So we'll create a symlink (below) from there back to the                      # Frameworks directory nested under SLPlugin.app.                      helperframeworkpath = \ -                        self.dst_path_of('LLCefLib Helper.app/Contents/MacOS/' +                        self.dst_path_of('DullahanHelper.app/Contents/MacOS/'                                           'Frameworks/Chromium Embedded Framework.framework')                      self.end_prefix() +                    # the helper app needs to have it's @executable_path modified to point to the  +                    # same location we drop the CEF framework shortcut +                    helperexecutablepath = self.dst_path_of('SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper') +                    self.run_command('install_name_tool -change ' +                                     '"@executable_path/Chromium Embedded Framework" ' +                                     '"@executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % helperexecutablepath) +                  # SLPlugin plugins                  if self.prefix(src="", dst="llplugin"):                      self.path2basename("../media_plugins/cef/" + self.args['configuration'], @@ -874,8 +880,8 @@ class DarwinManifest(ViewerManifest):                          self.end_prefix()                      # copy LibVLC plugins folder -                    if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="plugins"): -                        self.path( "lib*_plugin.dylib" ) +                    if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="lib"): +                        self.path( "*.dylib" )                          self.path( "plugins.dat" )                          self.end_prefix() @@ -918,7 +924,7 @@ class DarwinManifest(ViewerManifest):                      # Life.app/Contents/Frameworks/Chromium Embedded Framework.framework                      origin, target = pluginframeworkpath, frameworkpath                      symlinkf(target, origin) -                    # from SLPlugin.app/Contents/Frameworks/LLCefLib +                    # from SLPlugin.app/Contents/Frameworks/Dullahan                      # Helper.app/Contents/MacOS/Frameworks/Chromium Embedded                      # Framework.framework back to                      # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework | 
