diff --git a/code/nel/include/nel/gui/group_html.h b/code/nel/include/nel/gui/group_html.h index 5cc632a4e..7a09b8281 100644 --- a/code/nel/include/nel/gui/group_html.h +++ b/code/nel/include/nel/gui/group_html.h @@ -409,6 +409,10 @@ namespace NLGUI double _TimeoutValue; // the timeout in seconds double _ConnectingTimeout; sint _RedirectsRemaining; + // Automatic page refresh + double _LastRefreshTime; + double _NextRefreshTime; + std::string _RefreshUrl; // minimal embeded lua script support // Note : any embeded script is executed immediately after the closing diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp index 205499e07..51e8e3850 100644 --- a/code/nel/src/gui/group_html.cpp +++ b/code/nel/src/gui/group_html.cpp @@ -1137,6 +1137,40 @@ namespace NLGUI } } break; + case HTML_META: + if (_ReadingHeadTag) + { + bool httpEquiv = present[HTML_META_HTTP_EQUIV] && value[HTML_META_HTTP_EQUIV]; + bool httpContent = present[HTML_META_CONTENT] && value[HTML_META_CONTENT]; + if (httpEquiv && httpContent) + { + // only first http-equiv="refresh" should be handled + if (_RefreshUrl.empty() && toLower(value[HTML_META_HTTP_EQUIV]) == "refresh") + { + const CWidgetManager::SInterfaceTimes × = CWidgetManager::getInstance()->getInterfaceTimes(); + double timeSec = times.thisFrameMs / 1000.0f; + string content(value[HTML_META_CONTENT]); + + string::size_type pos = content.find_first_of(";"); + if (pos == string::npos) + { + fromString(content, _NextRefreshTime); + _RefreshUrl = _URL; + } + else + { + fromString(content.substr(0, pos), _NextRefreshTime); + + pos = toLower(content).find("url="); + if (pos != string::npos) + _RefreshUrl = content.substr(pos + 4); + } + + _NextRefreshTime += timeSec; + } + } + } + break; case HTML_A: { CStyleParams style; @@ -2422,6 +2456,9 @@ namespace NLGUI _GroupListAdaptor = NULL; _DocumentUrl = ""; _UrlFragment.clear(); + _RefreshUrl.clear(); + _NextRefreshTime = 0.0; + _LastRefreshTime = 0.0; // Register CWidgetManager::getInstance()->registerClockMsgTarget(this); @@ -3413,8 +3450,15 @@ namespace NLGUI // Handle now handle (); } + if (systemEvent.getEventTypeExtended() == NLGUI::CEventDescriptorSystem::activecalledonparent) + { + if (!((NLGUI::CEventDescriptorActiveCalledOnParent &) systemEvent).getActive()) + { + // stop refresh when window gets hidden + _NextRefreshTime = 0; + } + } } - return traited; } @@ -4410,6 +4454,21 @@ namespace NLGUI // handle curl downloads checkDownloads(); + // handle refresh timer + if (_NextRefreshTime > 0 && _NextRefreshTime <= (times.thisFrameMs / 1000.0f) ) + { + // there might be valid uses for 0sec refresh, but two in a row is probably a mistake + if (_NextRefreshTime - _LastRefreshTime >= 1.0) + { + _LastRefreshTime = _NextRefreshTime; + doBrowse(_RefreshUrl.c_str()); + } + else + nlwarning("Ignore second 0sec http-equiv refresh in a row (url '%s')", _URL.c_str()); + + _NextRefreshTime = 0; + } + if (_Connecting) { // Check timeout if needed @@ -4783,6 +4842,8 @@ namespace NLGUI // _Browsing = true; _DocumentUrl = _URL; + _NextRefreshTime = 0; + _RefreshUrl.clear(); // clear content beginBuild();