Browse Source

#IQRV #comment [Chromium] openBrowser和closeBrowser具体调用实现

陈良瑜80374463 3 years ago
parent
commit
fc3d3402c6

+ 74 - 10
Module/mod_chromium/CModTools.cpp

@@ -393,6 +393,16 @@ namespace Chromium {
 
 	}
 
+	void CModTools::StopSingleChromiumBrowserByName(std::string cefName)
+	{
+		CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
+		strCmdLine.Append(strChromiumPath).Append(CEFCLIENT_NAME).Append(" --kill");
+		strCmdLine.Append(" --logextend=").Append(cefName.c_str());
+		DbgEx("StopChromiumBrowser cmdline:%s, current guardian main browser : %d", strCmdLine.GetData(), m_isGuardMainBrowser);
+
+		SYSTEM_ON(strCmdLine.GetData());
+	}
+
 	std::pair<bool, std::string> CModTools::getMainUrl()
 	{
 		CSimpleStringA strChromiumPath;
@@ -518,7 +528,7 @@ namespace Chromium {
 		strCmdLine.Append(strChromiumPath).Append(CEFCLIENT_NAME).Append(" --url=").Append(AdUrl.c_str());
 		CSimpleStringA cachePath;
 		this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append((+ERR_PAGE_REASON::Ad)._to_string());
+		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
 		strCmdLine.Append(" --cache-path=").Append(cachePath);
 		if (g_useMagic)
 			strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
@@ -676,7 +686,8 @@ namespace Chromium {
 		}
 		CSimpleStringA cachePath;
 		this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(isExtend ? (+ERR_PAGE_REASON::extend)._to_string() : (+ERR_PAGE_REASON::main)._to_string());
+		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "")
+			.Append(isExtend ? (+ERR_PAGE_REASON::extend)._to_string() : (+ERR_PAGE_REASON::main)._to_string());
 		//strCmdLine.Append(" --hide-controls=true")
 		strCmdLine.Append(" --cache-path=").Append(cachePath);
 		strCmdLine.Append(" --no-sandbox");
@@ -712,6 +723,46 @@ namespace Chromium {
 		return generateCefclientCmd(true, extendUrl);
 	}
 
+	std::string CModTools::generateSpecialPageFromOtherEntityCmd(std::string mainUrl)
+	{
+		CSimpleStringA cachePath;
+		CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
+		strCmdLine.Append(strChromiumPath).Append(CEFCLIENT_NAME).Append(" --url=").Append(mainUrl.c_str());
+		this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
+		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append(m_specialPage_temp_name.c_str());
+		//strCmdLine.Append(" --hide-controls=true")
+		strCmdLine.Append(" --cache-path=").Append(cachePath);
+		strCmdLine.Append(" --no-sandbox");
+		strCmdLine.Append(" --hide-controls");
+		if (g_useMagic)
+			strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
+		strCmdLine.Append(" --hide-tabs");
+		strCmdLine.Append(" --logextend=").Append(m_specialPage_temp_name.c_str());
+		if(m_specialPage_temp_size.length() > 0)
+			strCmdLine.Append(" --center-size=").Append(m_specialPage_temp_size.c_str());
+		if (m_specialPage_temp_point.length() > 0)
+			strCmdLine.Append(" --src-pos=").Append(m_specialPage_temp_point.c_str());
+
+
+#if (defined _WIN32 || defined _WIN64)
+		strCmdLine.Append(" --top=").Append(std::to_string((_LONGLONG)m_specialPage_temp_top).c_str());
+#else
+		strCmdLine.Append(" --fullscreen=0");
+		if(m_specialPage_temp_top == -1)
+			strCmdLine.Append(" --always-on-top").Append(" --fullscreen=0");
+#endif
+		
+#if (defined _WIN32 || defined _WIN64)
+		strCmdLine.Append(" --errurl=file:\/\/\/").Append(getErrUrl().second.c_str());
+#else
+		strCmdLine.Append(R"( --errurl=file:///)").Append(getErrUrl().second.c_str());
+#endif
+
+		DbgEx("cmdline : %s", strCmdLine.GetData());
+
+		return strCmdLine.GetData();
+	}
+
 	std::pair<bool, std::string> CModTools::openAdPage() {
 		if (m_isAdOpen)//only open ad in first time
 			return std::make_pair(false, "open AdPage failed! Already exist.");
@@ -785,8 +836,17 @@ namespace Chromium {
 	        if (Error_Succeed == openCefRet.first)
 	            return std::make_pair(Error_Succeed, openCefRet.second);
 		 	else 
-				Dbg("open cef for OutsideRequest failed: %d", openCefRet.first);
+				DbgEx("open cef for OutsideRequest failed: %d", openCefRet.first);
 	    }
+		 else if (reason._to_integral() == ERR_PAGE_REASON::SpecialPageFromOtherEntity)
+		{
+			auto strCmdLine = generateSpecialPageFromOtherEntityCmd(std::get<0>(normalParam));
+			auto openCefRet = openCef(strCmdLine, false);
+			if (Error_Succeed == openCefRet.first)
+				return std::make_pair(Error_Succeed, openCefRet.second);
+			else
+				Dbg("open cef for SpecialPageFromOtherEntity failed: %d", openCefRet.first);
+		}
 		else
 		{
 			//open err page
@@ -1145,21 +1205,21 @@ namespace Chromium {
         if (SP::Module::Util::ShellExecute(runStr, succStr, errStr)) {
 			if (succStr.empty()) {
 				if (ExistsFileA(execute_oldbrowser_path.c_str())) {
-					Dbg("%s exists!", execute_oldbrowser_path.c_str());
+					DbgEx("%s exists!", execute_oldbrowser_path.c_str());
 					result = 1;
 				} else {
-					Dbg("%s not exists!", execute_oldbrowser_path.c_str());
+					DbgEx("%s not exists!", execute_oldbrowser_path.c_str());
 				}
 			} else {
-				Dbg("new browser version: %s", succStr.c_str());
+				DbgEx("new browser version: %s", succStr.c_str());
 				additional = succStr;
 				if (!ExistsFileA(execute_newbrowser_path.c_str())) {
-					Dbg("%s not exists!", execute_newbrowser_path.c_str()); 
+					DbgEx("%s not exists!", execute_newbrowser_path.c_str()); 
 				}
 				result = 2;
 			}
 		} else {
-			Dbg("execute '%s' failed!", runStr.c_str());
+			DbgEx("execute '%s' failed!", runStr.c_str());
 		}
 
 		UploadBrowserInfo(result, additional.c_str());
@@ -1233,7 +1293,8 @@ namespace Chromium {
 	}
 
 	std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA> CModTools::ReadCenterConfigStr(CSimpleStringA entityName) {
-		CSimpleStringA str = "", strNew = "", strEx = "", strFulture = "", strAd = "";
+		CSimpleStringA str = "", strNew = "", strEx = "", strFulture = "", strAd = "", strCacheHead;
+		bool forceCleanCache = false;
 		CSmartPointer<IConfigInfo> spCerConfig;
 		ErrorCodeEnum err = this->m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, spCerConfig);
 		if (entityName == "")
@@ -1246,8 +1307,9 @@ namespace Chromium {
 		table.AddEntryString(entityName, "UserMgrUrlNoSidebarMuti", strEx, "");
 		table.AddEntryString(entityName, "UserMgrUrlFulture", strFulture, "");
 		table.AddEntryString(entityName, "UserMgrAd", strAd, "");
+		table.AddEntryString(entityName, "CacheHead", strCacheHead, "");
 		if (Error_Succeed == table.Load(spCerConfig))
-			Dbg(CSimpleString::Format("read centersetting config : UserMgrUrl-%s, UserMgrUrlNoSidebar-%s, UserMgrUrlNoSidebarMuti-%s, UserMgrUrlFulture-%s, UserMgrAd-%s",
+			DbgEx(CSimpleString::Format("read centersetting config : UserMgrUrl-%s, UserMgrUrlNoSidebar-%s, UserMgrUrlNoSidebarMuti-%s, UserMgrUrlFulture-%s, UserMgrAd-%s",
 				str.GetData(), strNew.GetData(), strEx.GetData(), strFulture.GetData(), strAd.GetData()));
 
 		CChromiumEntity* pChromiumEntity = reinterpret_cast<CChromiumEntity*>(m_pEntity);
@@ -1257,6 +1319,8 @@ namespace Chromium {
 			LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_USE_CUSTOM_FULTURE_URL, strTmp);
 		}
 
+		m_strCacheHead = strCacheHead.GetData();
+
 		return std::make_tuple(str, strNew, strEx, strFulture, strAd);
 	}
 

+ 17 - 3
Module/mod_chromium/CModTools.h

@@ -19,7 +19,7 @@
 namespace Chromium {
 
 	BETTER_ENUM(ERR_PAGE_REASON, int, CameraConfig, CardStoreIsBusy, MachineTypeError, TerminalManagerKickOut,
-		TerminalManagerOff, breakdown, disabled, jobuncomplete, ErrNotify, main, Ad, extend, OutsideRequest)
+		TerminalManagerOff, breakdown, disabled, jobuncomplete, ErrNotify, main, Ad, extend, OutsideRequest, SpecialPageFromOtherEntity)
 
 		BETTER_ENUM(PAGE_TYPE, int, Deploy, CameraConfig, TerminalManager, errPage, Ad, slv, init, TradeManager, breakdown, extend, CardStoreIsBusy)
 
@@ -38,6 +38,7 @@ namespace Chromium {
 			std::tuple < std::string, std::string> normalParam = std::tuple <std::string, std::string>("", ""),
 			std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam = std::tuple<std::string, std::string, std::string, DWORD, DWORD>("", "", "", 0, 0));
 		void StopChromiumBrowser(ERR_PAGE_REASON reason, bool stopAll = false);
+		void StopSingleChromiumBrowserByName(std::string cefName);
 		bool killAllChromium();	//通过taskkill 关闭掉所有的cefclient
 		void killAllChromiumByThread(int seconds);
 		bool killChromiumByName(std::string name);
@@ -54,8 +55,16 @@ namespace Chromium {
 			return m_UserMgrUrlFultureStr; 
 		}
 		void lockGuard();
-
 		void unlockGuard();
+
+		void SetSpecialPageParam(std::string t_name, std::string t_size, std::string t_point, int t_top)
+		{
+			m_specialPage_temp_name = t_name;
+			m_specialPage_temp_size = t_size;
+			m_specialPage_temp_point = t_point;
+			m_specialPage_temp_top = t_top;
+		}
+
 	private:
 		std::pair<CSimpleStringA, int>  ReadConfig();	//读本地配置,已废弃
 		std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA> ReadCenterConfigStr(CSimpleStringA entityName = "");
@@ -68,6 +77,7 @@ namespace Chromium {
 		std::string generateMainCmd(std::string mainUrl);
 		std::string generateExtendCmd(std::string extendUrl);
 		std::string generateAdCmd(std::string AdUrl);
+		std::string generateSpecialPageFromOtherEntityCmd(std::string mainUrl);
 
 		/**  [Gifur@2022125]*/
 		/**n  [Gifur@2022228]*/
@@ -108,7 +118,11 @@ namespace Chromium {
 		/** 0:使用CefClient,1:使用旧版UOS浏览器uos-browser-stable ;2:使用新版UOS浏览器org.deepin.browser  [Gifur@2022228]*/
 		int m_UseUOSBrowser;
 		bool m_isGuardMainBrowser;
-		
+
+		//for special page
+		std::string m_specialPage_temp_name, m_specialPage_temp_size, m_specialPage_temp_point;
+		int m_specialPage_temp_top;
+		std::string m_strCacheHead;
 	};
 
 	template<class T>

+ 75 - 13
Module/mod_chromium/mod_chromium.cpp

@@ -58,6 +58,11 @@ namespace Chromium {
 		m_pEntity->OpenBrowser(ctx);
 	}
 
+	void ChromiumSession::Handle_CloseBrowser(SpReqAnsContext<ChromiumSrv_CloseBrowser_Req, ChromiumSrv_CloseBrowser_Ans>::Pointer ctx)
+	{
+		m_pEntity->CloseBrowser(ctx);
+	}
+
 
 	CChromiumEntity::CChromiumEntity() :m_pWsServer(NULL), m_iTcpBridgePort(4504), m_pTimerListener(NULL), m_strCustomMainUrl(true)
 		, m_runAd(false), m_runMain(false), m_runExtend(false), m_runLogin(false), m_withBrowser(false), m_withMin(false), m_withClose(false)
@@ -140,20 +145,65 @@ namespace Chromium {
 	}
 #endif
 
+	void CChromiumEntity::CloseBrowser(SpReqAnsContext<ChromiumSrv_CloseBrowser_Req, ChromiumSrv_CloseBrowser_Ans>::Pointer ctx)
+	{
+		CSimpleString strType = ctx->Req.type;
+		CSimpleString strNmae = ctx->Req.name;
+
+		if (!strType.Compare((+ERR_PAGE_REASON::OutsideRequest)._to_string(), true))
+		{
+			CModTools::get_mutable_instance().StopSingleChromiumBrowserByName((+ERR_PAGE_REASON::OutsideRequest)._to_string());
+			ctx->Answer(ErrorCodeEnum::Error_Succeed);
+		}			
+		else if (!strType.Compare((+ERR_PAGE_REASON::SpecialPageFromOtherEntity)._to_string(), true))
+		{
+			CSimpleStringA dstBrowserName = strType + "_" + strNmae;
+			CModTools::get_mutable_instance().StopSingleChromiumBrowserByName(dstBrowserName.GetData());
+			ctx->Answer(ErrorCodeEnum::Error_Succeed);
+		}
+		else
+		{
+			ctx->Answer(ErrorCodeEnum::Error_NoTarget);
+		}
+	}
+
     void CChromiumEntity::OpenBrowser(SpReqAnsContext<ChromiumSrv_OpenBrowser_Req, ChromiumSrv_OpenBrowser_Ans>::Pointer ctx)
     {
-        CSimpleStringA strUrl = ctx->Req.mainUrl;
-        CSimpleStringA strUrl2 = ctx->Req.viceUrl;
-        if (strUrl.IsNullOrEmpty()) {
-            ctx->Answer(Error_Param);
-            return;
-        }
-        auto ret = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::OutsideRequest, std::make_tuple(strUrl.GetData(), strUrl2.GetData()));
-        ErrorCodeEnum result = ret.first;
-        DbgEx("open request browser page %s return %d", (LPCTSTR)strUrl, result);
+		std::shared_ptr<void> CleanParamFun((void*)0, [&](void*) {
+			CModTools::get_mutable_instance().SetSpecialPageParam("", "", "", 0);
+			});
+		CSimpleStringA strType = ctx->Req.type;
 
-        ctx->Answer(result);
-}
+		if (!strType.Compare((+ERR_PAGE_REASON::OutsideRequest)._to_string(), true))
+		{
+			CSimpleStringA strUrl = ctx->Req.mainUrl, strUrl2 = ctx->Req.viceUrl;
+			if (strUrl.IsNullOrEmpty()) {
+				ctx->Answer(Error_Param);
+				return;
+			}
+			auto ret = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::OutsideRequest, std::make_tuple(strUrl.GetData(), strUrl2.GetData()));
+			DbgEx("open OutsideRequest browser page %s return %d", (LPCTSTR)strUrl, ret.first);
+			ctx->Answer(ret.first);
+		}
+		else if (!strType.Compare((+ERR_PAGE_REASON::SpecialPageFromOtherEntity)._to_string(), true))
+		{
+			CSimpleStringA strUrl = ctx->Req.mainUrl, strUrl2 = ctx->Req.viceUrl, sizeParam = ctx->Req.param1
+				, pointParam = ctx->Req.param2, browserName = ctx->Req.name;
+			CSimpleStringA dstBrowserName = strType + "_" + browserName;
+
+			int browserTopZ = ctx->Req.top;
+
+			CModTools::get_mutable_instance().SetSpecialPageParam(dstBrowserName.GetData(), sizeParam.GetData(), pointParam.GetData(), browserTopZ);
+			//用一个临时变量解决,可能在高并发时有问题。
+			auto ret = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::SpecialPageFromOtherEntity, 
+				std::make_tuple(strUrl.GetData(), strUrl2.GetData()));
+			
+			DbgEx("open %s browser page %s return %d", dstBrowserName.GetData(), (LPCTSTR)strUrl, ret.first);
+			ctx->Answer(ret.first);
+		}
+		else
+			ctx->Answer(ErrorCodeEnum::Error_NoTarget);
+	}
 
 	void CChromiumEntity::OnPaused() {
 #ifdef OPEN_PERF
@@ -181,6 +231,7 @@ namespace Chromium {
 #endif
 
 #if (defined _WIN32 || defined _WIN64)
+			//SetUnhandledExceptionFilter(&printSEG);
 #else
 			CSimpleStringA strDbgPath;
 			GetFunction()->GetPath("Dbg", strDbgPath);
@@ -267,6 +318,17 @@ namespace Chromium {
 							CModTools::get_mutable_instance().setWithMin(m_withMin);
 						if (m_withClose)
 							CModTools::get_mutable_instance().setWithClose(m_withClose);
+
+
+						int forceCacheClean = false;
+						if (Error_Succeed == spConfig->ReadConfigValueInt("Chromium", "forceCacheClean", forceCacheClean) && forceCacheClean)
+						{
+							DbgEx("forceCacheClean, call OnOnBrowserCacheClean");
+							ResourceWatcher::BrowserCacheClean evt;
+							evt.needClean = 1;
+							OnBrowserCacheClean(NULL, 0, 0, evt);
+						}
+
 					}
 					else
 						DbgEx("can not find %s, use default", webMaskKey.GetData());
@@ -386,7 +448,7 @@ namespace Chromium {
 		return true;
 }
 
-	bool CChromiumEntity::OnPreStart_openWeb()
+	bool CChromiumEntity::OnPreStart_openWeb(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext)
 	{
 		//generateBussinessLimitTimer();
 #if (defined _WIN32 || defined _WIN64)
@@ -465,7 +527,7 @@ namespace Chromium {
 			if (!OnPreStart_register(strArgs, pTransactionContext)) {
 				return;
 			}
-			if (!OnPreStart_openWeb()) {
+			if (!OnPreStart_openWeb(strArgs, pTransactionContext)) {
 				return;
 			}
 		}

+ 3 - 2
Module/mod_chromium/mod_chromium.h

@@ -36,7 +36,6 @@
 
 
 
-
 #pragma once
 namespace Chromium {
 
@@ -52,6 +51,7 @@ namespace Chromium {
 		ChromiumSession(CChromiumEntity* pEntity) :m_pEntity(pEntity) {}
 		virtual ~ChromiumSession() {}
 		virtual void Handle_OpenBrowser(SpReqAnsContext<ChromiumSrv_OpenBrowser_Req, ChromiumSrv_OpenBrowser_Ans>::Pointer ctx);
+		virtual void Handle_CloseBrowser(SpReqAnsContext<ChromiumSrv_CloseBrowser_Req, ChromiumSrv_CloseBrowser_Ans>::Pointer ctx);
 
 	private:
 		CChromiumEntity* m_pEntity;
@@ -75,6 +75,7 @@ namespace Chromium {
         }
 
         void OpenBrowser(SpReqAnsContext<ChromiumSrv_OpenBrowser_Req, ChromiumSrv_OpenBrowser_Ans>::Pointer ctx);
+		void CloseBrowser(SpReqAnsContext<ChromiumSrv_CloseBrowser_Req, ChromiumSrv_CloseBrowser_Ans>::Pointer ctx);
 
 
 		virtual void OnPaused();
@@ -156,7 +157,7 @@ namespace Chromium {
 		void OnPreStart_Init(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext);
 		bool OnPreStart_socketStart(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext);
 		bool OnPreStart_register(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext);
-		bool OnPreStart_openWeb();
+		bool OnPreStart_openWeb(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext);
 		SP_BEGIN_MSG_DISPATCH_MAP(CChromiumEntity)
 #if (defined _WIN32 || defined _WIN64)
 			SP_BEGIN_ENTITY_MSG("IEBrowser")