Merge Firestorm LGPL

Thu, 12 Apr 2018 21:55:46 +0200

author
Ansariel
date
Thu, 12 Apr 2018 21:55:46 +0200
changeset 55365
866494c6b644
parent 55364
f34afa48bc19
parent 55097
5b383f623170
child 55367
f171b6bd81a3

Merge Firestorm LGPL

autobuild.xml file | annotate | diff | revisions
indra/llplugin/llpluginclassmedia.cpp file | annotate | diff | revisions
indra/llplugin/llplugincookiestore.cpp file | annotate | diff | revisions
indra/llplugin/llplugincookiestore.h file | annotate | diff | revisions
indra/llplugin/tests/llplugincookiestore_test.cpp file | annotate | diff | revisions
indra/media_plugins/cef/media_plugin_cef.cpp file | annotate | diff | revisions
indra/newview/app_settings/settings.xml file | annotate | diff | revisions
indra/newview/llappviewer.cpp file | annotate | diff | revisions
indra/newview/llstartup.cpp file | annotate | diff | revisions
indra/newview/lltextureview.cpp file | annotate | diff | revisions
indra/newview/llviewermedia.cpp file | annotate | diff | revisions
indra/newview/skins/default/xui/de/notifications.xml file | annotate | diff | revisions
indra/newview/skins/default/xui/en/menu_viewer.xml file | annotate | diff | revisions
indra/newview/skins/default/xui/en/notifications.xml file | annotate | diff | revisions
indra/newview/skins/default/xui/es/notifications.xml file | annotate | diff | revisions
indra/newview/skins/default/xui/ja/notifications.xml file | annotate | diff | revisions
indra/newview/skins/default/xui/ru/notifications.xml file | annotate | diff | revisions
     1.1 --- a/.hgtags	Sat Apr 07 12:06:15 2018 +0200
     1.2 +++ b/.hgtags	Thu Apr 12 21:55:46 2018 +0200
     1.3 @@ -572,3 +572,4 @@
     1.4  ad0e15543836d64d6399d28b32852510435e344a 5.1.0-release
     1.5  26d9e9bb166a9a417f35b1863223a597af8185fd 5.1.1-release
     1.6  2eb917875efdfe920680b9049302d0f03721245d 5.1.2-release
     1.7 +7c00e5b6cb3d95712e9d8e29277c805bca2bda90 5.1.3-release
     2.1 --- a/autobuild.xml	Sat Apr 07 12:06:15 2018 +0200
     2.2 +++ b/autobuild.xml	Thu Apr 12 21:55:46 2018 +0200
     2.3 @@ -756,9 +756,9 @@
     2.4              <key>archive</key>
     2.5              <map>
     2.6                <key>hash</key>
     2.7 -              <string>bbdea742f2a89bcd6360e61e01d6be93</string>
     2.8 -              <key>url</key>
     2.9 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8207/32592/dullahan-1.1.820_3.3071.1637.gcb6cf75-darwin64-508196.tar.bz2</string>
    2.10 +              <string>118987b1a5b56214cfdbd0c763e180da</string>
    2.11 +              <key>url</key>
    2.12 +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/15127/97748/dullahan-1.1.1080_3.3325.1750.gaabe4c4-darwin64-513449.tar.bz2</string>
    2.13              </map>
    2.14              <key>name</key>
    2.15              <string>darwin64</string>
    2.16 @@ -792,9 +792,9 @@
    2.17              <key>archive</key>
    2.18              <map>
    2.19                <key>hash</key>
    2.20 -              <string>31e11a74e0d3f1e5e4036cb5fea8d944</string>
    2.21 -              <key>url</key>
    2.22 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8209/32599/dullahan-1.1.820_3.3071.1634.g9cc59c8-windows-508196.tar.bz2</string>
    2.23 +              <string>2ecc71350b30a1057091b9cd7af18b1c</string>
    2.24 +              <key>url</key>
    2.25 +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/15128/97755/dullahan-1.1.1080_3.3325.1750.gaabe4c4-windows-513449.tar.bz2</string>
    2.26              </map>
    2.27              <key>name</key>
    2.28              <string>windows</string>
    2.29 @@ -804,16 +804,16 @@
    2.30              <key>archive</key>
    2.31              <map>
    2.32                <key>hash</key>
    2.33 -              <string>f965d244e7921c06ee79b68a4abcea3b</string>
    2.34 -              <key>url</key>
    2.35 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8208/32602/dullahan-1.1.820_3.3071.1634.g9cc59c8-windows64-508196.tar.bz2</string>
    2.36 +              <string>2ed3e49388514dafb907c59a209d580e</string>
    2.37 +              <key>url</key>
    2.38 +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/15129/97760/dullahan-1.1.1080_3.3325.1750.gaabe4c4-windows64-513449.tar.bz2</string>
    2.39              </map>
    2.40              <key>name</key>
    2.41              <string>windows64</string>
    2.42            </map>
    2.43          </map>
    2.44          <key>version</key>
    2.45 -        <string>1.1.820_3.3071.1634.g9cc59c8</string>
    2.46 +        <string>1.1.1080_3.3325.1750.gaabe4c4</string>
    2.47        </map>
    2.48        <key>elfio</key>
    2.49        <map>
    2.50 @@ -3630,9 +3630,9 @@
    2.51              <key>archive</key>
    2.52              <map>
    2.53                <key>hash</key>
    2.54 -              <string>c5e6d9440e3a4a12102dd2bbb703963e</string>
    2.55 -              <key>url</key>
    2.56 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/2225/4736/vlc_bin-2.2.4.502214-darwin64-502214.tar.bz2</string>
    2.57 +              <string>e5635e173c75dc0675b48ab5f5e4868b</string>
    2.58 +              <key>url</key>
    2.59 +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/12143/71451/vlc_bin-2.2.8.511703-darwin64-511703.tar.bz2</string>
    2.60              </map>
    2.61              <key>name</key>
    2.62              <string>darwin64</string>
    2.63 @@ -3666,9 +3666,9 @@
    2.64              <key>archive</key>
    2.65              <map>
    2.66                <key>hash</key>
    2.67 -              <string>dc37f7cc77a62891bb9ae46c9e19f95e</string>
    2.68 -              <key>url</key>
    2.69 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1219/2834/vlc_bin-2.2.4.501207-windows-501207.tar.bz2</string>
    2.70 +              <string>add560654a53cb1c554044a4fac3c718</string>
    2.71 +              <key>url</key>
    2.72 +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/12144/71458/vlc_bin-2.2.8.511703-windows-511703.tar.bz2</string>
    2.73              </map>
    2.74              <key>name</key>
    2.75              <string>windows</string>
    2.76 @@ -3678,16 +3678,16 @@
    2.77              <key>archive</key>
    2.78              <map>
    2.79                <key>hash</key>
    2.80 -              <string>148ee599afeba9794de14ca433389504</string>
    2.81 -              <key>url</key>
    2.82 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1218/2829/vlc_bin-2.2.4.501207-windows64-501207.tar.bz2</string>
    2.83 +              <string>94bf04b49acc1e1bf2c06e2232f8a083</string>
    2.84 +              <key>url</key>
    2.85 +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/12145/71463/vlc_bin-2.2.8.511703-windows64-511703.tar.bz2</string>
    2.86              </map>
    2.87              <key>name</key>
    2.88              <string>windows64</string>
    2.89            </map>
    2.90          </map>
    2.91          <key>version</key>
    2.92 -        <string>2.2.4.502214</string>
    2.93 +        <string>2.2.8.511703</string>
    2.94        </map>
    2.95        <key>xmlrpc-epi</key>
    2.96        <map>
     3.1 --- a/indra/cmake/00-Common.cmake	Sat Apr 07 12:06:15 2018 +0200
     3.2 +++ b/indra/cmake/00-Common.cmake	Thu Apr 12 21:55:46 2018 +0200
     3.3 @@ -157,11 +157,9 @@
     3.4    if ( ${FORTIFY_SOURCE_RES} EQUAL 0 )
     3.5     add_definitions(-D_FORTIFY_SOURCE=2)
     3.6    endif()
     3.7 -  set(CMAKE_CXX_FLAGS "-Wno-deprecated -Wno-unused-but-set-variable -Wno-unused-variable -Wno-placement-new ${CMAKE_CXX_FLAGS}")
     3.8  
     3.9    # gcc 4.3 and above don't like the LL boost and also
    3.10    # cause warnings due to our use of deprecated headers
    3.11 -  add_definitions(-Wno-parentheses)
    3.12  
    3.13    add_definitions(
    3.14        -D_REENTRANT
    3.15 @@ -176,18 +174,9 @@
    3.16        -pthread
    3.17        )
    3.18  
    3.19 -  # <FS:ND> Enable C++11 support + gnu extensions
    3.20 -  add_definitions(-std=gnu++11)
    3.21 -  # </FS:ND>
    3.22 -
    3.23 -  # <FS:ND> Enable old C++ ABI
    3.24 -  add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
    3.25 -  # </FS:ND>
    3.26 -
    3.27    # force this platform to accept TOS via external browser <FS:ND> No, do not.
    3.28    # add_definitions(-DEXTERNAL_TOS)
    3.29  
    3.30 -
    3.31    add_definitions(-DAPPID=secondlife)
    3.32    add_compile_options(-fvisibility=hidden)
    3.33    # don't catch SIGCHLD in our base application class for the viewer - some of
     4.1 --- a/indra/llplugin/CMakeLists.txt	Sat Apr 07 12:06:15 2018 +0200
     4.2 +++ b/indra/llplugin/CMakeLists.txt	Thu Apr 12 21:55:46 2018 +0200
     4.3 @@ -29,7 +29,6 @@
     4.4  
     4.5  set(llplugin_SOURCE_FILES
     4.6      llpluginclassmedia.cpp
     4.7 -    llplugincookiestore.cpp
     4.8      llplugininstance.cpp
     4.9      llpluginmessage.cpp
    4.10      llpluginmessagepipe.cpp
    4.11 @@ -43,7 +42,6 @@
    4.12  
    4.13      llpluginclassmedia.h
    4.14      llpluginclassmediaowner.h
    4.15 -    llplugincookiestore.h
    4.16      llplugininstance.h
    4.17      llpluginmessage.h
    4.18      llpluginmessageclasses.h
    4.19 @@ -70,20 +68,3 @@
    4.20  
    4.21  add_subdirectory(slplugin)
    4.22  
    4.23 -# Add tests
    4.24 -if (LL_TESTS)
    4.25 -    include(LLAddBuildTest)
    4.26 -    # UNIT TESTS
    4.27 -    SET(llplugin_TEST_SOURCE_FILES
    4.28 -      llplugincookiestore.cpp
    4.29 -      )
    4.30 -
    4.31 -    # llplugincookiestore has a dependency on curl, so we need to link the curl library into the test.
    4.32 -    set_source_files_properties(
    4.33 -      llplugincookiestore.cpp
    4.34 -      PROPERTIES
    4.35 -        LL_TEST_ADDITIONAL_LIBRARIES "${CURL_LIBRARIES};${NGHTTP2_LIBRARIES}"
    4.36 -      )
    4.37 -
    4.38 -    LL_ADD_PROJECT_UNIT_TESTS(llplugin "${llplugin_TEST_SOURCE_FILES}")
    4.39 -endif (LL_TESTS)
     5.1 --- a/indra/llplugin/llpluginclassmedia.cpp	Sat Apr 07 12:06:15 2018 +0200
     5.2 +++ b/indra/llplugin/llpluginclassmedia.cpp	Thu Apr 12 21:55:46 2018 +0200
     5.3 @@ -31,6 +31,9 @@
     5.4  
     5.5  #include "llpluginclassmedia.h"
     5.6  #include "llpluginmessageclasses.h"
     5.7 +#include "llcontrol.h"
     5.8 +
     5.9 +extern LLControlGroup gSavedSettings;    
    5.10  
    5.11  static int LOW_PRIORITY_TEXTURE_SIZE_DEFAULT = 256;
    5.12  
    5.13 @@ -794,15 +797,22 @@
    5.14  	return result;
    5.15  }
    5.16  
    5.17 -void LLPluginClassMedia::sendPickFileResponse(const std::string &file)
    5.18 +void LLPluginClassMedia::sendPickFileResponse(const std::vector<std::string> files)
    5.19  {
    5.20  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file_response");
    5.21 -	message.setValue("file", file);
    5.22  	if(mPlugin && mPlugin->isBlocked())
    5.23  	{
    5.24  		// If the plugin sent a blocking pick-file request, the response should unblock it.
    5.25  		message.setValueBoolean("blocking_response", true);
    5.26  	}
    5.27 +
    5.28 +	LLSD file_list = LLSD::emptyArray();
    5.29 +	for (std::vector<std::string>::const_iterator in_iter = files.begin(); in_iter != files.end(); ++in_iter)
    5.30 +	{
    5.31 +		file_list.append(LLSD::String(*in_iter));
    5.32 +	}
    5.33 +	message.setValueLLSD("file_list", file_list);
    5.34 +
    5.35  	sendMessage(message);
    5.36  }
    5.37  
    5.38 @@ -838,11 +848,17 @@
    5.39  	sendMessage(message);
    5.40  }
    5.41  
    5.42 -void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path_cache, const std::string &user_data_path_cookies)
    5.43 +void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path_cache,
    5.44 +										 const std::string &user_data_path_cookies,
    5.45 +										 const std::string &user_data_path_cef_log)
    5.46  {
    5.47  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_user_data_path");
    5.48  	message.setValue("cache_path", user_data_path_cache);
    5.49  	message.setValue("cookies_path", user_data_path_cookies);
    5.50 +	message.setValue("cef_log_file", user_data_path_cef_log);
    5.51 +
    5.52 +	bool cef_verbose_log = gSavedSettings.getBOOL("CefVerboseLog");
    5.53 +	message.setValueBoolean("cef_verbose_log", cef_verbose_log);
    5.54  	sendMessage(message);
    5.55  }
    5.56  
    5.57 @@ -1102,6 +1118,7 @@
    5.58  		}
    5.59  		else if(message_name == "pick_file")
    5.60  		{
    5.61 +			mIsMultipleFilePick = message.getValueBoolean("multiple_files");
    5.62  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PICK_FILE_REQUEST);
    5.63  		}
    5.64  		else if(message_name == "auth_request")
    5.65 @@ -1163,7 +1180,12 @@
    5.66  		{
    5.67  			mClickURL = message.getValue("uri");
    5.68  			mClickTarget = message.getValue("target");
    5.69 -			//mClickUUID = message.getValue("uuid");
    5.70 +
    5.71 +			// need a link to have a UUID that identifies it to a system further
    5.72 +			// upstream - plugin could make it but we have access to LLUUID here
    5.73 +			// so why don't we use it
    5.74 +			mClickUUID = LLUUID::generateNewID().asString();
    5.75 +
    5.76  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_HREF);
    5.77  		}
    5.78  		else if(message_name == "click_nofollow")
    5.79 @@ -1178,13 +1200,6 @@
    5.80  			mStatusCode = message.getValueS32("status_code");
    5.81  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_ERROR_PAGE);
    5.82  		}
    5.83 -		else if(message_name == "cookie_set")
    5.84 -		{
    5.85 -			if(mOwner)
    5.86 -			{
    5.87 -				mOwner->handleCookieSet(this, message.getValue("cookie"));
    5.88 -			}
    5.89 -		}
    5.90  		else if(message_name == "close_request")
    5.91  		{
    5.92  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLOSE_REQUEST);
    5.93 @@ -1299,14 +1314,7 @@
    5.94  	sendMessage(message);
    5.95  }
    5.96  
    5.97 -void LLPluginClassMedia::set_cookies(const std::string &cookies)
    5.98 -{
    5.99 -	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_cookies");
   5.100 -	message.setValue("cookies", cookies);
   5.101 -	sendMessage(message);
   5.102 -}
   5.103 -
   5.104 -void LLPluginClassMedia::enable_cookies(bool enable)
   5.105 +void LLPluginClassMedia::cookies_enabled(bool enable)
   5.106  {
   5.107  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "cookies_enabled");
   5.108  	message.setValueBoolean("enable", enable);
     6.1 --- a/indra/llplugin/llpluginclassmedia.h	Sat Apr 07 12:06:15 2018 +0200
     6.2 +++ b/indra/llplugin/llpluginclassmedia.h	Thu Apr 12 21:55:46 2018 +0200
     6.3 @@ -176,7 +176,7 @@
     6.4  	
     6.5  	F64 getCPUUsage();
     6.6  	
     6.7 -	void sendPickFileResponse(const std::string &file);
     6.8 +	void sendPickFileResponse(const std::vector<std::string> files);
     6.9  
    6.10  	void sendAuthResponse(bool ok, const std::string &username, const std::string &password);
    6.11  
    6.12 @@ -195,7 +195,7 @@
    6.13  	bool	canPaste() const { return mCanPaste; };
    6.14  	
    6.15  	// These can be called before init(), and they will be queued and sent before the media init message.
    6.16 -	void	setUserDataPath(const std::string &user_data_path_cache, const std::string &user_data_path_cookies);
    6.17 +	void	setUserDataPath(const std::string &user_data_path_cache, const std::string &user_data_path_cookies, const std::string &user_data_path_cef_log);
    6.18  	void	setLanguageCode(const std::string &language_code);
    6.19  	void	setPluginsEnabled(const bool enabled);
    6.20  	void	setJavascriptEnabled(const bool enabled);
    6.21 @@ -210,7 +210,7 @@
    6.22  	void clear_cache();
    6.23  	void clear_cookies();
    6.24  	void set_cookies(const std::string &cookies);
    6.25 -	void enable_cookies(bool enable);
    6.26 +	void cookies_enabled(bool enable);
    6.27  	void proxy_setup(bool enable, const std::string &host = LLStringUtil::null, int port = 0);
    6.28  	void browse_stop();
    6.29  	void browse_reload(bool ignore_cache = false);
    6.30 @@ -277,6 +277,9 @@
    6.31  	std::string	getAuthURL() const { return mAuthURL; };
    6.32  	std::string	getAuthRealm() const { return mAuthRealm; };
    6.33  
    6.34 +	// These are valid during MEDIA_EVENT_PICK_FILE_REQUEST
    6.35 +	bool getIsMultipleFilePick() const { return mIsMultipleFilePick; }
    6.36 +
    6.37  	// These are valid during MEDIA_EVENT_LINK_HOVERED
    6.38  	std::string	getHoverText() const { return mHoverText; };
    6.39  	std::string	getHoverLink() const { return mHoverLink; };
    6.40 @@ -435,6 +438,7 @@
    6.41  	std::string		mHoverText;
    6.42  	std::string		mHoverLink;
    6.43  	std::string     mFileDownloadFilename;
    6.44 +	bool			mIsMultipleFilePick;
    6.45  	
    6.46  	/////////////////////////////////////////
    6.47  	// media_time class
     7.1 --- a/indra/llplugin/llpluginclassmediaowner.h	Sat Apr 07 12:06:15 2018 +0200
     7.2 +++ b/indra/llplugin/llpluginclassmediaowner.h	Thu Apr 12 21:55:46 2018 +0200
     7.3 @@ -1,4 +1,4 @@
     7.4 -/** 
     7.5 +/**
     7.6   * @file llpluginclassmediaowner.h
     7.7   * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
     7.8   *
     7.9 @@ -6,21 +6,21 @@
    7.10   * $LicenseInfo:firstyear=2008&license=viewerlgpl$
    7.11   * Second Life Viewer Source Code
    7.12   * Copyright (C) 2010, Linden Research, Inc.
    7.13 - * 
    7.14 + *
    7.15   * This library is free software; you can redistribute it and/or
    7.16   * modify it under the terms of the GNU Lesser General Public
    7.17   * License as published by the Free Software Foundation;
    7.18   * version 2.1 of the License only.
    7.19 - * 
    7.20 + *
    7.21   * This library is distributed in the hope that it will be useful,
    7.22   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    7.23   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    7.24   * Lesser General Public License for more details.
    7.25 - * 
    7.26 + *
    7.27   * You should have received a copy of the GNU Lesser General Public
    7.28   * License along with this library; if not, write to the Free Software
    7.29   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    7.30 - * 
    7.31 + *
    7.32   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
    7.33   * $/LicenseInfo$
    7.34   * @endcond
    7.35 @@ -34,18 +34,17 @@
    7.36  #include <queue>
    7.37  
    7.38  class LLPluginClassMedia;
    7.39 -class LLPluginCookieStore;
    7.40  
    7.41  class LLPluginClassMediaOwner
    7.42  {
    7.43  public:
    7.44  	typedef enum
    7.45  	{
    7.46 -		MEDIA_EVENT_CONTENT_UPDATED,		// contents/dirty rect have updated 
    7.47 +		MEDIA_EVENT_CONTENT_UPDATED,		// contents/dirty rect have updated
    7.48  		MEDIA_EVENT_TIME_DURATION_UPDATED,	// current time and/or duration have updated
    7.49  		MEDIA_EVENT_SIZE_CHANGED,			// media size has changed
    7.50  		MEDIA_EVENT_CURSOR_CHANGED,			// plugin has requested a cursor change
    7.51 -		
    7.52 +
    7.53  		MEDIA_EVENT_NAVIGATE_BEGIN,			// browser has begun navigation
    7.54  		MEDIA_EVENT_NAVIGATE_COMPLETE,		// browser has finished navigation
    7.55  		MEDIA_EVENT_PROGRESS_UPDATED,		// browser has updated loading progress
    7.56 @@ -58,8 +57,8 @@
    7.57  		MEDIA_EVENT_CLOSE_REQUEST,			// The plugin requested its window be closed (currently hooked up to javascript window.close in webkit)
    7.58  		MEDIA_EVENT_PICK_FILE_REQUEST,		// The plugin wants the user to pick a file
    7.59  		MEDIA_EVENT_GEOMETRY_CHANGE,		// The plugin requested its window geometry be changed (per the javascript window interface)
    7.60 -	
    7.61 -		MEDIA_EVENT_PLUGIN_FAILED_LAUNCH,	// The plugin failed to launch 
    7.62 +
    7.63 +		MEDIA_EVENT_PLUGIN_FAILED_LAUNCH,	// The plugin failed to launch
    7.64  		MEDIA_EVENT_PLUGIN_FAILED,			// The plugin died unexpectedly
    7.65  
    7.66  		MEDIA_EVENT_AUTH_REQUEST,			// The plugin wants to display an auth dialog
    7.67 @@ -69,9 +68,9 @@
    7.68  		MEDIA_EVENT_DEBUG_MESSAGE,			// plugin sending back debug information for host to process
    7.69  
    7.70  		MEDIA_EVENT_LINK_HOVERED			// Got a "link hovered" event from the plugin
    7.71 -		
    7.72 +
    7.73  	} EMediaEvent;
    7.74 -	
    7.75 +
    7.76  	typedef enum
    7.77  	{
    7.78  		MEDIA_NONE,			// Uninitialized -- no useful state
    7.79 @@ -81,12 +80,11 @@
    7.80  		MEDIA_PLAYING,		// playing (only for time-based media)
    7.81  		MEDIA_PAUSED,		// paused (only for time-based media)
    7.82  		MEDIA_DONE			// finished playing (only for time-based media)
    7.83 -	
    7.84 +
    7.85  	} EMediaStatus;
    7.86 -	
    7.87 +
    7.88  	virtual ~LLPluginClassMediaOwner() {};
    7.89  	virtual void handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent /*event*/) {};
    7.90 -	virtual void handleCookieSet(LLPluginClassMedia* /*self*/, const std::string &/*cookie*/) {};
    7.91  };
    7.92  
    7.93  #endif // LL_LLPLUGINCLASSMEDIAOWNER_H
     8.1 --- a/indra/llplugin/llplugincookiestore.cpp	Sat Apr 07 12:06:15 2018 +0200
     8.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.3 @@ -1,689 +0,0 @@
     8.4 -/** 
     8.5 - * @file llplugincookiestore.cpp
     8.6 - * @brief LLPluginCookieStore provides central storage for http cookies used by plugins
     8.7 - *
     8.8 - * @cond
     8.9 - * $LicenseInfo:firstyear=2010&license=viewerlgpl$
    8.10 - * Second Life Viewer Source Code
    8.11 - * Copyright (C) 2010, Linden Research, Inc.
    8.12 - * 
    8.13 - * This library is free software; you can redistribute it and/or
    8.14 - * modify it under the terms of the GNU Lesser General Public
    8.15 - * License as published by the Free Software Foundation;
    8.16 - * version 2.1 of the License only.
    8.17 - * 
    8.18 - * This library is distributed in the hope that it will be useful,
    8.19 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
    8.20 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    8.21 - * Lesser General Public License for more details.
    8.22 - * 
    8.23 - * You should have received a copy of the GNU Lesser General Public
    8.24 - * License along with this library; if not, write to the Free Software
    8.25 - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    8.26 - * 
    8.27 - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
    8.28 - * $/LicenseInfo$
    8.29 - * @endcond
    8.30 - */
    8.31 -
    8.32 -#include "linden_common.h"
    8.33 -#include "llstl.h"
    8.34 -#include "indra_constants.h"
    8.35 -
    8.36 -#include "llplugincookiestore.h"
    8.37 -#include <iostream>
    8.38 -
    8.39 -// for curl_getdate() (apparently parsing RFC 1123 dates is hard)
    8.40 -#include <curl/curl.h>
    8.41 -
    8.42 -LLPluginCookieStore::LLPluginCookieStore():
    8.43 -	mHasChangedCookies(false)
    8.44 -{
    8.45 -}
    8.46 -
    8.47 -
    8.48 -LLPluginCookieStore::~LLPluginCookieStore()
    8.49 -{
    8.50 -	clearCookies();
    8.51 -}
    8.52 -
    8.53 -
    8.54 -LLPluginCookieStore::Cookie::Cookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end):
    8.55 -	mCookie(s, cookie_start, cookie_end - cookie_start),
    8.56 -	mNameStart(0), mNameEnd(0),
    8.57 -	mValueStart(0), mValueEnd(0),
    8.58 -	mDomainStart(0), mDomainEnd(0),
    8.59 -	mPathStart(0), mPathEnd(0),
    8.60 -	mDead(false), mChanged(true)
    8.61 -{
    8.62 -}
    8.63 -
    8.64 -LLPluginCookieStore::Cookie *LLPluginCookieStore::Cookie::createFromString(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, const std::string &host)
    8.65 -{
    8.66 -	Cookie *result = new Cookie(s, cookie_start, cookie_end);
    8.67 -
    8.68 -	if(!result->parse(host))
    8.69 -	{
    8.70 -		delete result;
    8.71 -		result = NULL;
    8.72 -	}
    8.73 -	
    8.74 -	return result;
    8.75 -}
    8.76 -
    8.77 -std::string LLPluginCookieStore::Cookie::getKey() const
    8.78 -{
    8.79 -	std::string result;
    8.80 -	if(mDomainEnd > mDomainStart)
    8.81 -	{
    8.82 -		result += mCookie.substr(mDomainStart, mDomainEnd - mDomainStart);
    8.83 -	}
    8.84 -	result += ';';
    8.85 -	if(mPathEnd > mPathStart)
    8.86 -	{
    8.87 -		result += mCookie.substr(mPathStart, mPathEnd - mPathStart);
    8.88 -	}
    8.89 -	result += ';';
    8.90 -	result += mCookie.substr(mNameStart, mNameEnd - mNameStart);
    8.91 -	return result;
    8.92 -}
    8.93 -
    8.94 -std::string LLPluginCookieStore::Cookie::getDomain() const
    8.95 -{
    8.96 -	std::string result;
    8.97 -	if(mDomainEnd > mDomainStart)
    8.98 -	{
    8.99 -		result += mCookie.substr(mDomainStart, mDomainEnd - mDomainStart);
   8.100 -	}
   8.101 -	return result;
   8.102 -}
   8.103 -
   8.104 -bool LLPluginCookieStore::Cookie::parse(const std::string &host)
   8.105 -{
   8.106 -	bool first_field = true;
   8.107 -
   8.108 -	std::string::size_type cookie_end = mCookie.size();
   8.109 -	std::string::size_type field_start = 0;
   8.110 -
   8.111 -	LL_DEBUGS("CookieStoreParse") << "parsing cookie: " << mCookie << LL_ENDL;
   8.112 -	while(field_start < cookie_end)
   8.113 -	{
   8.114 -		// Finding the start of the next field requires honoring special quoting rules
   8.115 -		// see the definition of 'quoted-string' in rfc2616 for details
   8.116 -		std::string::size_type next_field_start = findFieldEnd(field_start);
   8.117 -
   8.118 -		// The end of this field should not include the terminating ';' or any trailing whitespace
   8.119 -		std::string::size_type field_end = mCookie.find_last_not_of("; ", next_field_start);
   8.120 -		if(field_end == std::string::npos || field_end < field_start)
   8.121 -		{
   8.122 -			// This field was empty or all whitespace.  Set end = start so it shows as empty.
   8.123 -			field_end = field_start;
   8.124 -		}
   8.125 -		else if (field_end < next_field_start)
   8.126 -		{
   8.127 -			// we actually want the index of the char _after_ what 'last not of' found
   8.128 -			++field_end;
   8.129 -		}
   8.130 -		
   8.131 -		// find the start of the actual name (skip separator and possible whitespace)
   8.132 -		std::string::size_type name_start = mCookie.find_first_not_of("; ", field_start);
   8.133 -		if(name_start == std::string::npos || name_start > next_field_start)
   8.134 -		{
   8.135 -			// Again, nothing but whitespace.
   8.136 -			name_start = field_start;
   8.137 -		}
   8.138 -		
   8.139 -		// the name and value are separated by the first equals sign
   8.140 -		std::string::size_type name_value_sep = mCookie.find_first_of("=", name_start);
   8.141 -		if(name_value_sep == std::string::npos || name_value_sep > field_end)
   8.142 -		{
   8.143 -			// No separator found, so this is a field without an = 
   8.144 -			name_value_sep = field_end;
   8.145 -		}
   8.146 -		
   8.147 -		// the name end is before the name-value separator
   8.148 -		std::string::size_type name_end = mCookie.find_last_not_of("= ", name_value_sep);
   8.149 -		if(name_end == std::string::npos || name_end < name_start)
   8.150 -		{
   8.151 -			// I'm not sure how we'd hit this case... it seems like it would have to be an empty name.
   8.152 -			name_end = name_start;
   8.153 -		}
   8.154 -		else if (name_end < name_value_sep)
   8.155 -		{
   8.156 -			// we actually want the index of the char _after_ what 'last not of' found
   8.157 -			++name_end;
   8.158 -		}
   8.159 -		
   8.160 -		// Value is between the name-value sep and the end of the field.
   8.161 -		std::string::size_type value_start = mCookie.find_first_not_of("= ", name_value_sep);
   8.162 -		if(value_start == std::string::npos || value_start > field_end)
   8.163 -		{
   8.164 -			// All whitespace or empty value
   8.165 -			value_start = field_end;
   8.166 -		}
   8.167 -		std::string::size_type value_end = mCookie.find_last_not_of("; ", field_end);
   8.168 -		if(value_end == std::string::npos || value_end < value_start)
   8.169 -		{
   8.170 -			// All whitespace or empty value
   8.171 -			value_end = value_start;
   8.172 -		}
   8.173 -		else if (value_end < field_end)
   8.174 -		{
   8.175 -			// we actually want the index of the char _after_ what 'last not of' found
   8.176 -			++value_end;
   8.177 -		}
   8.178 -
   8.179 -		LL_DEBUGS("CookieStoreParse") 
   8.180 -			<< "    field name: \"" << mCookie.substr(name_start, name_end - name_start) 
   8.181 -			<< "\", value: \"" << mCookie.substr(value_start, value_end - value_start) << "\""
   8.182 -			<< LL_ENDL;
   8.183 -				
   8.184 -		// See whether this field is one we know
   8.185 -		if(first_field)
   8.186 -		{
   8.187 -			// The first field is the name=value pair
   8.188 -			mNameStart = name_start;
   8.189 -			mNameEnd = name_end;
   8.190 -			mValueStart = value_start;
   8.191 -			mValueEnd = value_end;
   8.192 -			first_field = false;
   8.193 -		}
   8.194 -		else
   8.195 -		{
   8.196 -			// Subsequent fields must come from the set in rfc2109
   8.197 -			if(matchName(name_start, name_end, "expires"))
   8.198 -			{
   8.199 -				std::string date_string(mCookie, value_start, value_end - value_start); 
   8.200 -				// If the cookie contains an "expires" field, it MUST contain a parsable date.
   8.201 -				
   8.202 -				// HACK: LLDate apparently can't PARSE an rfc1123-format date, even though it can GENERATE one.
   8.203 -				//  The curl function curl_getdate can do this, but I'm hesitant to unilaterally introduce a curl dependency in LLDate.
   8.204 -#if 1
   8.205 -				time_t date = curl_getdate(date_string.c_str(), NULL );
   8.206 -				mDate.secondsSinceEpoch((F64)date);
   8.207 -				LL_DEBUGS("CookieStoreParse") << "        expire date parsed to: " << mDate.asRFC1123() << LL_ENDL;
   8.208 -#else
   8.209 -				// This doesn't work (rfc1123-format dates cause it to fail)
   8.210 -				if(!mDate.fromString(date_string))
   8.211 -				{
   8.212 -					// Date failed to parse.
   8.213 -					LL_WARNS("CookieStoreParse") << "failed to parse cookie's expire date: " << date << LL_ENDL;
   8.214 -					return false;
   8.215 -				}
   8.216 -#endif
   8.217 -			}
   8.218 -			else if(matchName(name_start, name_end, "domain"))
   8.219 -			{
   8.220 -				mDomainStart = value_start;
   8.221 -				mDomainEnd = value_end;
   8.222 -			}
   8.223 -			else if(matchName(name_start, name_end, "path"))
   8.224 -			{
   8.225 -				mPathStart = value_start;
   8.226 -				mPathEnd = value_end;
   8.227 -			}
   8.228 -			else if(matchName(name_start, name_end, "max-age"))
   8.229 -			{
   8.230 -				// TODO: how should we handle this?
   8.231 -			}
   8.232 -			else if(matchName(name_start, name_end, "secure"))
   8.233 -			{
   8.234 -				// We don't care about the value of this field (yet)
   8.235 -			}
   8.236 -			else if(matchName(name_start, name_end, "version"))
   8.237 -			{
   8.238 -				// We don't care about the value of this field (yet)
   8.239 -			}
   8.240 -			else if(matchName(name_start, name_end, "comment"))
   8.241 -			{
   8.242 -				// We don't care about the value of this field (yet)
   8.243 -			}
   8.244 -			else if(matchName(name_start, name_end, "httponly"))
   8.245 -			{
   8.246 -				// We don't care about the value of this field (yet)
   8.247 -			}
   8.248 -			else
   8.249 -			{
   8.250 -				// An unknown field is a parse failure
   8.251 -				LL_WARNS("CookieStoreParse") << "unexpected field name: " << mCookie.substr(name_start, name_end - name_start) << LL_ENDL;
   8.252 -				return false;
   8.253 -			}
   8.254 -			
   8.255 -		}
   8.256 -
   8.257 -		
   8.258 -		// move on to the next field, skipping this field's separator and any leading whitespace
   8.259 -		field_start = mCookie.find_first_not_of("; ", next_field_start);
   8.260 -	}
   8.261 -		
   8.262 -	// The cookie MUST have a name
   8.263 -	if(mNameEnd <= mNameStart)
   8.264 -		return false;
   8.265 -	
   8.266 -	// If the cookie doesn't have a domain, add the current host as the domain.
   8.267 -	if(mDomainEnd <= mDomainStart)
   8.268 -	{
   8.269 -		if(host.empty())
   8.270 -		{
   8.271 -			// no domain and no current host -- this is a parse failure.
   8.272 -			return false;
   8.273 -		}
   8.274 -		
   8.275 -		// Figure out whether this cookie ended with a ";" or not...
   8.276 -		std::string::size_type last_char = mCookie.find_last_not_of(" ");
   8.277 -		if((last_char != std::string::npos) && (mCookie[last_char] != ';'))
   8.278 -		{
   8.279 -			mCookie += ";";
   8.280 -		}
   8.281 -		
   8.282 -		mCookie += " domain=";
   8.283 -		mDomainStart = mCookie.size();
   8.284 -		mCookie += host;
   8.285 -		mDomainEnd = mCookie.size();
   8.286 -		
   8.287 -		LL_DEBUGS("CookieStoreParse") << "added domain (" << mDomainStart << " to " << mDomainEnd << "), new cookie is: " << mCookie << LL_ENDL;
   8.288 -	}
   8.289 -
   8.290 -	// If the cookie doesn't have a path, add "/".
   8.291 -	if(mPathEnd <= mPathStart)
   8.292 -	{
   8.293 -		// Figure out whether this cookie ended with a ";" or not...
   8.294 -		std::string::size_type last_char = mCookie.find_last_not_of(" ");
   8.295 -		if((last_char != std::string::npos) && (mCookie[last_char] != ';'))
   8.296 -		{
   8.297 -			mCookie += ";";
   8.298 -		}
   8.299 -		
   8.300 -		mCookie += " path=";
   8.301 -		mPathStart = mCookie.size();
   8.302 -		mCookie += "/";
   8.303 -		mPathEnd = mCookie.size();
   8.304 -		
   8.305 -		LL_DEBUGS("CookieStoreParse") << "added path (" << mPathStart << " to " << mPathEnd << "), new cookie is: " << mCookie << LL_ENDL;
   8.306 -	}
   8.307 -	
   8.308 -	
   8.309 -	return true;
   8.310 -}
   8.311 -
   8.312 -std::string::size_type LLPluginCookieStore::Cookie::findFieldEnd(std::string::size_type start, std::string::size_type end)
   8.313 -{
   8.314 -	std::string::size_type result = start;
   8.315 -	
   8.316 -	if(end == std::string::npos)
   8.317 -		end = mCookie.size();
   8.318 -	
   8.319 -	bool in_quotes = false;
   8.320 -	for(; (result < end); result++)
   8.321 -	{
   8.322 -		switch(mCookie[result])
   8.323 -		{
   8.324 -			case '\\':
   8.325 -				if(in_quotes)
   8.326 -					result++; // The next character is backslash-quoted.  Skip over it.
   8.327 -			break;
   8.328 -			case '"':
   8.329 -				in_quotes = !in_quotes;
   8.330 -			break;
   8.331 -			case ';':
   8.332 -				if(!in_quotes)
   8.333 -					return result;
   8.334 -			break;
   8.335 -		}		
   8.336 -	}
   8.337 -	
   8.338 -	// If we got here, no ';' was found.
   8.339 -	return end;
   8.340 -}
   8.341 -
   8.342 -bool LLPluginCookieStore::Cookie::matchName(std::string::size_type start, std::string::size_type end, const char *name)
   8.343 -{
   8.344 -	// NOTE: this assumes 'name' is already in lowercase.  The code which uses it should be able to arrange this...
   8.345 -	
   8.346 -	while((start < end) && (*name != '\0'))
   8.347 -	{
   8.348 -		if(tolower(mCookie[start]) != *name)
   8.349 -			return false;
   8.350 -			
   8.351 -		start++;
   8.352 -		name++;
   8.353 -	}
   8.354 -	
   8.355 -	// iff both strings hit the end at the same time, they're equal.
   8.356 -	return ((start == end) && (*name == '\0'));
   8.357 -}
   8.358 -
   8.359 -std::string LLPluginCookieStore::getAllCookies()
   8.360 -{
   8.361 -	std::stringstream result;
   8.362 -	writeAllCookies(result);
   8.363 -	return result.str();
   8.364 -}
   8.365 -
   8.366 -void LLPluginCookieStore::writeAllCookies(std::ostream& s)
   8.367 -{
   8.368 -	cookie_map_t::iterator iter;
   8.369 -	for(iter = mCookies.begin(); iter != mCookies.end(); iter++)
   8.370 -	{
   8.371 -		// Don't return expired cookies
   8.372 -		if(!iter->second->isDead())
   8.373 -		{
   8.374 -			s << (iter->second->getCookie()) << "\n";
   8.375 -		}
   8.376 -	}
   8.377 -
   8.378 -}
   8.379 -
   8.380 -std::string LLPluginCookieStore::getPersistentCookies()
   8.381 -{
   8.382 -	std::stringstream result;
   8.383 -	writePersistentCookies(result);
   8.384 -	return result.str();
   8.385 -}
   8.386 -
   8.387 -void LLPluginCookieStore::writePersistentCookies(std::ostream& s)
   8.388 -{
   8.389 -	cookie_map_t::iterator iter;
   8.390 -	for(iter = mCookies.begin(); iter != mCookies.end(); iter++)
   8.391 -	{
   8.392 -		// Don't return expired cookies or session cookies
   8.393 -		if(!iter->second->isDead() && !iter->second->isSessionCookie())
   8.394 -		{
   8.395 -			s << iter->second->getCookie() << "\n";
   8.396 -		}
   8.397 -	}
   8.398 -}
   8.399 -
   8.400 -std::string LLPluginCookieStore::getChangedCookies(bool clear_changed)
   8.401 -{
   8.402 -	std::stringstream result;
   8.403 -	writeChangedCookies(result, clear_changed);
   8.404 -	
   8.405 -	return result.str();
   8.406 -}
   8.407 -
   8.408 -void LLPluginCookieStore::writeChangedCookies(std::ostream& s, bool clear_changed)
   8.409 -{
   8.410 -	if(mHasChangedCookies)
   8.411 -	{
   8.412 -		LL_DEBUGS() << "returning changed cookies: " << LL_ENDL;
   8.413 -		cookie_map_t::iterator iter;
   8.414 -		for(iter = mCookies.begin(); iter != mCookies.end(); )
   8.415 -		{
   8.416 -			cookie_map_t::iterator next = iter;
   8.417 -			next++;
   8.418 -			
   8.419 -			// Only return cookies marked as "changed"
   8.420 -			if(iter->second->isChanged())
   8.421 -			{
   8.422 -				s << iter->second->getCookie() << "\n";
   8.423 -
   8.424 -				LL_DEBUGS() << "    " << iter->second->getCookie() << LL_ENDL;
   8.425 -
   8.426 -				// If requested, clear the changed mark
   8.427 -				if(clear_changed)
   8.428 -				{
   8.429 -					if(iter->second->isDead())
   8.430 -					{
   8.431 -						// If this cookie was previously marked dead, it needs to be removed entirely.	
   8.432 -						delete iter->second;
   8.433 -						mCookies.erase(iter);
   8.434 -					}
   8.435 -					else
   8.436 -					{
   8.437 -						// Not dead, just mark as not changed.
   8.438 -						iter->second->setChanged(false);
   8.439 -					}
   8.440 -				}
   8.441 -			}
   8.442 -			
   8.443 -			iter = next;
   8.444 -		}
   8.445 -	}
   8.446 -	
   8.447 -	if(clear_changed)
   8.448 -		mHasChangedCookies = false;
   8.449 -}
   8.450 -
   8.451 -void LLPluginCookieStore::setAllCookies(const std::string &cookies, bool mark_changed)
   8.452 -{
   8.453 -	clearCookies();
   8.454 -	setCookies(cookies, mark_changed);
   8.455 -}
   8.456 -
   8.457 -void LLPluginCookieStore::readAllCookies(std::istream& s, bool mark_changed)
   8.458 -{
   8.459 -	clearCookies();
   8.460 -	readCookies(s, mark_changed);
   8.461 -}
   8.462 -	
   8.463 -void LLPluginCookieStore::setCookies(const std::string &cookies, bool mark_changed)
   8.464 -{
   8.465 -	std::string::size_type start = 0;
   8.466 -
   8.467 -	while(start != std::string::npos)
   8.468 -	{
   8.469 -		std::string::size_type end = cookies.find_first_of("\r\n", start);
   8.470 -		if(end > start)
   8.471 -		{
   8.472 -			// The line is non-empty.  Try to create a cookie from it.
   8.473 -			setOneCookie(cookies, start, end, mark_changed);
   8.474 -		}
   8.475 -		start = cookies.find_first_not_of("\r\n ", end);
   8.476 -	}
   8.477 -}
   8.478 -
   8.479 -void LLPluginCookieStore::setCookiesFromHost(const std::string &cookies, const std::string &host, bool mark_changed)
   8.480 -{
   8.481 -	std::string::size_type start = 0;
   8.482 -
   8.483 -	while(start != std::string::npos)
   8.484 -	{
   8.485 -		std::string::size_type end = cookies.find_first_of("\r\n", start);
   8.486 -		if(end > start)
   8.487 -		{
   8.488 -			// The line is non-empty.  Try to create a cookie from it.
   8.489 -			setOneCookie(cookies, start, end, mark_changed, host);
   8.490 -		}
   8.491 -		start = cookies.find_first_not_of("\r\n ", end);
   8.492 -	}
   8.493 -}
   8.494 -			
   8.495 -void LLPluginCookieStore::readCookies(std::istream& s, bool mark_changed)
   8.496 -{
   8.497 -	std::string line;
   8.498 -	while(s.good() && !s.eof())
   8.499 -	{
   8.500 -		std::getline(s, line);
   8.501 -		if(!line.empty())
   8.502 -		{
   8.503 -			// Try to create a cookie from this line.
   8.504 -			setOneCookie(line, 0, std::string::npos, mark_changed);
   8.505 -		}
   8.506 -	}
   8.507 -}
   8.508 -
   8.509 -std::string LLPluginCookieStore::quoteString(const std::string &s)
   8.510 -{
   8.511 -	std::stringstream result;
   8.512 -	
   8.513 -	result << '"';
   8.514 -	
   8.515 -	for(std::string::size_type i = 0; i < s.size(); ++i)
   8.516 -	{
   8.517 -		char c = s[i];
   8.518 -		switch(c)
   8.519 -		{
   8.520 -			// All these separators need to be quoted in HTTP headers, according to section 2.2 of rfc 2616:
   8.521 -			case '(': case ')': case '<': case '>': case '@':
   8.522 -			case ',': case ';': case ':': case '\\': case '"':
   8.523 -			case '/': case '[': case ']': case '?': case '=':
   8.524 -			case '{': case '}':	case ' ': case '\t':
   8.525 -				result << '\\';
   8.526 -			break;
   8.527 -		}
   8.528 -		
   8.529 -		result << c;
   8.530 -	}
   8.531 -	
   8.532 -	result << '"';
   8.533 -	
   8.534 -	return result.str();
   8.535 -}
   8.536 -
   8.537 -std::string LLPluginCookieStore::unquoteString(const std::string &s)
   8.538 -{
   8.539 -	std::stringstream result;
   8.540 -	
   8.541 -	bool in_quotes = false;
   8.542 -	
   8.543 -	for(std::string::size_type i = 0; i < s.size(); ++i)
   8.544 -	{
   8.545 -		char c = s[i];
   8.546 -		switch(c)
   8.547 -		{
   8.548 -			case '\\':
   8.549 -				if(in_quotes)
   8.550 -				{
   8.551 -					// The next character is backslash-quoted.  Pass it through untouched.
   8.552 -					++i; 
   8.553 -					if(i < s.size())
   8.554 -					{
   8.555 -						result << s[i];
   8.556 -					}
   8.557 -					continue;
   8.558 -				}
   8.559 -			break;
   8.560 -			case '"':
   8.561 -				in_quotes = !in_quotes;
   8.562 -				continue;
   8.563 -			break;
   8.564 -		}
   8.565 -		
   8.566 -		result << c;
   8.567 -	}
   8.568 -	
   8.569 -	return result.str();
   8.570 -}
   8.571 -
   8.572 -// The flow for deleting a cookie is non-obvious enough that I should call it out here...
   8.573 -// Deleting a cookie is done by setting a cookie with the same name, path, and domain, but with an expire timestamp in the past.
   8.574 -// (This is exactly how a web server tells a browser to delete a cookie.)
   8.575 -// When deleting with mark_changed set to true, this replaces the existing cookie in the list with an entry that's marked both dead and changed.
   8.576 -// Some time later when writeChangedCookies() is called with clear_changed set to true, the dead cookie is deleted from the list after being returned, so that the
   8.577 -// delete operation (in the form of the expired cookie) is passed along.
   8.578 -void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed, const std::string &host)
   8.579 -{
   8.580 -	Cookie *cookie = Cookie::createFromString(s, cookie_start, cookie_end, host);
   8.581 -	if(cookie)
   8.582 -	{
   8.583 -		LL_DEBUGS("CookieStoreUpdate") << "setting cookie: " << cookie->getCookie() << LL_ENDL;
   8.584 -		
   8.585 -		// Create a key for this cookie
   8.586 -		std::string key = cookie->getKey();
   8.587 -		
   8.588 -		// Check to see whether this cookie should have expired
   8.589 -		if(!cookie->isSessionCookie() && (cookie->getDate() < LLDate::now()))
   8.590 -		{
   8.591 -			// This cookie has expired.
   8.592 -			if(mark_changed)
   8.593 -			{
   8.594 -				// If we're marking cookies as changed, we should keep it anyway since we'll need to send it out with deltas.
   8.595 -				cookie->setDead(true);
   8.596 -				LL_DEBUGS("CookieStoreUpdate") << "    marking dead" << LL_ENDL;
   8.597 -			}
   8.598 -			else
   8.599 -			{
   8.600 -				// If we're not marking cookies as changed, we don't need to keep this cookie at all.
   8.601 -				// If the cookie was already in the list, delete it.
   8.602 -				removeCookie(key);
   8.603 -
   8.604 -				delete cookie;
   8.605 -				cookie = NULL;
   8.606 -
   8.607 -				LL_DEBUGS("CookieStoreUpdate") << "    removing" << LL_ENDL;
   8.608 -			}
   8.609 -		}
   8.610 -		
   8.611 -		if(cookie)
   8.612 -		{
   8.613 -			// If it already exists in the map, replace it.
   8.614 -			cookie_map_t::iterator iter = mCookies.find(key);
   8.615 -			if(iter != mCookies.end())
   8.616 -			{
   8.617 -				if(iter->second->getCookie() == cookie->getCookie())
   8.618 -				{
   8.619 -					// The new cookie is identical to the old -- don't mark as changed.
   8.620 -					// Just leave the old one in the map.
   8.621 -					delete cookie;
   8.622 -					cookie = NULL;
   8.623 -
   8.624 -					LL_DEBUGS("CookieStoreUpdate") << "    unchanged" << LL_ENDL;
   8.625 -				}
   8.626 -				else
   8.627 -				{
   8.628 -					// A matching cookie was already in the map.  Replace it.
   8.629 -					delete iter->second;
   8.630 -					iter->second = cookie;
   8.631 -					
   8.632 -					cookie->setChanged(mark_changed);
   8.633 -					if(mark_changed)
   8.634 -						mHasChangedCookies = true;
   8.635 -
   8.636 -					LL_DEBUGS("CookieStoreUpdate") << "    replacing" << LL_ENDL;
   8.637 -				}
   8.638 -			}
   8.639 -			else
   8.640 -			{
   8.641 -				// The cookie wasn't in the map.  Insert it.
   8.642 -				mCookies.insert(std::make_pair(key, cookie));
   8.643 -				
   8.644 -				cookie->setChanged(mark_changed);
   8.645 -				if(mark_changed)
   8.646 -					mHasChangedCookies = true;
   8.647 -
   8.648 -				LL_DEBUGS("CookieStoreUpdate") << "    adding" << LL_ENDL;
   8.649 -			}
   8.650 -		}
   8.651 -	}
   8.652 -	else
   8.653 -	{
   8.654 -		LL_WARNS("CookieStoreUpdate") << "failed to parse cookie: " << s.substr(cookie_start, cookie_end - cookie_start) << LL_ENDL;
   8.655 -	}
   8.656 -
   8.657 -}
   8.658 -
   8.659 -void LLPluginCookieStore::clearCookies()
   8.660 -{
   8.661 -	std::for_each(mCookies.begin(), mCookies.end(), DeletePairedPointer());
   8.662 -	mCookies.clear();
   8.663 -}
   8.664 -
   8.665 -void LLPluginCookieStore::removeCookie(const std::string &key)
   8.666 -{
   8.667 -	cookie_map_t::iterator iter = mCookies.find(key);
   8.668 -	if(iter != mCookies.end())
   8.669 -	{
   8.670 -		delete iter->second;
   8.671 -		mCookies.erase(iter);
   8.672 -	}
   8.673 -}
   8.674 -
   8.675 -void LLPluginCookieStore::removeCookiesByDomain(const std::string &domain)
   8.676 -{
   8.677 -	cookie_map_t::iterator iter = mCookies.begin();
   8.678 -	while(iter != mCookies.end())
   8.679 -	{ 
   8.680 -		if(iter->second->getDomain() == domain)
   8.681 -		{
   8.682 -            cookie_map_t::iterator doErase = iter;
   8.683 -            iter++;
   8.684 -			delete doErase->second;
   8.685 -			mCookies.erase(doErase);
   8.686 -		}
   8.687 -        else
   8.688 -        {
   8.689 -            iter++;
   8.690 -        }
   8.691 -	}
   8.692 -}
     9.1 --- a/indra/llplugin/llplugincookiestore.h	Sat Apr 07 12:06:15 2018 +0200
     9.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.3 @@ -1,123 +0,0 @@
     9.4 -/** 
     9.5 - * @file llplugincookiestore.h
     9.6 - * @brief LLPluginCookieStore provides central storage for http cookies used by plugins
     9.7 - *
     9.8 - * @cond
     9.9 - * $LicenseInfo:firstyear=2010&license=viewerlgpl$
    9.10 - * Second Life Viewer Source Code
    9.11 - * Copyright (C) 2010, Linden Research, Inc.
    9.12 - * 
    9.13 - * This library is free software; you can redistribute it and/or
    9.14 - * modify it under the terms of the GNU Lesser General Public
    9.15 - * License as published by the Free Software Foundation;
    9.16 - * version 2.1 of the License only.
    9.17 - * 
    9.18 - * This library is distributed in the hope that it will be useful,
    9.19 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
    9.20 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    9.21 - * Lesser General Public License for more details.
    9.22 - * 
    9.23 - * You should have received a copy of the GNU Lesser General Public
    9.24 - * License along with this library; if not, write to the Free Software
    9.25 - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    9.26 - * 
    9.27 - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
    9.28 - * $/LicenseInfo$
    9.29 - * @endcond
    9.30 - */
    9.31 -
    9.32 -#ifndef LL_LLPLUGINCOOKIESTORE_H
    9.33 -#define LL_LLPLUGINCOOKIESTORE_H
    9.34 -
    9.35 -#include "lldate.h"
    9.36 -#include <map>
    9.37 -#include <string>
    9.38 -#include <iostream>
    9.39 -
    9.40 -class LLPluginCookieStore
    9.41 -{
    9.42 -	LOG_CLASS(LLPluginCookieStore);
    9.43 -public:
    9.44 -	LLPluginCookieStore();
    9.45 -	~LLPluginCookieStore();
    9.46 -
    9.47 -	// gets all cookies currently in storage -- use when initializing a plugin
    9.48 -	std::string getAllCookies();
    9.49 -	void writeAllCookies(std::ostream& s);
    9.50 -	
    9.51 -	// gets only persistent cookies (i.e. not session cookies) -- use when writing cookies to a file
    9.52 -	std::string getPersistentCookies();
    9.53 -	void writePersistentCookies(std::ostream& s);
    9.54 -	
    9.55 -	// gets cookies which are marked as "changed" -- use when sending periodic updates to plugins
    9.56 -	std::string getChangedCookies(bool clear_changed = true);
    9.57 -	void writeChangedCookies(std::ostream& s, bool clear_changed = true);
    9.58 -	
    9.59 -	// (re)initializes internal data structures and bulk-sets cookies -- use when reading cookies from a file
    9.60 -	void setAllCookies(const std::string &cookies, bool mark_changed = false);
    9.61 -	void readAllCookies(std::istream& s, bool mark_changed = false);
    9.62 -	
    9.63 -	// sets one or more cookies (without reinitializing anything) -- use when receiving cookies from a plugin
    9.64 -	void setCookies(const std::string &cookies, bool mark_changed = true);
    9.65 -	void readCookies(std::istream& s, bool mark_changed = true);
    9.66 -
    9.67 -	// sets one or more cookies (without reinitializing anything), supplying a hostname the cookies came from -- use when setting a cookie manually
    9.68 -	void setCookiesFromHost(const std::string &cookies, const std::string &host, bool mark_changed = true);
    9.69 -
    9.70 -	// quote or unquote a string as per the definition of 'quoted-string' in rfc2616
    9.71 -	static std::string quoteString(const std::string &s);
    9.72 -	static std::string unquoteString(const std::string &s);
    9.73 -
    9.74 -	void removeCookiesByDomain(const std::string &domain);
    9.75 -	
    9.76 -private:
    9.77 -
    9.78 -	void setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed, const std::string &host = LLStringUtil::null);
    9.79 -
    9.80 -	class Cookie
    9.81 -	{
    9.82 -	public:
    9.83 -		static Cookie *createFromString(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos, const std::string &host = LLStringUtil::null);
    9.84 -		
    9.85 -		// Construct a string from the cookie that uniquely represents it, to be used as a key in a std::map.
    9.86 -		std::string getKey() const;
    9.87 -		std::string getDomain() const;
    9.88 -		
    9.89 -		const std::string &getCookie() const { return mCookie; };
    9.90 -		bool isSessionCookie() const { return mDate.isNull(); };
    9.91 -
    9.92 -		bool isDead() const { return mDead; };
    9.93 -		void setDead(bool dead) { mDead = dead; };
    9.94 -		
    9.95 -		bool isChanged() const { return mChanged; };
    9.96 -		void setChanged(bool changed) { mChanged = changed; };
    9.97 -
    9.98 -		const LLDate &getDate() const { return mDate; };
    9.99 -		
   9.100 -	private:
   9.101 -		Cookie(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos);
   9.102 -		bool parse(const std::string &host);
   9.103 -		std::string::size_type findFieldEnd(std::string::size_type start = 0, std::string::size_type end = std::string::npos);
   9.104 -		bool matchName(std::string::size_type start, std::string::size_type end, const char *name);
   9.105 -		
   9.106 -		std::string mCookie;	// The full cookie, in RFC 2109 string format
   9.107 -		LLDate mDate;			// The expiration date of the cookie.  For session cookies, this will be a null date (mDate.isNull() is true).
   9.108 -		// Start/end indices of various parts of the cookie string.  Stored as indices into the string to save space and time.
   9.109 -		std::string::size_type mNameStart, mNameEnd;
   9.110 -		std::string::size_type mValueStart, mValueEnd;
   9.111 -		std::string::size_type mDomainStart, mDomainEnd;
   9.112 -		std::string::size_type mPathStart, mPathEnd;
   9.113 -		bool mDead;
   9.114 -		bool mChanged;
   9.115 -	};
   9.116 -	
   9.117 -	typedef std::map<std::string, Cookie*> cookie_map_t;
   9.118 -	
   9.119 -	cookie_map_t mCookies;
   9.120 -	bool mHasChangedCookies;
   9.121 -	
   9.122 -	void clearCookies();
   9.123 -	void removeCookie(const std::string &key);
   9.124 -};
   9.125 -
   9.126 -#endif // LL_LLPLUGINCOOKIESTORE_H
    10.1 --- a/indra/llplugin/tests/llplugincookiestore_test.cpp	Sat Apr 07 12:06:15 2018 +0200
    10.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.3 @@ -1,207 +0,0 @@
    10.4 -/** 
    10.5 - * @file llplugincookiestore_test.cpp
    10.6 - * @brief Unit tests for LLPluginCookieStore.
    10.7 - *
    10.8 - * @cond
    10.9 - * $LicenseInfo:firstyear=2010&license=viewerlgpl$
   10.10 - * Second Life Viewer Source Code
   10.11 - * Copyright (C) 2010, Linden Research, Inc.
   10.12 - * 
   10.13 - * This library is free software; you can redistribute it and/or
   10.14 - * modify it under the terms of the GNU Lesser General Public
   10.15 - * License as published by the Free Software Foundation;
   10.16 - * version 2.1 of the License only.
   10.17 - * 
   10.18 - * This library is distributed in the hope that it will be useful,
   10.19 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
   10.20 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   10.21 - * Lesser General Public License for more details.
   10.22 - * 
   10.23 - * You should have received a copy of the GNU Lesser General Public
   10.24 - * License along with this library; if not, write to the Free Software
   10.25 - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
   10.26 - * 
   10.27 - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
   10.28 - * $/LicenseInfo$
   10.29 - * @endcond
   10.30 - */
   10.31 -
   10.32 -#include "linden_common.h"
   10.33 -#include <list>
   10.34 -#include "../test/lltut.h"
   10.35 -
   10.36 -#include "../llplugincookiestore.h"
   10.37 -
   10.38 -
   10.39 -namespace tut
   10.40 -{
   10.41 -	// Main Setup
   10.42 -	struct LLPluginCookieStoreFixture
   10.43 -	{
   10.44 -		LLPluginCookieStoreFixture()
   10.45 -		{
   10.46 -			// We need dates definitively in the past and the future to properly test cookie expiration.
   10.47 -			LLDate now = LLDate::now(); 
   10.48 -			LLDate past(now.secondsSinceEpoch() - (60.0 * 60.0 * 24.0));	// 1 day in the past
   10.49 -			LLDate future(now.secondsSinceEpoch() + (60.0 * 60.0 * 24.0));	// 1 day in the future
   10.50 -			
   10.51 -			mPastString = past.asRFC1123();
   10.52 -			mFutureString = future.asRFC1123();
   10.53 -		}
   10.54 -		
   10.55 -		std::string mPastString;
   10.56 -		std::string mFutureString;
   10.57 -		LLPluginCookieStore mCookieStore;
   10.58 -		
   10.59 -		// List of cookies used for validation
   10.60 -		std::list<std::string> mCookies;
   10.61 -		
   10.62 -		// This sets up mCookies from a string returned by one of the functions in LLPluginCookieStore
   10.63 -		void setCookies(const std::string &cookies)
   10.64 -		{
   10.65 -			mCookies.clear();
   10.66 -			std::string::size_type start = 0;
   10.67 -
   10.68 -			while(start != std::string::npos)
   10.69 -			{
   10.70 -				std::string::size_type end = cookies.find_first_of("\r\n", start);
   10.71 -				if(end > start)
   10.72 -				{
   10.73 -					std::string line(cookies, start, end - start);
   10.74 -					if(line.find_first_not_of("\r\n\t ") != std::string::npos)
   10.75 -					{
   10.76 -						// The line has some non-whitespace characters.  Save it to the list.
   10.77 -						mCookies.push_back(std::string(cookies, start, end - start));
   10.78 -					}
   10.79 -				}
   10.80 -				start = cookies.find_first_not_of("\r\n ", end);
   10.81 -			}
   10.82 -		}
   10.83 -		
   10.84 -		// This ensures that a cookie matching the one passed is in the list.
   10.85 -		void ensureCookie(const std::string &cookie)
   10.86 -		{
   10.87 -			std::list<std::string>::iterator iter;
   10.88 -			for(iter = mCookies.begin(); iter != mCookies.end(); iter++)
   10.89 -			{
   10.90 -				if(*iter == cookie)
   10.91 -				{
   10.92 -					// Found the cookie
   10.93 -					// TODO: this should do a smarter equality comparison on the two cookies, instead of just a string compare.
   10.94 -					return;
   10.95 -				}
   10.96 -			}
   10.97 -			
   10.98 -			// Didn't find this cookie
   10.99 -			std::string message = "cookie not found: ";
  10.100 -			message += cookie;
  10.101 -			ensure(message, false);
  10.102 -		}
  10.103 -		
  10.104 -		// This ensures that the number of cookies in the list matches what's expected.
  10.105 -		void ensureSize(const std::string &message, size_t size)
  10.106 -		{
  10.107 -			if(mCookies.size() != size)
  10.108 -			{
  10.109 -				std::stringstream full_message;
  10.110 -				
  10.111 -				full_message << message << " (expected " << size << ", actual " << mCookies.size() << ")";
  10.112 -				ensure(full_message.str(), false);
  10.113 -			}
  10.114 -		}
  10.115 -	};
  10.116 -	
  10.117 -	typedef test_group<LLPluginCookieStoreFixture> factory;
  10.118 -	typedef factory::object object;
  10.119 -	factory tf("LLPluginCookieStore");
  10.120 -
  10.121 -	// Tests
  10.122 -	template<> template<>
  10.123 -	void object::test<1>()
  10.124 -	{
  10.125 -		// Test 1: cookie uniqueness and update lists.
  10.126 -		// Valid, distinct cookies:
  10.127 -		
  10.128 -		std::string cookie01 = "cookieA=value; domain=example.com; path=/";
  10.129 -		std::string cookie02 = "cookieB=value; Domain=example.com; Path=/; Max-Age=10; Secure; Version=1; Comment=foo!; HTTPOnly"; // cookie with every supported field, in different cases.
  10.130 -		std::string cookie03 = "cookieA=value; domain=foo.example.com; path=/"; // different domain
  10.131 -		std::string cookie04 = "cookieA=value; domain=example.com; path=/bar/"; // different path
  10.132 -		std::string cookie05 = "cookieC; domain=example.com; path=/"; // empty value
  10.133 -		std::string cookie06 = "cookieD=value; domain=example.com; path=/; expires="; // different name, persistent cookie
  10.134 -		cookie06 += mFutureString;
  10.135 -		
  10.136 -		mCookieStore.setCookies(cookie01);
  10.137 -		mCookieStore.setCookies(cookie02);
  10.138 -		mCookieStore.setCookies(cookie03);
  10.139 -		mCookieStore.setCookies(cookie04);
  10.140 -		mCookieStore.setCookies(cookie05);
  10.141 -		mCookieStore.setCookies(cookie06);
  10.142 -		
  10.143 -		// Invalid cookies (these will get parse errors and not be added to the store)
  10.144 -
  10.145 -		std::string badcookie01 = "cookieD=value; domain=example.com; path=/; foo=bar"; // invalid field name
  10.146 -		std::string badcookie02 = "cookieE=value; path=/"; // no domain
  10.147 -
  10.148 -		mCookieStore.setCookies(badcookie01);
  10.149 -		mCookieStore.setCookies(badcookie02);
  10.150 -		
  10.151 -		// All cookies added so far should have been marked as "changed"
  10.152 -		setCookies(mCookieStore.getChangedCookies());
  10.153 -		ensureSize("count of changed cookies", 6);
  10.154 -		ensureCookie(cookie01);
  10.155 -		ensureCookie(cookie02);
  10.156 -		ensureCookie(cookie03);
  10.157 -		ensureCookie(cookie04);
  10.158 -		ensureCookie(cookie05);
  10.159 -		ensureCookie(cookie06);
  10.160 -		
  10.161 -		// Save off the current state of the cookie store (we'll restore it later)
  10.162 -		std::string savedCookies = mCookieStore.getAllCookies();
  10.163 -		
  10.164 -		// Test replacing cookies
  10.165 -		std::string cookie01a = "cookieA=newvalue; domain=example.com; path=/";	// updated value
  10.166 -		std::string cookie02a = "cookieB=newvalue; domain=example.com; path=/; expires="; // remove cookie (by setting an expire date in the past)
  10.167 -		cookie02a += mPastString;
  10.168 -		
  10.169 -		mCookieStore.setCookies(cookie01a);
  10.170 -		mCookieStore.setCookies(cookie02a);
  10.171 -
  10.172 -		// test for getting changed cookies
  10.173 -		setCookies(mCookieStore.getChangedCookies());
  10.174 -		ensureSize("count of updated cookies", 2);
  10.175 -		ensureCookie(cookie01a);
  10.176 -		ensureCookie(cookie02a);
  10.177 -		
  10.178 -		// and for the state of the store after getting changed cookies
  10.179 -		setCookies(mCookieStore.getAllCookies());
  10.180 -		ensureSize("count of valid cookies", 5);
  10.181 -		ensureCookie(cookie01a);
  10.182 -		ensureCookie(cookie03);
  10.183 -		ensureCookie(cookie04);
  10.184 -		ensureCookie(cookie05);
  10.185 -		ensureCookie(cookie06);
  10.186 -
  10.187 -		// Check that only the persistent cookie is returned here
  10.188 -		setCookies(mCookieStore.getPersistentCookies());
  10.189 -		ensureSize("count of persistent cookies", 1);
  10.190 -		ensureCookie(cookie06);
  10.191 -
  10.192 -		// Restore the cookie store to a previous state and verify
  10.193 -		mCookieStore.setAllCookies(savedCookies);
  10.194 -		
  10.195 -		// Since setAllCookies defaults to not marking cookies as changed, this list should be empty.
  10.196 -		setCookies(mCookieStore.getChangedCookies());
  10.197 -		ensureSize("count of changed cookies after restore", 0);
  10.198 -
  10.199 -		// Verify that the restore worked as it should have.
  10.200 -		setCookies(mCookieStore.getAllCookies());
  10.201 -		ensureSize("count of restored cookies", 6);
  10.202 -		ensureCookie(cookie01);
  10.203 -		ensureCookie(cookie02);
  10.204 -		ensureCookie(cookie03);
  10.205 -		ensureCookie(cookie04);
  10.206 -		ensureCookie(cookie05);
  10.207 -		ensureCookie(cookie06);
  10.208 -	}
  10.209 -
  10.210 -}
    11.1 --- a/indra/llui/llurlentry.cpp	Sat Apr 07 12:06:15 2018 +0200
    11.2 +++ b/indra/llui/llurlentry.cpp	Thu Apr 12 21:55:46 2018 +0200
    11.3 @@ -350,7 +350,7 @@
    11.4  {
    11.5  	// <FS:Ansariel> Inworldz special
    11.6  	//mPattern = boost::regex("(http://(maps.secondlife.com|slurl.com)/secondlife/|secondlife://(/app/(worldmap|teleport)/)?)[^ /]+(/-?[0-9]+){1,3}(/?(\\?title|\\?img|\\?msg)=\\S*)?/?",
    11.7 -	mPattern = boost::regex("(http://(maps.secondlife.com|slurl.com)/secondlife/|(secondlife|inworldz|iw)://(/app/(worldmap|teleport)/)?)[^ /]+(/-?[0-9]+){1,3}(/?(\\?title|\\?img|\\?msg)=\\S*)?/?",
    11.8 +	mPattern = boost::regex("(https?://(maps.secondlife.com|slurl.com)/secondlife/|(secondlife|inworldz|iw)://(/app/(worldmap|teleport)/)?)[^ /]+(/-?[0-9]+){1,3}(/?(\\?title|\\?img|\\?msg)=\\S*)?/?",
    11.9  									boost::regex::perl|boost::regex::icase);
   11.10  	mMenuName = "menu_url_http.xml";
   11.11  	mTooltip = LLTrans::getString("TooltipHttpUrl");
   11.12 @@ -437,7 +437,7 @@
   11.13  LLUrlEntrySLURL::LLUrlEntrySLURL()
   11.14  {
   11.15  	// see http://slurl.com/about.php for details on the SLURL format
   11.16 -	mPattern = boost::regex("http://(maps.secondlife.com|slurl.com)/secondlife/[^ /]+(/\\d+){0,3}(/?(\\?title|\\?img|\\?msg)=\\S*)?/?",
   11.17 +	mPattern = boost::regex("https?://(maps.secondlife.com|slurl.com)/secondlife/[^ /]+(/\\d+){0,3}(/?(\\?title|\\?img|\\?msg)=\\S*)?/?",
   11.18  							boost::regex::perl|boost::regex::icase);
   11.19  	mMenuName = "menu_url_slurl.xml";
   11.20  	mTooltip = LLTrans::getString("TooltipSLURL");
    12.1 --- a/indra/media_plugins/cef/media_plugin_cef.cpp	Sat Apr 07 12:06:15 2018 +0200
    12.2 +++ b/indra/media_plugins/cef/media_plugin_cef.cpp	Thu Apr 12 21:55:46 2018 +0200
    12.3 @@ -38,6 +38,7 @@
    12.4  #include "media_plugin_base.h"
    12.5  
    12.6  #include <functional>
    12.7 +#include <chrono>
    12.8  
    12.9  #include "dullahan.h"
   12.10  
   12.11 @@ -64,12 +65,12 @@
   12.12  	void onLoadStartCallback();
   12.13  	void onRequestExitCallback();
   12.14  	void onLoadEndCallback(int httpStatusCode);
   12.15 +	void onLoadError(int status, const std::string error_text);
   12.16  	void onAddressChangeCallback(std::string url);
   12.17 -	void onNavigateURLCallback(std::string url, std::string target);
   12.18 +	void onOpenPopupCallback(std::string url, std::string target);
   12.19  	bool onHTTPAuthCallback(const std::string host, const std::string realm, std::string& username, std::string& password);
   12.20  	void onCursorChangedCallback(dullahan::ECursorType type);
   12.21 -	void onFileDownloadCallback(std::string filename);
   12.22 -	const std::string onFileDialogCallback();
   12.23 +	const std::vector<std::string> onFileDialog(dullahan::EFileDialogType dialog_type, const std::string dialog_title, const std::string default_file, const std::string dialog_accept_filter, bool& use_default);
   12.24  
   12.25  	void postDebugMessage(const std::string& msg);
   12.26  	void authResponse(LLPluginMessage &message);
   12.27 @@ -95,7 +96,9 @@
   12.28  	bool mCanPaste;
   12.29  	std::string mCachePath;
   12.30  	std::string mCookiePath;
   12.31 -	std::string mPickedFile;
   12.32 +	std::string mCefLogFile;
   12.33 +	bool mCefLogVerbose;
   12.34 +	std::vector<std::string> mPickedFiles;
   12.35  	VolumeCatcher mVolumeCatcher;
   12.36  	F32 mCurVolume;
   12.37  	dullahan* mCEFLib;
   12.38 @@ -115,7 +118,7 @@
   12.39  	mCookiesEnabled = true;
   12.40  	mPluginsEnabled = false;
   12.41  	mJavascriptEnabled = true;
   12.42 -	mDisableGPU = true;
   12.43 +	mDisableGPU = false;
   12.44  	mUserAgentSubtring = "";
   12.45  	mAuthUsername = "";
   12.46  	mAuthPassword = "";
   12.47 @@ -125,7 +128,9 @@
   12.48  	mCanPaste = false;
   12.49  	mCachePath = "";
   12.50  	mCookiePath = "";
   12.51 -	mPickedFile = "";
   12.52 +	mCefLogFile = "";
   12.53 +	mCefLogVerbose = false;
   12.54 +	mPickedFiles.clear();
   12.55  	mCurVolume = 0.0;
   12.56  
   12.57  	mCEFLib = new dullahan();
   12.58 @@ -166,6 +171,10 @@
   12.59  		{
   12.60  			memcpy(mPixels, pixels, mWidth * mHeight * mDepth);
   12.61  		}
   12.62 +		else
   12.63 +		{
   12.64 +			mCEFLib->setSize(mWidth, mHeight);
   12.65 +		}
   12.66  		setDirty(0, 0, mWidth, mHeight);
   12.67  	}
   12.68  }
   12.69 @@ -210,6 +219,21 @@
   12.70  	sendMessage(message);
   12.71  }
   12.72  
   12.73 +/////////////////////////////////////////////////////////////////////////////////
   12.74 +//
   12.75 +void MediaPluginCEF::onLoadError(int status, const std::string error_text)
   12.76 +{
   12.77 +	std::stringstream msg;
   12.78 +
   12.79 +	msg << "<b>Loading error!</b>";
   12.80 +	msg << "<p>";
   12.81 +	msg << "Message: " << error_text;
   12.82 +	msg << "<br>";
   12.83 +	msg << "Code: " << status;
   12.84 +
   12.85 +	mCEFLib->showBrowserMessage(msg.str());
   12.86 +}
   12.87 +
   12.88  ////////////////////////////////////////////////////////////////////////////////
   12.89  //
   12.90  void MediaPluginCEF::onRequestExitCallback()
   12.91 @@ -243,12 +267,11 @@
   12.92  
   12.93  ////////////////////////////////////////////////////////////////////////////////
   12.94  //
   12.95 -void MediaPluginCEF::onNavigateURLCallback(std::string url, std::string target)
   12.96 +void MediaPluginCEF::onOpenPopupCallback(std::string url, std::string target)
   12.97  {
   12.98  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_href");
   12.99  	message.setValue("uri", url);
  12.100  	message.setValue("target", target);
  12.101 -	message.setValue("uuid", "");	// not used right now
  12.102  	sendMessage(message);
  12.103  }
  12.104  
  12.105 @@ -287,30 +310,52 @@
  12.106  
  12.107  ////////////////////////////////////////////////////////////////////////////////
  12.108  //
  12.109 -void MediaPluginCEF::onFileDownloadCallback(const std::string filename)
  12.110 +const std::vector<std::string> MediaPluginCEF::onFileDialog(dullahan::EFileDialogType dialog_type, const std::string dialog_title, const std::string default_file, std::string dialog_accept_filter, bool& use_default)
  12.111  {
  12.112 -	mAuthOK = false;
  12.113 +	// do not use the default CEF file picker
  12.114 +	use_default = false;
  12.115  
  12.116 -	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "file_download");
  12.117 -	message.setValue("filename", filename);
  12.118 +	if (dialog_type == dullahan::FD_OPEN_FILE)
  12.119 +	{
  12.120 +		mPickedFiles.clear();
  12.121  
  12.122 -	sendMessage(message);
  12.123 +		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file");
  12.124 +		message.setValueBoolean("blocking_request", true);
  12.125 +		message.setValueBoolean("multiple_files", false);
  12.126 +
  12.127 +		sendMessage(message);
  12.128 +
  12.129 +		return mPickedFiles;
  12.130 +	}
  12.131 +	else if (dialog_type == dullahan::FD_OPEN_MULTIPLE_FILES)
  12.132 +	{
  12.133 +		mPickedFiles.clear();
  12.134 +
  12.135 +		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file");
  12.136 +		message.setValueBoolean("blocking_request", true);
  12.137 +		message.setValueBoolean("multiple_files", true);
  12.138 +
  12.139 +		sendMessage(message);
  12.140 +
  12.141 +		return mPickedFiles;
  12.142 +	}
  12.143 +	else if (dialog_type == dullahan::FD_SAVE_FILE)
  12.144 +	{
  12.145 +		mAuthOK = false;
  12.146 +
  12.147 +		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "file_download");
  12.148 +		message.setValue("filename", default_file);
  12.149 +
  12.150 +		sendMessage(message);
  12.151 +
  12.152 +		return std::vector<std::string>();
  12.153 +	}
  12.154 +
  12.155 +	return std::vector<std::string>();
  12.156  }
  12.157  
  12.158  ////////////////////////////////////////////////////////////////////////////////
  12.159  //
  12.160 -const std::string MediaPluginCEF::onFileDialogCallback()
  12.161 -{
  12.162 -	mPickedFile.clear();
  12.163 -
  12.164 -	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file");
  12.165 -	message.setValueBoolean("blocking_request", true);
  12.166 -
  12.167 -	sendMessage(message);
  12.168 -
  12.169 -	return mPickedFile;
  12.170 -}
  12.171 -
  12.172  void MediaPluginCEF::onCursorChangedCallback(dullahan::ECursorType type)
  12.173  {
  12.174  	std::string name = "";
  12.175 @@ -343,6 +388,8 @@
  12.176  	sendMessage(message);
  12.177  }
  12.178  
  12.179 +////////////////////////////////////////////////////////////////////////////////
  12.180 +//
  12.181  void MediaPluginCEF::authResponse(LLPluginMessage &message)
  12.182  {
  12.183  	mAuthOK = message.getValueBoolean("ok");
  12.184 @@ -375,7 +422,7 @@
  12.185  				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION;
  12.186  				message.setValueLLSD("versions", versions);
  12.187  
  12.188 -				std::string plugin_version = "CEF plugin 1.1.3";
  12.189 +				std::string plugin_version = "CEF plugin 1.1.412";
  12.190  				message.setValue("plugin_version", plugin_version);
  12.191  				sendMessage(message);
  12.192  			}
  12.193 @@ -441,17 +488,17 @@
  12.194  				mCEFLib->setOnTitleChangeCallback(std::bind(&MediaPluginCEF::onTitleChangeCallback, this, std::placeholders::_1));
  12.195  				mCEFLib->setOnLoadStartCallback(std::bind(&MediaPluginCEF::onLoadStartCallback, this));
  12.196  				mCEFLib->setOnLoadEndCallback(std::bind(&MediaPluginCEF::onLoadEndCallback, this, std::placeholders::_1));
  12.197 +				mCEFLib->setOnLoadErrorCallback(std::bind(&MediaPluginCEF::onLoadError, this, std::placeholders::_1, std::placeholders::_2));
  12.198  				mCEFLib->setOnAddressChangeCallback(std::bind(&MediaPluginCEF::onAddressChangeCallback, this, std::placeholders::_1));
  12.199 -				mCEFLib->setOnNavigateURLCallback(std::bind(&MediaPluginCEF::onNavigateURLCallback, this, std::placeholders::_1, std::placeholders::_2));
  12.200 +				mCEFLib->setOnOpenPopupCallback(std::bind(&MediaPluginCEF::onOpenPopupCallback, this, std::placeholders::_1, std::placeholders::_2));
  12.201  				mCEFLib->setOnHTTPAuthCallback(std::bind(&MediaPluginCEF::onHTTPAuthCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
  12.202 -				mCEFLib->setOnFileDownloadCallback(std::bind(&MediaPluginCEF::onFileDownloadCallback, this, std::placeholders::_1));
  12.203 -				mCEFLib->setOnFileDialogCallback(std::bind(&MediaPluginCEF::onFileDialogCallback, this));
  12.204 +				mCEFLib->setOnFileDialogCallback(std::bind(&MediaPluginCEF::onFileDialog, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
  12.205  				mCEFLib->setOnCursorChangedCallback(std::bind(&MediaPluginCEF::onCursorChangedCallback, this, std::placeholders::_1));
  12.206  				mCEFLib->setOnRequestExitCallback(std::bind(&MediaPluginCEF::onRequestExitCallback, this));
  12.207  
  12.208  				dullahan::dullahan_settings settings;
  12.209  				settings.accept_language_list = mHostLanguage;
  12.210 -				settings.background_color = 0xffffffff;
  12.211 +				settings.background_color = 0xff282828;
  12.212  				settings.cache_enabled = true;
  12.213  				settings.cache_path = mCachePath;
  12.214  				settings.cookie_store_path = mCookiePath;
  12.215 @@ -470,6 +517,8 @@
  12.216  				settings.plugins_enabled = mPluginsEnabled;
  12.217  				settings.user_agent_substring = mCEFLib->makeCompatibleUserAgentString(mUserAgentSubtring);
  12.218  				settings.webgl_enabled = true;
  12.219 +				settings.log_file = mCefLogFile;
  12.220 +				settings.log_verbose = mCefLogVerbose;
  12.221  
  12.222  				std::vector<std::string> custom_schemes(1, "secondlife");
  12.223  				mCEFLib->setCustomSchemes(custom_schemes);
  12.224 @@ -499,8 +548,11 @@
  12.225  			{
  12.226  				std::string user_data_path_cache = message_in.getValue("cache_path");
  12.227  				std::string user_data_path_cookies = message_in.getValue("cookies_path");
  12.228 +
  12.229  				mCachePath = user_data_path_cache + "cef_cache";
  12.230  				mCookiePath = user_data_path_cookies + "cef_cookies";
  12.231 +				mCefLogFile = message_in.getValue("cef_log_file");
  12.232 +				mCefLogVerbose = message_in.getValueBoolean("cef_verbose_log");
  12.233  			}
  12.234  			else if (message_name == "size_change")
  12.235  			{
  12.236 @@ -522,11 +574,11 @@
  12.237  
  12.238  						mTextureWidth = texture_width;
  12.239  						mTextureHeight = texture_height;
  12.240 +
  12.241 +						mCEFLib->setSize(mWidth, mHeight);
  12.242  					};
  12.243  				};
  12.244  
  12.245 -				mCEFLib->setSize(mWidth, mHeight);
  12.246 -
  12.247  				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
  12.248  				message.setValue("name", name);
  12.249  				message.setValueS32("width", width);
  12.250 @@ -653,7 +705,14 @@
  12.251  			}
  12.252  			if (message_name == "pick_file_response")
  12.253  			{
  12.254 -				mPickedFile = message_in.getValue("file");
  12.255 +				LLSD file_list_llsd = message_in.getValueLLSD("file_list");
  12.256 +
  12.257 +				LLSD::array_const_iterator iter = file_list_llsd.beginArray();
  12.258 +				LLSD::array_const_iterator end = file_list_llsd.endArray();
  12.259 +				for (; iter != end; ++iter)
  12.260 +				{
  12.261 +					mPickedFiles.push_back(((*iter).asString()));
  12.262 +				}
  12.263  			}
  12.264  			if (message_name == "auth_response")
  12.265  			{
  12.266 @@ -700,6 +759,10 @@
  12.267  			{
  12.268  				mCookiesEnabled = message_in.getValueBoolean("enable");
  12.269  			}
  12.270 +			else if (message_name == "clear_cookies")
  12.271 +			{
  12.272 +				mCEFLib->deleteAllCookies();
  12.273 +			}
  12.274  			else if (message_name == "set_user_agent")
  12.275  			{
  12.276  				mUserAgentSubtring = message_in.getValue("user_agent");
    13.1 --- a/indra/newview/VIEWER_VERSION.txt	Sat Apr 07 12:06:15 2018 +0200
    13.2 +++ b/indra/newview/VIEWER_VERSION.txt	Thu Apr 12 21:55:46 2018 +0200
    13.3 @@ -1,1 +1,1 @@
    13.4 -5.1.3
    13.5 +5.1.4
    14.1 --- a/indra/newview/app_settings/settings.xml	Sat Apr 07 12:06:15 2018 +0200
    14.2 +++ b/indra/newview/app_settings/settings.xml	Thu Apr 12 21:55:46 2018 +0200
    14.3 @@ -21042,6 +21042,17 @@
    14.4        <key>Value</key>
    14.5        <integer>0</integer>
    14.6      </map>
    14.7 +    <key>CefVerboseLog</key>
    14.8 +    <map>
    14.9 +      <key>Comment</key>
   14.10 +      <string>Enable/disable CEF verbose loggingk</string>
   14.11 +      <key>Persist</key>
   14.12 +      <integer>1</integer>
   14.13 +      <key>Type</key>
   14.14 +      <string>Boolean</string>
   14.15 +      <key>Value</key>
   14.16 +      <integer>0</integer>
   14.17 +    </map>
   14.18      <key>FSShowServerVersionChangeNotice</key>
   14.19      <map>
   14.20        <key>Comment</key>
    15.1 --- a/indra/newview/llappviewer.cpp	Sat Apr 07 12:06:15 2018 +0200
    15.2 +++ b/indra/newview/llappviewer.cpp	Thu Apr 12 21:55:46 2018 +0200
    15.3 @@ -2318,8 +2318,6 @@
    15.4  
    15.5  	LLAvatarIconIDCache::getInstance()->save();
    15.6  	
    15.7 -	LLViewerMedia::saveCookieFile();
    15.8 -
    15.9  	// Stop the plugin read thread if it's running.
   15.10  	LLPluginProcessParent::setUseReadThread(false);
   15.11  
   15.12 @@ -3832,8 +3830,14 @@
   15.13  	cef_ver_codec << " / CEF: ";
   15.14  	cef_ver_codec << CEF_VERSION;
   15.15  
   15.16 -	cef_ver_codec << " / Chrome: ";
   15.17 +	cef_ver_codec << " / Chromium: ";
   15.18  	cef_ver_codec << CHROME_VERSION_MAJOR;
   15.19 +	cef_ver_codec << ".";
   15.20 +	cef_ver_codec << CHROME_VERSION_MINOR;
   15.21 +	cef_ver_codec << ".";
   15.22 +	cef_ver_codec << CHROME_VERSION_BUILD;
   15.23 +	cef_ver_codec << ".";
   15.24 +	cef_ver_codec << CHROME_VERSION_PATCH;
   15.25  
   15.26  	info["LIBCEF_VERSION"] = cef_ver_codec.str();
   15.27  //#else
    16.1 --- a/indra/newview/llfloaterfacebook.cpp	Sat Apr 07 12:06:15 2018 +0200
    16.2 +++ b/indra/newview/llfloaterfacebook.cpp	Thu Apr 12 21:55:46 2018 +0200
    16.3 @@ -1,4 +1,4 @@
    16.4 -/** 
    16.5 +/**
    16.6  * @file llfloaterfacebook.cpp
    16.7  * @brief Implementation of llfloaterfacebook
    16.8  * @author Gilbert@lindenlab.com
    16.9 @@ -41,7 +41,6 @@
   16.10  #include "llresmgr.h"		// LLLocale
   16.11  #include "llsdserialize.h"
   16.12  #include "llloadingindicator.h"
   16.13 -#include "llplugincookiestore.h"
   16.14  #include "llslurl.h"
   16.15  #include "lltrans.h"
   16.16  #include "llsnapshotlivepreview.h"
   16.17 @@ -303,16 +302,11 @@
   16.18  void LLFacebookStatusPanel::onConnect()
   16.19  {
   16.20      LLFacebookConnect::instance().checkConnectionToFacebook(true);
   16.21 -
   16.22 -    //Clear only the facebook browser cookies so that the facebook login screen appears
   16.23 -    LLViewerMedia::getCookieStore()->removeCookiesByDomain(".facebook.com");
   16.24  }
   16.25  
   16.26  void LLFacebookStatusPanel::onDisconnect()
   16.27  {
   16.28      LLFacebookConnect::instance().disconnectFromFacebook();
   16.29 -
   16.30 -    LLViewerMedia::getCookieStore()->removeCookiesByDomain(".facebook.com");
   16.31  }
   16.32  
   16.33  void LLFacebookStatusPanel::clearAndClose()
   16.34 @@ -914,7 +908,7 @@
   16.35      LLAgentUI::buildSLURL(slurl);
   16.36      std::string slurl_string = slurl.getSLURLString();
   16.37  
   16.38 -    // Use a valid http:// URL if the scheme is secondlife:// 
   16.39 +    // Use a valid http:// URL if the scheme is secondlife://
   16.40      LLURI slurl_uri(slurl_string);
   16.41      if (slurl_uri.scheme() == LLSLURL::SLURL_SECONDLIFE_SCHEME)
   16.42      {
    17.1 --- a/indra/newview/llfloaterflickr.cpp	Sat Apr 07 12:06:15 2018 +0200
    17.2 +++ b/indra/newview/llfloaterflickr.cpp	Thu Apr 12 21:55:46 2018 +0200
    17.3 @@ -40,7 +40,6 @@
    17.4  #include "llresmgr.h"		// LLLocale
    17.5  #include "llsdserialize.h"
    17.6  #include "llloadingindicator.h"
    17.7 -#include "llplugincookiestore.h"
    17.8  #include "llslurl.h"
    17.9  #include "lltrans.h"
   17.10  #include "llsnapshotlivepreview.h"
   17.11 @@ -889,16 +888,11 @@
   17.12  void LLFlickrAccountPanel::onConnect()
   17.13  {
   17.14  	LLFlickrConnect::instance().checkConnectionToFlickr(true);
   17.15 -
   17.16 -	//Clear only the flickr browser cookies so that the flickr login screen appears
   17.17 -	LLViewerMedia::getCookieStore()->removeCookiesByDomain(".flickr.com"); 
   17.18  }
   17.19  
   17.20  void LLFlickrAccountPanel::onDisconnect()
   17.21  {
   17.22  	LLFlickrConnect::instance().disconnectFromFlickr();
   17.23 -
   17.24 -	LLViewerMedia::getCookieStore()->removeCookiesByDomain(".flickr.com"); 
   17.25  }
   17.26  
   17.27  ////////////////////////
    18.1 --- a/indra/newview/llfloaterpreference.cpp	Sat Apr 07 12:06:15 2018 +0200
    18.2 +++ b/indra/newview/llfloaterpreference.cpp	Thu Apr 12 21:55:46 2018 +0200
    18.3 @@ -560,7 +560,6 @@
    18.4  	mCommitCallbackRegistrar.add("Pref.BrowseCrashLogs",		boost::bind(&LLFloaterPreference::onClickBrowseCrashLogs, this));
    18.5  	mCommitCallbackRegistrar.add("Pref.BrowseSettingsDir",		boost::bind(&LLFloaterPreference::onClickBrowseSettingsDir, this));
    18.6  	mCommitCallbackRegistrar.add("Pref.BrowseLogPath",			boost::bind(&LLFloaterPreference::onClickBrowseChatLogDir, this));
    18.7 -	mCommitCallbackRegistrar.add("Pref.Cookies",	    		boost::bind(&LLFloaterPreference::onClickCookies, this));
    18.8  	mCommitCallbackRegistrar.add("Pref.Javascript",	        	boost::bind(&LLFloaterPreference::onClickJavascript, this));
    18.9  	//[FIX FIRE-2765 : SJ] Making sure Reset button resets works
   18.10  	mCommitCallbackRegistrar.add("Pref.ResetLogPath",			boost::bind(&LLFloaterPreference::onClickResetLogPath, this));
   18.11 @@ -1849,16 +1848,13 @@
   18.12  	}
   18.13  }
   18.14  
   18.15 -//[FIX JIRA-1971 : SJ] Show an notify when Cookies setting change
   18.16 -void LLFloaterPreference::onClickCookies()
   18.17 -{
   18.18 -	LLNotificationsUtil::add("DisableCookiesBreaksSearch");
   18.19 -}
   18.20 -
   18.21  //[FIX JIRA-1971 : SJ] Show an notify when Javascript setting change
   18.22  void LLFloaterPreference::onClickJavascript()
   18.23  {
   18.24 -	LLNotificationsUtil::add("DisableJavascriptBreaksSearch");
   18.25 +	if (!gSavedSettings.getBOOL("BrowserJavascriptEnabled"))
   18.26 +	{
   18.27 +		LLNotificationsUtil::add("DisableJavascriptBreaksSearch");
   18.28 +	}
   18.29  }
   18.30  
   18.31  /*
    19.1 --- a/indra/newview/llfloaterpreference.h	Sat Apr 07 12:06:15 2018 +0200
    19.2 +++ b/indra/newview/llfloaterpreference.h	Thu Apr 12 21:55:46 2018 +0200
    19.3 @@ -184,7 +184,6 @@
    19.4  	void onClickBrowseChatLogDir();
    19.5  	void onClickResetCache();
    19.6  	void onClickClearCache(); // AO: was protected, moved to public
    19.7 -	void onClickCookies();
    19.8  	void onClickJavascript();
    19.9  	void onClickBrowseSettingsDir();
   19.10  	void onClickSkin(LLUICtrl* ctrl,const LLSD& userdata);
    20.1 --- a/indra/newview/llfloatertwitter.cpp	Sat Apr 07 12:06:15 2018 +0200
    20.2 +++ b/indra/newview/llfloatertwitter.cpp	Thu Apr 12 21:55:46 2018 +0200
    20.3 @@ -41,7 +41,6 @@
    20.4  #include "llresmgr.h"		// LLLocale
    20.5  #include "llsdserialize.h"
    20.6  #include "llloadingindicator.h"
    20.7 -#include "llplugincookiestore.h"
    20.8  #include "llslurl.h"
    20.9  #include "lltrans.h"
   20.10  #include "llsnapshotlivepreview.h"
   20.11 @@ -782,16 +781,11 @@
   20.12  void LLTwitterAccountPanel::onConnect()
   20.13  {
   20.14  	LLTwitterConnect::instance().checkConnectionToTwitter(true);
   20.15 -
   20.16 -	//Clear only the twitter browser cookies so that the twitter login screen appears
   20.17 -	LLViewerMedia::getCookieStore()->removeCookiesByDomain(".twitter.com"); 
   20.18  }
   20.19  
   20.20  void LLTwitterAccountPanel::onDisconnect()
   20.21  {
   20.22  	LLTwitterConnect::instance().disconnectFromTwitter();
   20.23 -
   20.24 -	LLViewerMedia::getCookieStore()->removeCookiesByDomain(".twitter.com"); 
   20.25  }
   20.26  
   20.27  ////////////////////////
    21.1 --- a/indra/newview/llmediactrl.cpp	Sat Apr 07 12:06:15 2018 +0200
    21.2 +++ b/indra/newview/llmediactrl.cpp	Thu Apr 12 21:55:46 2018 +0200
    21.3 @@ -1060,7 +1060,7 @@
    21.4  			// try as slurl first
    21.5  			if (!LLURLDispatcher::dispatch(url, "clicked", NULL, mTrusted))
    21.6  			{
    21.7 -				LLWeb::loadURL(url, target, std::string());
    21.8 +				LLWeb::loadURL(url, target, uuid);
    21.9  			}
   21.10  
   21.11  			// CP: removing this code because we no longer support popups so this breaks the flow.
    22.1 --- a/indra/newview/llpanelmaininventory.cpp	Sat Apr 07 12:06:15 2018 +0200
    22.2 +++ b/indra/newview/llpanelmaininventory.cpp	Thu Apr 12 21:55:46 2018 +0200
    22.3 @@ -1090,7 +1090,7 @@
    22.4  	}
    22.5  	
    22.6      mCounterCtrl->setValue(text);
    22.7 -    mCounterCtrl->setToolTip(text);
    22.8 +    //mCounterCtrl->setToolTip(text); // <FS:Ansariel> Include folders in inventory count
    22.9  }
   22.10  
   22.11  void LLPanelMainInventory::onFocusReceived()
    23.1 --- a/indra/newview/llstartup.cpp	Sat Apr 07 12:06:15 2018 +0200
    23.2 +++ b/indra/newview/llstartup.cpp	Thu Apr 12 21:55:46 2018 +0200
    23.3 @@ -1517,9 +1517,6 @@
    23.4  		// Load Avatars icons cache
    23.5  		LLAvatarIconIDCache::getInstance()->load();
    23.6  		
    23.7 -		// Load media plugin cookies
    23.8 -		LLViewerMedia::loadCookieFile();
    23.9 -
   23.10  		// <FS:Ansariel> [FS Persisted Avatar Render Settings]
   23.11  		//LLRenderMuteList::getInstance()->loadFromFile();
   23.12  
    24.1 --- a/indra/newview/llviewermedia.cpp	Sat Apr 07 12:06:15 2018 +0200
    24.2 +++ b/indra/newview/llviewermedia.cpp	Thu Apr 12 21:55:46 2018 +0200
    24.3 @@ -50,7 +50,6 @@
    24.4  #include "llpanelprofile.h"
    24.5  #include "llparcel.h"
    24.6  #include "llpluginclassmedia.h"
    24.7 -#include "llplugincookiestore.h"
    24.8  #include "llurldispatcher.h"
    24.9  #include "lluuid.h"
   24.10  #include "llversioninfo.h"
   24.11 @@ -154,7 +153,6 @@
   24.12  }
   24.13  
   24.14  
   24.15 -LLPluginCookieStore *LLViewerMedia::sCookieStore = NULL;
   24.16  LLURL LLViewerMedia::sOpenIDURL;
   24.17  std::string LLViewerMedia::sOpenIDCookie;
   24.18  LLPluginClassMedia* LLViewerMedia::sSpareBrowserMediaSource = NULL;
   24.19 @@ -169,8 +167,6 @@
   24.20  static bool sAnyMediaShowing = false;
   24.21  static bool sAnyMediaPlaying = false;
   24.22  static boost::signals2::connection sTeleportFinishConnection;
   24.23 -static std::string sUpdatedCookies;
   24.24 -static const char *PLUGIN_COOKIE_FILE_NAME = "plugin_cookies.txt";
   24.25  
   24.26  //////////////////////////////////////////////////////////////////////////////////////////
   24.27  static void add_media_impl(LLViewerMediaImpl* media)
   24.28 @@ -614,12 +610,6 @@
   24.29  
   24.30  	sAnyMediaShowing = false;
   24.31  	sAnyMediaPlaying = false;
   24.32 -	sUpdatedCookies = getCookieStore()->getChangedCookies();
   24.33 -	if(!sUpdatedCookies.empty())
   24.34 -	{
   24.35 -		LL_DEBUGS() << "updated cookies will be sent to all loaded plugins: " << LL_ENDL;
   24.36 -		LL_DEBUGS() << sUpdatedCookies << LL_ENDL;
   24.37 -	}
   24.38  
   24.39  	impl_list::iterator iter = sViewerMediaImplList.begin();
   24.40  	impl_list::iterator end = sViewerMediaImplList.end();
   24.41 @@ -1087,64 +1077,6 @@
   24.42  			pimpl->mMediaSource->clear_cookies();
   24.43  		}
   24.44  	}
   24.45 -
   24.46 -	// Clear all cookies from the cookie store
   24.47 -	getCookieStore()->setAllCookies("");
   24.48 -
   24.49 -	// FIXME: this may not be sufficient, since the on-disk cookie file won't get written until some browser instance exits cleanly.
   24.50 -	// It also won't clear cookies for other accounts, or for any account if we're not logged in, and won't do anything at all if there are no webkit plugins loaded.
   24.51 -	// Until such time as we can centralize cookie storage, the following hack should cover these cases:
   24.52 -
   24.53 -	// HACK: Look for cookie files in all possible places and delete them.
   24.54 -	// NOTE: this assumes knowledge of what happens inside the webkit plugin (it's what adds 'browser_profile' to the path and names the cookie file)
   24.55 -
   24.56 -	// Places that cookie files can be:
   24.57 -	// <getOSUserAppDir>/browser_profile/cookies
   24.58 -	// <getOSUserAppDir>/first_last/browser_profile/cookies  (note that there may be any number of these!)
   24.59 -	// <getOSUserAppDir>/first_last/plugin_cookies.txt  (note that there may be any number of these!)
   24.60 -
   24.61 -	std::string base_dir = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter();
   24.62 -	std::string target;
   24.63 -	std::string filename;
   24.64 -
   24.65 -	LL_DEBUGS() << "base dir = " << base_dir << LL_ENDL;
   24.66 -
   24.67 -	// The non-logged-in version is easy
   24.68 -	target = base_dir;
   24.69 -	target += "browser_profile";
   24.70 -	target += gDirUtilp->getDirDelimiter();
   24.71 -	target += "cookies";
   24.72 -	LL_DEBUGS() << "target = " << target << LL_ENDL;
   24.73 -	if(LLFile::isfile(target))
   24.74 -	{
   24.75 -		LLFile::remove(target);
   24.76 -	}
   24.77 -
   24.78 -	// the hard part: iterate over all user directories and delete the cookie file from each one
   24.79 -	LLDirIterator dir_iter(base_dir, "*_*");
   24.80 -	while (dir_iter.next(filename))
   24.81 -	{
   24.82 -		target = gDirUtilp->add(base_dir, filename);
   24.83 -		gDirUtilp->append(target, "browser_profile");
   24.84 -		gDirUtilp->append(target, "cookies");
   24.85 -		LL_DEBUGS() << "target = " << target << LL_ENDL;
   24.86 -		if(LLFile::isfile(target))
   24.87 -		{
   24.88 -			LLFile::remove(target);
   24.89 -		}
   24.90 -
   24.91 -		// Other accounts may have new-style cookie files too -- delete them as well
   24.92 -		target = gDirUtilp->add(base_dir, filename);
   24.93 -		gDirUtilp->append(target, PLUGIN_COOKIE_FILE_NAME);
   24.94 -		LL_DEBUGS() << "target = " << target << LL_ENDL;
   24.95 -		if(LLFile::isfile(target))
   24.96 -		{
   24.97 -			LLFile::remove(target);
   24.98 -		}
   24.99 -	}
  24.100 -
  24.101 -	// If we have an OpenID cookie, re-add it to the cookie store.
  24.102 -	setOpenIDCookie(std::string());
  24.103  }
  24.104  
  24.105  /////////////////////////////////////////////////////////////////////////////////////////
  24.106 @@ -1173,7 +1105,7 @@
  24.107  		LLViewerMediaImpl* pimpl = *iter;
  24.108  		if(pimpl->mMediaSource)
  24.109  		{
  24.110 -			pimpl->mMediaSource->enable_cookies(enabled);
  24.111 +			pimpl->mMediaSource->cookies_enabled(enabled);
  24.112  		}
  24.113  	}
  24.114  }
  24.115 @@ -1198,127 +1130,7 @@
  24.116  /////////////////////////////////////////////////////////////////////////////////////////
  24.117  // static
  24.118  /////////////////////////////////////////////////////////////////////////////////////////
  24.119 -// static
  24.120 -LLPluginCookieStore *LLViewerMedia::getCookieStore()
  24.121 -{
  24.122 -	if(sCookieStore == NULL)
  24.123 -	{
  24.124 -		sCookieStore = new LLPluginCookieStore;
  24.125 -	}
  24.126 -
  24.127 -	return sCookieStore;
  24.128 -}
  24.129 -
  24.130 -/////////////////////////////////////////////////////////////////////////////////////////
  24.131 -// static
  24.132 -void LLViewerMedia::loadCookieFile()
  24.133 -{
  24.134 -	// build filename for each user
  24.135 -	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PLUGIN_COOKIE_FILE_NAME);
  24.136 -
  24.137 -	if (resolved_filename.empty())
  24.138 -	{
  24.139 -		LL_INFOS() << "can't get path to plugin cookie file - probably not logged in yet." << LL_ENDL;
  24.140 -		return;
  24.141 -	}
  24.142 -
  24.143 -	// open the file for reading
  24.144 -	llifstream file(resolved_filename.c_str());
  24.145 -	if (!file.is_open())
  24.146 -	{
  24.147 -		LL_WARNS() << "can't load plugin cookies from file \"" << PLUGIN_COOKIE_FILE_NAME << "\"" << LL_ENDL;
  24.148 -		return;
  24.149 -	}
  24.150 -
  24.151 -	getCookieStore()->readAllCookies(file, true);
  24.152 -
  24.153 -	file.close();
  24.154 -
  24.155 -	// send the clear_cookies message to all loaded plugins
  24.156 -	impl_list::iterator iter = sViewerMediaImplList.begin();
  24.157 -	impl_list::iterator end = sViewerMediaImplList.end();
  24.158 -	for (; iter != end; iter++)
  24.159 -	{
  24.160 -		LLViewerMediaImpl* pimpl = *iter;
  24.161 -		if(pimpl->mMediaSource)
  24.162 -		{
  24.163 -			pimpl->mMediaSource->clear_cookies();
  24.164 -		}
  24.165 -	}
  24.166 -
  24.167 -	// If we have an OpenID cookie, re-add it to the cookie store.
  24.168 -	setOpenIDCookie(std::string());
  24.169 -}
  24.170 -
  24.171 -
  24.172 -/////////////////////////////////////////////////////////////////////////////////////////
  24.173 -// static
  24.174 -void LLViewerMedia::saveCookieFile()
  24.175 -{
  24.176 -	// build filename for each user
  24.177 -	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PLUGIN_COOKIE_FILE_NAME);
  24.178 -
  24.179 -	if (resolved_filename.empty())
  24.180 -	{
  24.181 -		LL_INFOS() << "can't get path to plugin cookie file - probably not logged in yet." << LL_ENDL;
  24.182 -		return;
  24.183 -	}
  24.184 -
  24.185 -	// open a file for writing
  24.186 -	llofstream file(resolved_filename.c_str());
  24.187 -	if (!file.is_open())
  24.188 -	{
  24.189 -		LL_WARNS() << "can't open plugin cookie file \"" << PLUGIN_COOKIE_FILE_NAME << "\" for writing" << LL_ENDL;
  24.190 -		return;
  24.191 -	}
  24.192 -
  24.193 -	getCookieStore()->writePersistentCookies(file);
  24.194 -
  24.195 -	file.close();
  24.196 -}
  24.197 -
  24.198 -/////////////////////////////////////////////////////////////////////////////////////////
  24.199 -// static
  24.200 -void LLViewerMedia::addCookie(const std::string &name, const std::string &value, const std::string &domain, const LLDate &expires, const std::string &path, bool secure)
  24.201 -{
  24.202 -	std::stringstream cookie;
  24.203 -
  24.204 -	cookie << name << "=" << LLPluginCookieStore::quoteString(value);
  24.205 -
  24.206 -	if(expires.notNull())
  24.207 -	{
  24.208 -		cookie << "; expires=" << expires.asRFC1123();
  24.209 -	}
  24.210 -
  24.211 -	cookie << "; domain=" << domain;
  24.212 -
  24.213 -	cookie << "; path=" << path;
  24.214 -
  24.215 -	if(secure)
  24.216 -	{
  24.217 -		cookie << "; secure";
  24.218 -	}
  24.219 -
  24.220 -	getCookieStore()->setCookies(cookie.str());
  24.221 -}
  24.222 -
  24.223 -/////////////////////////////////////////////////////////////////////////////////////////
  24.224 -// static
  24.225 -void LLViewerMedia::addSessionCookie(const std::string &name, const std::string &value, const std::string &domain, const std::string &path, bool secure)
  24.226 -{
  24.227 -	// A session cookie just has a NULL date.
  24.228 -	addCookie(name, value, domain, LLDate(), path, secure);
  24.229 -}
  24.230 -
  24.231 -/////////////////////////////////////////////////////////////////////////////////////////
  24.232 -// static
  24.233 -void LLViewerMedia::removeCookie(const std::string &name, const std::string &domain, const std::string &path )
  24.234 -{
  24.235 -	// To remove a cookie, add one with the same name, domain, and path that expires in the past.
  24.236 -
  24.237 -	addCookie(name, "", domain, LLDate(LLDate::now().secondsSinceEpoch() - 1.0), path);
  24.238 -}
  24.239 -
  24.240 +//// static
  24.241  
  24.242  LLSD LLViewerMedia::getHeaders()
  24.243  {
  24.244 @@ -1423,8 +1235,6 @@
  24.245          hostEnd = authority.size();
  24.246      }
  24.247  
  24.248 -    getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(hostStart, hostEnd - hostStart));
  24.249 -
  24.250  	if (url.length())
  24.251  	{
  24.252  		LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");
  24.253 @@ -1462,7 +1272,6 @@
  24.254      httpHeaders->append(HTTP_OUT_HEADER_COOKIE, sOpenIDCookie);
  24.255      httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, getCurrentUserAgent());
  24.256  
  24.257 -
  24.258      LL_DEBUGS("MediaAuth") << "Requesting " << url << LL_ENDL;
  24.259      LL_DEBUGS("MediaAuth") << "sOpenIDCookie = [" << sOpenIDCookie << "]" << LL_ENDL;
  24.260      
  24.261 @@ -1487,13 +1296,9 @@
  24.262      const std::string& cookie = resultHeaders[HTTP_IN_HEADER_SET_COOKIE].asStringRef();
  24.263      LL_DEBUGS("MediaAuth") << "cookie = " << cookie << LL_ENDL;
  24.264  
  24.265 -    // *TODO: What about bad status codes?  Does this destroy previous cookies?
  24.266 -    LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, hostAuth);
  24.267 -
  24.268      // Set cookie for snapshot publishing.
  24.269      std::string authCookie = cookie.substr(0, cookie.find(";")); // strip path
  24.270      LLWebProfile::setAuthCookie(authCookie);
  24.271 -
  24.272  }
  24.273  
  24.274  /////////////////////////////////////////////////////////////////////////////////////////
  24.275 @@ -1688,12 +1493,6 @@
  24.276  		delete sSpareBrowserMediaSource;
  24.277  		sSpareBrowserMediaSource = NULL;
  24.278  	}
  24.279 -
  24.280 -	if (sCookieStore != NULL)
  24.281 -	{
  24.282 -		delete sCookieStore;
  24.283 -		sCookieStore = NULL;
  24.284 -	}
  24.285  }
  24.286  
  24.287  //////////////////////////////////////////////////////////////////////////////////////////
  24.288 @@ -1943,6 +1742,8 @@
  24.289  		std::string user_data_path_cookies = gDirUtilp->getOSUserAppDir();
  24.290  		user_data_path_cookies += gDirUtilp->getDirDelimiter();
  24.291  
  24.292 +		std::string user_data_path_cef_log = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "cef_log.txt");
  24.293 +
  24.294  		// Fix for EXT-5960 - make browser profile specific to user (cache, cookies etc.)
  24.295  		// If the linden username returned is blank, that can only mean we are
  24.296  		// at the login page displaying login Web page or Web browser test via Develop menu.
  24.297 @@ -1951,7 +1752,6 @@
  24.298  		std::string linden_user_dir = gDirUtilp->getLindenUserDir();
  24.299  		if ( ! linden_user_dir.empty() )
  24.300  		{
  24.301 -			// gDirUtilp->getLindenUserDir() is whole path, not just Linden name
  24.302  			user_data_path_cookies = linden_user_dir;
  24.303  			user_data_path_cookies += gDirUtilp->getDirDelimiter();
  24.304  		};
  24.305 @@ -1972,13 +1772,13 @@
  24.306  		{
  24.307  			media_source = new LLPluginClassMedia(owner);
  24.308  			media_source->setSize(default_width, default_height);
  24.309 -			media_source->setUserDataPath(user_data_path_cache, user_data_path_cookies);
  24.310 +			media_source->setUserDataPath(user_data_path_cache, user_data_path_cookies, user_data_path_cef_log);
  24.311  			media_source->setLanguageCode(LLUI::getLanguage());
  24.312  			media_source->setZoomFactor(zoom_factor);
  24.313  
  24.314  			// collect 'cookies enabled' setting from prefs and send to embedded browser
  24.315  			bool cookies_enabled = gSavedSettings.getBOOL( "CookiesEnabled" );
  24.316 -			media_source->enable_cookies( cookies_enabled || clean_browser);
  24.317 +			media_source->cookies_enabled( cookies_enabled || clean_browser);
  24.318  
  24.319  			// collect 'plugins enabled' setting from prefs and send to embedded browser
  24.320  			bool plugins_enabled = gSavedSettings.getBOOL( "BrowserPluginsEnabled" );
  24.321 @@ -2085,17 +1885,6 @@
  24.322  			media_source->clear_cache();
  24.323  		}
  24.324  
  24.325 -		// TODO: Only send cookies to plugins that need them
  24.326 -		//  Ideally, the plugin should tell us whether it handles cookies or not -- either via the init response or through a separate message.
  24.327 -		//  Due to the ordering of messages, it's possible we wouldn't get that information back in time to send cookies before sending a navigate message,
  24.328 -		//  which could cause odd race conditions.
  24.329 -		std::string all_cookies = LLViewerMedia::getCookieStore()->getAllCookies();
  24.330 -		LL_DEBUGS() << "setting cookies: " << all_cookies << LL_ENDL;
  24.331 -		if(!all_cookies.empty())
  24.332 -		{
  24.333 -			media_source->set_cookies(all_cookies);
  24.334 -		}
  24.335 -
  24.336  		mMediaSource = media_source;
  24.337  		mMediaSource->setDeleteOK(false) ;
  24.338  		updateVolume();
  24.339 @@ -3055,14 +2844,10 @@
  24.340  		updateVolume();
  24.341  
  24.342  		// TODO: this is updated every frame - is this bad?
  24.343 -		updateJavascriptObject();
  24.344 -
  24.345 -		// If we didn't just create the impl, it may need to get cookie updates.
  24.346 -		if(!sUpdatedCookies.empty())
  24.347 -		{
  24.348 -			// TODO: Only send cookies to plugins that need them
  24.349 -			mMediaSource->set_cookies(sUpdatedCookies);
  24.350 -		}
  24.351 +		// Removing this as part of the post viewer64 media update
  24.352 +		// Removed as not implemented in CEF embedded browser
  24.353 +		// See MAINT-8194 for a more fuller description
  24.354 +		// updateJavascriptObject();
  24.355  	}
  24.356  
  24.357  
  24.358 @@ -3555,22 +3340,40 @@
  24.359  
  24.360  		case LLViewerMediaObserver::MEDIA_EVENT_PICK_FILE_REQUEST:
  24.361  		{
  24.362 -			// Display a file picker
  24.363 -			std::string response;
  24.364 -
  24.365  			LLFilePicker& picker = LLFilePicker::instance();
  24.366 -			if (!picker.getOpenFile(LLFilePicker::FFLOAD_ALL))
  24.367 +			std::vector<std::string> responses;
  24.368 +
  24.369 +			bool pick_multiple_files = plugin->getIsMultipleFilePick();
  24.370 +			if (pick_multiple_files == false)
  24.371  			{
  24.372 -				// The user didn't pick a file -- the empty response string will indicate this.
  24.373 +				picker.getOpenFile(LLFilePicker::FFLOAD_ALL);
  24.374 +
  24.375 +				std::string filename = picker.getFirstFile();
  24.376 +				responses.push_back(filename);
  24.377  			}
  24.378 -
  24.379 -			response = picker.getFirstFile();
  24.380 -
  24.381 -			plugin->sendPickFileResponse(response);
  24.382 +			else
  24.383 +			{
  24.384 +				if (picker.getMultipleOpenFiles())
  24.385 +				{
  24.386 +					std::string filename = picker.getFirstFile();
  24.387 +
  24.388 +					responses.push_back(filename);
  24.389 +
  24.390 +					while (!filename.empty())
  24.391 +					{
  24.392 +						filename = picker.getNextFile();
  24.393 +
  24.394 +						if (!filename.empty())
  24.395 +						{
  24.396 +							responses.push_back(filename);
  24.397 +						}
  24.398 +					}
  24.399 +				}
  24.400 +			}
  24.401 +			plugin->sendPickFileResponse(responses);
  24.402  		}
  24.403  		break;
  24.404  
  24.405 -
  24.406  		case LLViewerMediaObserver::MEDIA_EVENT_AUTH_REQUEST:
  24.407  		{
  24.408  			LLNotification::Params auth_request_params;
  24.409 @@ -3640,13 +3443,6 @@
  24.410  
  24.411  ////////////////////////////////////////////////////////////////////////////////
  24.412  // virtual
  24.413 -void LLViewerMediaImpl::handleCookieSet(LLPluginClassMedia* self, const std::string &cookie)
  24.414 -{
  24.415 -	LLViewerMedia::getCookieStore()->setCookies(cookie);
  24.416 -}
  24.417 -
  24.418 -////////////////////////////////////////////////////////////////////////////////
  24.419 -// virtual
  24.420  void
  24.421  LLViewerMediaImpl::cut()
  24.422  {
    25.1 --- a/indra/newview/llviewermedia.h	Sat Apr 07 12:06:15 2018 +0200
    25.2 +++ b/indra/newview/llviewermedia.h	Thu Apr 12 21:55:46 2018 +0200
    25.3 @@ -50,7 +50,6 @@
    25.4  class LLMediaEntry;
    25.5  class LLVOVolume;
    25.6  class LLMimeDiscoveryResponder;
    25.7 -class LLPluginCookieStore;
    25.8  
    25.9  typedef LLPointer<LLViewerMediaImpl> viewer_media_t;
   25.10  ///////////////////////////////////////////////////////////////////////////////
   25.11 @@ -149,13 +148,6 @@
   25.12  	// Set the proxy config for all loaded plugins
   25.13  	static void setProxyConfig(bool enable, const std::string &host, int port);
   25.14  	
   25.15 -	static LLPluginCookieStore *getCookieStore();
   25.16 -	static void loadCookieFile();
   25.17 -	static void saveCookieFile();
   25.18 -	static void addCookie(const std::string &name, const std::string &value, const std::string &domain, const LLDate &expires, const std::string &path = std::string("/"), bool secure = false );
   25.19 -	static void addSessionCookie(const std::string &name, const std::string &value, const std::string &domain, const std::string &path = std::string("/"), bool secure = false );
   25.20 -	static void removeCookie(const std::string &name, const std::string &domain, const std::string &path = std::string("/") );
   25.21 -
   25.22  	static void openIDSetup(const std::string &openid_url, const std::string &openid_token);
   25.23  	static void openIDCookieResponse(const std::string& url, const std::string &cookie);
   25.24  	
   25.25 @@ -178,7 +170,6 @@
   25.26      static void openIDSetupCoro(std::string openidUrl, std::string openidToken);
   25.27      static void getOpenIDCookieCoro(std::string url);
   25.28  
   25.29 -	static LLPluginCookieStore *sCookieStore;
   25.30  	static LLURL sOpenIDURL;
   25.31  	static std::string sOpenIDCookie;
   25.32  	static LLPluginClassMedia* sSpareBrowserMediaSource;
   25.33 @@ -337,7 +328,6 @@
   25.34  
   25.35  	// Inherited from LLPluginClassMediaOwner
   25.36  	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent);
   25.37 -	/*virtual*/ void handleCookieSet(LLPluginClassMedia* self, const std::string &cookie);
   25.38  
   25.39  	// LLEditMenuHandler overrides
   25.40  	/*virtual*/ void	cut();
    26.1 --- a/indra/newview/llviewershadermgr.cpp	Sat Apr 07 12:06:15 2018 +0200
    26.2 +++ b/indra/newview/llviewershadermgr.cpp	Thu Apr 12 21:55:46 2018 +0200
    26.3 @@ -2829,6 +2829,7 @@
    26.4  			gSkinnedObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
    26.5  			gSkinnedObjectSimpleWaterProgram.mFeatures.hasObjectSkinning = true;
    26.6  			gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true;
    26.7 +			gSkinnedObjectSimpleWaterProgram.mFeatures.hasAlphaMask = true;
    26.8  			gSkinnedObjectSimpleWaterProgram.mShaderFiles.clear();
    26.9  			gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
   26.10  			gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
    27.1 --- a/indra/newview/llwebprofile.cpp	Sat Apr 07 12:06:15 2018 +0200
    27.2 +++ b/indra/newview/llwebprofile.cpp	Thu Apr 12 21:55:46 2018 +0200
    27.3 @@ -31,7 +31,6 @@
    27.4  // libs
    27.5  #include "llbufferstream.h"
    27.6  #include "llimagepng.h"
    27.7 -#include "llplugincookiestore.h"
    27.8  
    27.9  #include "llsdserialize.h"
   27.10  
    28.1 --- a/indra/newview/skins/default/xui/de/floater_web_content.xml	Sat Apr 07 12:06:15 2018 +0200
    28.2 +++ b/indra/newview/skins/default/xui/de/floater_web_content.xml	Thu Apr 12 21:55:46 2018 +0200
    28.3 @@ -12,11 +12,6 @@
    28.4  		</layout_panel>
    28.5  		<layout_panel name="debug_controls">
    28.6  			<button name="web_test_home_page" tool_tip="Webtests Homepage"/>
    28.7 -			<button name="VLC Plugin Test MPEG4" tool_tip="MPEG4-Videotest"/>
    28.8 -			<button name="VLC Plugin Test MKV" tool_tip="MKV-Videotest"/>
    28.9 -			<button name="VLC Plugin Test WebM" tool_tip="WebM-Videotest"/>
   28.10 -			<button name="VLC Plugin Test MP3" tool_tip="MP3-Audiotest"/>
   28.11 -			<button name="VLC Plugin Test FLV" tool_tip="FLV-Test"/>
   28.12  		</layout_panel>
   28.13  		<layout_panel name="external_controls">
   28.14  			<text name="plugin_fail_text">
    29.1 --- a/indra/newview/skins/default/xui/de/notifications.xml	Sat Apr 07 12:06:15 2018 +0200
    29.2 +++ b/indra/newview/skins/default/xui/de/notifications.xml	Thu Apr 12 21:55:46 2018 +0200
    29.3 @@ -597,6 +597,9 @@
    29.4  	<notification name="CacheWillClear">
    29.5  		Der Cache wird nach einem Neustart von [APP_NAME] geleert.
    29.6  	</notification>
    29.7 +	<notification name="DisableJavascriptBreaksSearch">
    29.8 +		Wenn Sie Javascript deaktivieren wird die Suchfunktion nicht korrekt funktionieren und Sie werden sie nicht benutzen können.
    29.9 +	</notification>
   29.10  	<notification name="CacheWillBeMoved">
   29.11  		Der Cache wird nach einem Neustart von [APP_NAME] verschoben.
   29.12  Hinweis: Der Cache wird dabei gelöscht/geleert.
    30.1 --- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml	Sat Apr 07 12:06:15 2018 +0200
    30.2 +++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml	Thu Apr 12 21:55:46 2018 +0200
    30.3 @@ -23,7 +23,7 @@
    30.4  				Web-Browser:
    30.5  			</text>
    30.6  			<radio_group name="preferred_browser_behavior">
    30.7 -				<radio_item label="Meinen Browser (IE, Firefox, Safari) für alle Links verwenden" name="new_external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen."/>
    30.8 +				<radio_item label="Standard-Webbrowser des Systems für alle Links verwenden" name="new_external" tool_tip="Standard-Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen."/>
    30.9  				<radio_item label="Integrierten Browser nur für Second-Life-Links verwenden" name="new_internal" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]."/>
   30.10  				<radio_item label="Integrierten Browser für alle Links verwenden" name="new_internal_all" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]."/>
   30.11  			</radio_group>
   30.12 @@ -38,7 +38,6 @@
   30.13  			</combo_box>
   30.14  			<button label="Webbrowser-Cache löschen" name="ClearWebBrowserCache" width="160"/>
   30.15  			<check_box label="Plugins aktivieren" name="browser_plugins_enabled"/>
   30.16 -			<check_box label="Cookies annehmen" name="cookies_enabled"/>
   30.17  			<check_box label="Javascript aktivieren" name="browser_javascript_enabled"/>
   30.18  			<check_box label="Medienbrowser-Popups aktivieren" name="media_popup_enabled"/>
   30.19  			<button label="Proxy-Einstellungen ändern" label_selected="Proxy-Einstellungen ändern" name="set_proxy"/>
    31.1 --- a/indra/newview/skins/default/xui/en/floater_about.xml	Sat Apr 07 12:06:15 2018 +0200
    31.2 +++ b/indra/newview/skins/default/xui/en/floater_about.xml	Thu Apr 12 21:55:46 2018 +0200
    31.3 @@ -8,14 +8,14 @@
    31.4   help_topic="floater_about"
    31.5   save_rect="true"
    31.6   title="About [APP_NAME]"
    31.7 - width="470">
    31.8 + width="500">
    31.9    
   31.10    <tab_container
   31.11      follows="all" 
   31.12      top="20"
   31.13      left="7"
   31.14      height="572" 
   31.15 -    width="456" 
   31.16 +    width="486" 
   31.17      name="about_tab"
   31.18      tab_position="top">
   31.19      <panel
   31.20 @@ -46,7 +46,7 @@
   31.21          max_length="65536"
   31.22          name="support_editor"
   31.23          top_pad="5"
   31.24 -        width="444"
   31.25 +        width="474"
   31.26          word_wrap="true" />
   31.27        <button
   31.28          follows="left|top" 
   31.29 @@ -69,7 +69,7 @@
   31.30          left="4"
   31.31          name="linden_intro"
   31.32          top="16"
   31.33 -        width="444"
   31.34 +        width="474"
   31.35          wrap="true">
   31.36  Firestorm would not be possible without the decision from Linden Lab to make their Second Life viewer source code available.
   31.37  
   31.38 @@ -85,7 +85,7 @@
   31.39         max_length="65536"
   31.40         name="contrib_names"
   31.41         top_pad="5"
   31.42 -       width="446"
   31.43 +       width="476"
   31.44         word_wrap="true">
   31.45  Dummy Name replaced at run time
   31.46        </text_editor>
   31.47 @@ -122,7 +122,7 @@
   31.48                   left="5"
   31.49                   name="firestorm_intro"
   31.50                   top="0"
   31.51 -                 width="420"
   31.52 +                 width="450"
   31.53                   wrap="true">
   31.54  Firestorm is a community development project to improve the SecondLife(tm) Viewer experience.  We package contributions from various community developers along with code from Linden Lab and ourselves to bring you a quality, feature-rich viewer experience backed up by a large volunteer support team.  Firestorm is brought to you by The Phoenix Firestorm Project, Inc., a non-profit organization.
   31.55  
   31.56 @@ -138,7 +138,7 @@
   31.57                   max_length="65536"
   31.58                   name="firestorm_names"
   31.59                   top_pad="4"
   31.60 -                 width="420"
   31.61 +                 width="450"
   31.62                   wrap="true">
   31.63  Ansariel Hiller, ArminWeatherHax, Arrehn Oberlander, Beq Janus, Cinder Roxley, Holy Gavenkrantz, Jessica Lyon, Kadah Coba, Kitty Barnett, Liny Odell, LordGregGreg Back, Mobius Ryba, Nicky Dasmijn, PanteraPolnocy, Selo Jacobus, Tankmaster Finesmith, Techwolf Lupindo, Tonya Souther, Tozh Taurog, Vortex Saito, WoLf Loonie, Wolfspirit Magic and Zi Ree.
   31.64                  </text>
   31.65 @@ -149,7 +149,7 @@
   31.66                   left="5"
   31.67                   name="fs_contrib_intro"
   31.68                   top_pad="8"
   31.69 -                 width="420"
   31.70 +                 width="450"
   31.71                   wrap="true">
   31.72  Additional code generously contributed to Firestorm by:
   31.73                  </text>
   31.74 @@ -163,7 +163,7 @@
   31.75                   max_length="65536"
   31.76                   name="fs_contrib_names"
   31.77                   top_pad="4"
   31.78 -                 width="420"
   31.79 +                 width="450"
   31.80                   wrap="true">
   31.81  Albatroz Hird, Alexie Birman, Andromeda Rage, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Latif Khalifa, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Paladin Forzane, paperwork, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Thickbrick Sleaford, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
   31.82                  </text>
   31.83 @@ -174,7 +174,7 @@
   31.84                   left="5"
   31.85                   name="fs_support_intro"
   31.86                   top_pad="8"
   31.87 -                 width="420"
   31.88 +                 width="450"
   31.89                   wrap="true">
   31.90  Special thanks to our Firestorm Support Team, wiki editors, educators, and translators:
   31.91                  </text>
   31.92 @@ -188,7 +188,7 @@
   31.93                   max_length="65536"
   31.94                   name="fs_trans_names"
   31.95                   top_pad="4"
   31.96 -                 width="420"
   31.97 +                 width="450"
   31.98                   word_wrap="true">
   31.99  Afrika Burton, Albatroz Hird, Alexru Resident, alison Seesaw, AnaLucia Loon, Angell Airy, Annuccia Resident, Annuccia Vuckovic, Anubi Alter, Atthosz Amiot, Ayelin Ethaniel, Basement Desade, Bia Scribe, Bluezy Bleac, Clarke2, Christy Mansbridge, Chymy India, Cordoba Cluny, Damian Zhaoying, DARK Mirabella, Emmanuella Checchinato, Ed Merryman, Eressea Karsin, Erick Gregan, F0RBIDDEN, Fabry String, Fetish3d, Flandria Connolly, Foksy, Franklyn Watanabe, FreeSpirit Simmering, Gee McAuley, Greatfox Snowpaw, Gweneth Lange, Hatake Kohime, Hiroshi Kumaki, Hope Dreier, Jodi Nikolaidis, JogiTE Clip, Kool Koolhoven, Kosmox Voom, Lachrimo Skytower, Lalwende Leakey, Landaree Levee, Lassie, Lette Ponnier, Lina Pussycat, Lyn Mimistrobell, Marianne Qunhua, Marybeth Oceanlane, Mel Hinarada, Mickeala Praga, Miller Thor, Miro Collas, Mister Acacia, Morgause Whiteberry, Mysty Saunders, Nano Bouscario, narcisssia McMahon, Natem Andel, Nicoletta Schnute, Nisa Maverick, NogarDrevlis Lectar, Norton Burns, PanteraPolnocy, Peewee Musytari, Pisano Smit, PixelProphet Lane, Pol Xaron, Poledra Behemoth, Programmtest, Rander Teskat, Ricky Munz, Riku Highfield, RINOBIT Footman, Robert0 Siamendes, Roth Grut, Sabah Back, SaHaRa Connor, Selene Gregoire, Selo Jacobus, silvanaf Demina, Sniper Siemans, Spartaco Zemenis, Spino Forcella, Srilania Svoboda, Sunset Faulkes, Tanja Levenque, TankMaster Finesmith, Tarlyn Dagger, Thea Brianna, Toy Wylie, Whirly Fizzle, Willow Wilder, Wolfspirit Magic and XLR8RRICK Hudson.
  31.100                  </text>
  31.101 @@ -199,7 +199,7 @@
  31.102                   left="5"
  31.103                   name="fs_art_intro"
  31.104                   top_pad="8"
  31.105 -                 width="420"
  31.106 +                 width="450"
  31.107                   wrap="true">
  31.108  Firestorm includes Starlight, modified for Firestorm.  It is provided by residents for residents, with the intention of providing an alternative, brighter, and hopefully easier to use interface.  For further details see &lt;nolink&gt;https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight&lt;/nolink&gt;.
  31.109  
  31.110 @@ -215,7 +215,7 @@
  31.111                   max_length="65536"
  31.112                   name="fs_artists_names"
  31.113                   top_pad="4"
  31.114 -                 width="420"
  31.115 +                 width="450"
  31.116                   wrap="true">
  31.117  Adam Frisby, Alexandrea Fride, DarkAgent Baphomet, David Rowe, Digital Scribe, Hitomi Tiponi, Hugh Helendale, KirstenLee Cinquetti, Mobius Ryba, Nadin, Naomah Beaumont, Paladin Forzane, psi Merlin, samm florian, Sammie Benoir, Tommi Waydelich and Vincent Nacon.
  31.118                  </text>
  31.119 @@ -237,7 +237,7 @@
  31.120         max_length="65536"
  31.121         name="licenses_editor"
  31.122         top="16"
  31.123 -       width="444"
  31.124 +       width="474"
  31.125         word_wrap="true">
  31.126  3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
  31.127  APR Copyright (C) 2011 The Apache Software Foundation
    32.1 --- a/indra/newview/skins/default/xui/en/floater_web_content.xml	Sat Apr 07 12:06:15 2018 +0200
    32.2 +++ b/indra/newview/skins/default/xui/en/floater_web_content.xml	Thu Apr 12 21:55:46 2018 +0200
    32.3 @@ -180,108 +180,7 @@
    32.4          width="22">
    32.5          <button.commit_callback
    32.6            function="WebContent.TestURL"
    32.7 -          parameter="https://callum-linden.s3.amazonaws.com/ceftests.html"/>
    32.8 -      </button>
    32.9 -
   32.10 -      <button
   32.11 -        image_overlay="Video_URL_Off"
   32.12 -            image_disabled="PushButton_Disabled"
   32.13 -            image_disabled_selected="PushButton_Disabled"
   32.14 -            image_selected="PushButton_Selected"
   32.15 -            image_unselected="PushButton_Off"
   32.16 -        chrome="true"
   32.17 -        tool_tip="MPEG4 Video Test"
   32.18 -        enabled="true"
   32.19 -        follows="left|top"
   32.20 -        height="22"
   32.21 -        layout="topleft"
   32.22 -        left="27"
   32.23 -        name="VLC Plugin Test MPEG4"
   32.24 -        top="0"
   32.25 -        width="22">
   32.26 -        <button.commit_callback
   32.27 -          function="WebContent.TestURL"
   32.28 -          parameter="https://callum-linden.s3.amazonaws.com/sample_media/ss.mp4"/>
   32.29 -      </button>
   32.30 -      <button
   32.31 -        image_overlay="Video_URL_Off"
   32.32 -            image_disabled="PushButton_Disabled"
   32.33 -            image_disabled_selected="PushButton_Disabled"
   32.34 -            image_selected="PushButton_Selected"
   32.35 -            image_unselected="PushButton_Off"
   32.36 -        chrome="true"
   32.37 -        tool_tip="MKV Video Test"
   32.38 -        enabled="true"
   32.39 -        follows="left|top"
   32.40 -        height="22"
   32.41 -        layout="topleft"
   32.42 -        left="51"
   32.43 -        name="VLC Plugin Test MKV"
   32.44 -        top="0"
   32.45 -        width="22">
   32.46 -        <button.commit_callback
   32.47 -          function="WebContent.TestURL"
   32.48 -          parameter="https://callum-linden.s3.amazonaws.com/sample_media/jellyfish.mkv"/>
   32.49 -      </button>
   32.50 -      <button
   32.51 -        image_overlay="Video_URL_Off"
   32.52 -            image_disabled="PushButton_Disabled"
   32.53 -            image_disabled_selected="PushButton_Disabled"
   32.54 -            image_selected="PushButton_Selected"
   32.55 -            image_unselected="PushButton_Off"
   32.56 -        chrome="true"
   32.57 -        tool_tip="WebM Video Test"
   32.58 -        enabled="true"
   32.59 -        follows="left|top"
   32.60 -        height="22"
   32.61 -        layout="topleft"
   32.62 -        left="75"
   32.63 -        name="VLC Plugin Test WebM"
   32.64 -        top="0"
   32.65 -        width="22">
   32.66 -        <button.commit_callback
   32.67 -          function="WebContent.TestURL"
   32.68 -          parameter="https://callum-linden.s3.amazonaws.com/sample_media/jumprope.webm"/>
   32.69 -      </button>
   32.70 -      <button
   32.71 -        image_overlay="Video_URL_Off"
   32.72 -            image_disabled="PushButton_Disabled"
   32.73 -            image_disabled_selected="PushButton_Disabled"
   32.74 -            image_selected="PushButton_Selected"
   32.75 -            image_unselected="PushButton_Off"
   32.76 -        chrome="true"
   32.77 -        tool_tip="MP3 audio Test"
   32.78 -        enabled="true"
   32.79 -        follows="left|top"
   32.80 -        height="22"
   32.81 -        layout="topleft"
   32.82 -        left="99"
   32.83 -        name="VLC Plugin Test MP3"
   32.84 -        top="0"
   32.85 -        width="22">
   32.86 -        <button.commit_callback
   32.87 -          function="WebContent.TestURL"
   32.88 -          parameter="https://callum-linden.s3.amazonaws.com/alegria.mp3"/>
   32.89 -      </button>
   32.90 -      <button
   32.91 -        image_overlay="Video_URL_Off"
   32.92 -            image_disabled="PushButton_Disabled"
   32.93 -            image_disabled_selected="PushButton_Disabled"
   32.94 -            image_selected="PushButton_Selected"
   32.95 -            image_unselected="PushButton_Off"
   32.96 -        chrome="true"
   32.97 -        tool_tip="FLV Test"
   32.98 -        enabled="true"
   32.99 -        follows="left|top"
  32.100 -        height="22"
  32.101 -        layout="topleft"
  32.102 -        left="123"
  32.103 -        name="VLC Plugin Test FLV"
  32.104 -        top="0"
  32.105 -        width="22">
  32.106 -        <button.commit_callback
  32.107 -          function="WebContent.TestURL"
  32.108 -          parameter="https://callum-linden.s3.amazonaws.com/sample_media/vandal.flv"/>
  32.109 +          parameter="https://sl-viewer-media-system.s3.amazonaws.com/index.html"/>
  32.110        </button>
  32.111      </layout_panel>
  32.112      <layout_panel
    33.1 --- a/indra/newview/skins/default/xui/en/menu_login.xml	Sat Apr 07 12:06:15 2018 +0200
    33.2 +++ b/indra/newview/skins/default/xui/en/menu_login.xml	Thu Apr 12 21:55:46 2018 +0200
    33.3 @@ -281,7 +281,7 @@
    33.4         name="Media Browser">
    33.5          <menu_item_call.on_click
    33.6           function="Advanced.WebContentTest"
    33.7 -         parameter="http://google.com"/>
    33.8 +         parameter="http://duckduckgo.com"/>
    33.9        </menu_item_call>
   33.10        <menu
   33.11         create_jump_keys="true"
    34.1 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml	Sat Apr 07 12:06:15 2018 +0200
    34.2 +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml	Thu Apr 12 21:55:46 2018 +0200
    34.3 @@ -4283,7 +4283,7 @@
    34.4             shortcut="control|shift|Z">
    34.5              <menu_item_call.on_click
    34.6               function="Advanced.WebContentTest"
    34.7 -             parameter="http://google.com"/>
    34.8 +             parameter="http://duckduckgo.com"/>
    34.9            </menu_item_call>
   34.10            <menu_item_call
   34.11             label="FB Connect Test"
    35.1 --- a/indra/newview/skins/default/xui/en/notifications.xml	Sat Apr 07 12:06:15 2018 +0200
    35.2 +++ b/indra/newview/skins/default/xui/en/notifications.xml	Thu Apr 12 21:55:46 2018 +0200
    35.3 @@ -1541,13 +1541,6 @@
    35.4  
    35.5    <notification
    35.6   icon="alertmodal.tga"
    35.7 - name="DisableCookiesBreaksSearch"
    35.8 - type="alertmodal">
    35.9 -If you disable cookies, the search function will not work properly, and you will not be able to use it.
   35.10 -  </notification>
   35.11 -
   35.12 -  <notification
   35.13 - icon="alertmodal.tga"
   35.14   name="DisableJavascriptBreaksSearch"
   35.15   type="alertmodal">
   35.16  If you disable Javascript, the search function will not work properly, and you will not be able to use it.
    36.1 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml	Sat Apr 07 12:06:15 2018 +0200
    36.2 +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml	Thu Apr 12 21:55:46 2018 +0200
    36.3 @@ -51,7 +51,7 @@
    36.4      follows="left|top"
    36.5      height="23"
    36.6      label="Clear History"
    36.7 -    tool_tip="Clear login image, last location, teleport history, web, and texture cache"
    36.8 +    tool_tip="Clear login image, last location, teleport history, web and texture cache"
    36.9      layout="topleft"
   36.10      left="15"
   36.11      name="clear_cache"
    37.1 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml	Sat Apr 07 12:06:15 2018 +0200
    37.2 +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml	Thu Apr 12 21:55:46 2018 +0200
    37.3 @@ -215,7 +215,6 @@
    37.4  		 width="400">
    37.5  			Web browser:
    37.6  		</text>
    37.7 -
    37.8  	  <radio_group
    37.9  	   control_name="PreferredBrowserBehavior"
   37.10  	   follows="left|top"
   37.11 @@ -227,7 +226,7 @@
   37.12  	   width="480">
   37.13  		<radio_item
   37.14  		  height="20"
   37.15 -		  label="Use my browser (Chrome, Firefox, IE) for all links"
   37.16 +		  label="Use the default system browser for all links"
   37.17  		  layout="topleft"
   37.18  		  left="0"
   37.19  		  name="new_external"
   37.20 @@ -237,18 +236,18 @@
   37.21  		  width="480" />
   37.22  		<radio_item
   37.23  		  height="20"
   37.24 -		  label="Use built-in browser for Second Life links only"
   37.25 +		  label="Use the built-in browser for Second Life links only"
   37.26  		  layout="topleft"
   37.27  		  left_delta="0"
   37.28  		  name="new_internal"
   37.29  		  value="1"      
   37.30 -		  tool_tip="Use the default system web browser for help, web links, etc. Builtin browser will be used only for LindenLab/SecondLife links."
   37.31 +		  tool_tip="Use the default system web browser for help, web links, etc. The built-in browser will be used only for LindenLab/SecondLife links."
   37.32  		  top_delta="15"
   37.33  		  width="480" />
   37.34  		<radio_item
   37.35  		  top_delta="15"
   37.36  		  height="20"
   37.37 -		  label="Use built-in browser for all links"
   37.38 +		  label="Use the built-in browser for all links"
   37.39  		  layout="topleft"
   37.40  		  left="0"
   37.41  		  name="new_internal_all"
   37.42 @@ -328,23 +327,6 @@
   37.43  		 follows="left|top"
   37.44  		 height="16"
   37.45  		 initial_value="true"
   37.46 -		 control_name="CookiesEnabled"
   37.47 -		 label="Accept cookies"
   37.48 -		 left_delta="0"
   37.49 -		 mouse_opaque="true"
   37.50 -		 name="cookies_enabled"
   37.51 -		 radio_style="false"
   37.52 -		 width="200"
   37.53 -		 top_pad="5">
   37.54 -			<check_box.commit_callback
   37.55 -			 function="Pref.Cookies" />
   37.56 -		</check_box>
   37.57 -
   37.58 -		<check_box
   37.59 -		 enabled="true"
   37.60 -		 follows="left|top"
   37.61 -		 height="16"
   37.62 -		 initial_value="true"
   37.63  		 control_name="BrowserJavascriptEnabled"
   37.64  		 label="Enable Javascript"
   37.65  		 left_delta="0"
    38.1 --- a/indra/newview/skins/default/xui/es/notifications.xml	Sat Apr 07 12:06:15 2018 +0200
    38.2 +++ b/indra/newview/skins/default/xui/es/notifications.xml	Thu Apr 12 21:55:46 2018 +0200
    38.3 @@ -542,9 +542,6 @@
    38.4  	<notification name="CacheWillClear">
    38.5  		La caché se limpiará cuando reinicies [APP_NAME].
    38.6  	</notification>
    38.7 -	<notification name="DisableCookiesBreaksSearch">
    38.8 -		Si desactivas las cookies, la función de búsqueda no funcionará correctamente y no podrás usarla.
    38.9 -	</notification>
   38.10  	<notification name="DisableJavascriptBreaksSearch">
   38.11  		Si desactivas Javascript, la función de búsqueda no funcionará correctamente y no podrás usarla.
   38.12  	</notification>
    39.1 --- a/indra/newview/skins/default/xui/ja/notifications.xml	Sat Apr 07 12:06:15 2018 +0200
    39.2 +++ b/indra/newview/skins/default/xui/ja/notifications.xml	Thu Apr 12 21:55:46 2018 +0200
    39.3 @@ -616,9 +616,6 @@
    39.4  	<notification name="CacheWillClear">
    39.5  		[APP_NAME] を再起動後にキャッシュがクリアされます。
    39.6  	</notification>
    39.7 -	<notification name="DisableCookiesBreaksSearch">
    39.8 -		クッキーを無効にすると、検索機能が正しく働かず、検索を使用できなくなります。
    39.9 -	</notification>
   39.10  	<notification name="DisableJavascriptBreaksSearch">
   39.11  		Javascript を無効にすると、検索機能が正しく働かず、検索を使用できなくなります。
   39.12  	</notification>
    40.1 --- a/indra/newview/skins/default/xui/pl/notifications.xml	Sat Apr 07 12:06:15 2018 +0200
    40.2 +++ b/indra/newview/skins/default/xui/pl/notifications.xml	Thu Apr 12 21:55:46 2018 +0200
    40.3 @@ -510,9 +510,6 @@
    40.4  	<notification name="CacheWillClear">
    40.5  		Bufor danych zostanie wyczyszczony po restarcie aplikacji [APP_NAME].
    40.6  	</notification>
    40.7 -	<notification name="DisableCookiesBreaksSearch">
    40.8 -		Jeśli wyłączysz ciasteczka, to wyszukiwarka przestanie działać.
    40.9 -	</notification>
   40.10  	<notification name="DisableJavascriptBreaksSearch">
   40.11  		Jeśli wyłączysz Javascript, to wyszukiwarka przestanie działać.
   40.12  	</notification>
    41.1 --- a/indra/newview/skins/default/xui/ru/notifications.xml	Sat Apr 07 12:06:15 2018 +0200
    41.2 +++ b/indra/newview/skins/default/xui/ru/notifications.xml	Thu Apr 12 21:55:46 2018 +0200
    41.3 @@ -549,9 +549,6 @@
    41.4  	<notification name="CacheWillClear">
    41.5  		Кэш будет очищен после перезапуска [APP_NAME].
    41.6  	</notification>
    41.7 -	<notification name="DisableCookiesBreaksSearch">
    41.8 -		Если вы отключите Cookies, функции поиска не будут работать должным образом и вы не сможете его использовать.
    41.9 -	</notification>
   41.10  	<notification name="DisableJavascriptBreaksSearch">
   41.11  		Если вы отключите Javascript, функции поиска не будут работать должным образом и вы не сможете его использовать.
   41.12  	</notification>

mercurial