diff options
47 files changed, 753 insertions, 637 deletions
| diff --git a/autobuild.xml b/autobuild.xml index ada8059708..fe4caace0b 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -99,16 +99,6 @@        </map>        <key>boost</key>        <map> -        <key>copyright</key> -        <string>(see individual source files)</string> -        <key>description</key> -        <string>Boost C++ Libraries</string> -        <key>license</key> -        <string>boost 1.0</string> -        <key>license_file</key> -        <string>LICENSES/boost.txt</string> -        <key>name</key> -        <string>boost</string>          <key>platforms</key>          <map>            <key>darwin64</key> @@ -154,8 +144,18 @@              <string>windows64</string>            </map>          </map> +        <key>license</key> +        <string>boost 1.0</string> +        <key>license_file</key> +        <string>LICENSES/boost.txt</string> +        <key>copyright</key> +        <string>(see individual source files)</string>          <key>version</key>          <string>1.86</string> +        <key>name</key> +        <string>boost</string> +        <key>description</key> +        <string>Boost C++ Libraries</string>        </map>        <key>bugsplat</key>        <map> @@ -205,14 +205,6 @@        </map>        <key>colladadom</key>        <map> -        <key>copyright</key> -        <string>Copyright 2006 Sony Computer Entertainment Inc.</string> -        <key>license</key> -        <string>SCEA</string> -        <key>license_file</key> -        <string>LICENSES/collada.txt</string> -        <key>name</key> -        <string>colladadom</string>          <key>platforms</key>          <map>            <key>darwin64</key> @@ -258,8 +250,16 @@              <string>windows64</string>            </map>          </map> +        <key>license</key> +        <string>SCEA</string> +        <key>license_file</key> +        <string>LICENSES/collada.txt</string> +        <key>copyright</key> +        <string>Copyright 2006 Sony Computer Entertainment Inc.</string>          <key>version</key>          <string>2.3.0-r10</string> +        <key>name</key> +        <string>colladadom</string>        </map>        <key>cubemaptoequirectangular</key>        <map> @@ -443,16 +443,6 @@        </map>        <key>dullahan</key>        <map> -        <key>copyright</key> -        <string>Copyright (c) 2017, Linden Research, Inc.</string> -        <key>description</key> -        <string>A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies.</string> -        <key>license</key> -        <string>MPL</string> -        <key>license_file</key> -        <string>LICENSES/LICENSE.txt</string> -        <key>name</key> -        <string>dullahan</string>          <key>platforms</key>          <map>            <key>darwin64</key> @@ -460,11 +450,11 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>7fde76e3f0e62d0e0593b6157f4d740ecef2429d</string> +              <string>d44256458ff0ef4db4c91e8e8cc83e8f98b4f1b8</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://github.com/secondlife/dullahan/releases/download/v1.14.0-r3/dullahan-1.14.0.202408091638_118.4.1_g3dd6078_chromium-118.0.5993.54-darwin64-10322607516.tar.zst</string> +              <string>https://github.com/secondlife/dullahan/releases/download/v1.21.0-CEF_139.0.28/dullahan-1.21.0.202508272158_139.0.28_g55ab8a8_chromium-139.0.7258.139-darwin64-17279703032.tar.zst</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -488,18 +478,28 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>4124c79d8b0e319877ffa4c12581d5c1318b4d93</string> +              <string>9d5af766a87052808e4062978504e9af124fb558</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://github.com/secondlife/dullahan/releases/download/v1.14.0-r3/dullahan-1.14.0.202408091639_118.4.1_g3dd6078_chromium-118.0.5993.54-windows64-10322607516.tar.zst</string> +              <string>https://github.com/secondlife/dullahan/releases/download/v1.21.0-CEF_139.0.28/dullahan-1.21.0.202508272159_139.0.28_g55ab8a8_chromium-139.0.7258.139-windows64-17279703032.tar.zst</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map> +        <key>license</key> +        <string>MPL</string> +        <key>license_file</key> +        <string>LICENSES/LICENSE.txt</string> +        <key>copyright</key> +        <string>Copyright (c) 2017, Linden Research, Inc.</string>          <key>version</key> -        <string>1.14.0.202408091639_118.4.1_g3dd6078_chromium-118.0.5993.54</string> +        <string>1.21.0.202508272158_139.0.28_g55ab8a8_chromium-139.0.7258.139</string> +        <key>name</key> +        <string>dullahan</string> +        <key>description</key> +        <string>A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies.</string>        </map>        <key>emoji_shortcodes</key>        <map> @@ -627,16 +627,6 @@        </map>        <key>freetype</key>        <map> -        <key>copyright</key> -        <string>Copyright 2006, 2007, 2008, 2009, 2010 by David Turner, Robert Wilhelm, and Werner Lemberg.</string> -        <key>description</key> -        <string>Font rendering library</string> -        <key>license</key> -        <string>FreeType</string> -        <key>license_file</key> -        <string>LICENSES/freetype.txt</string> -        <key>name</key> -        <string>freetype</string>          <key>platforms</key>          <map>            <key>darwin64</key> @@ -682,8 +672,18 @@              <string>windows64</string>            </map>          </map> +        <key>license</key> +        <string>FreeType</string> +        <key>license_file</key> +        <string>LICENSES/freetype.txt</string> +        <key>copyright</key> +        <string>Copyright 2006, 2007, 2008, 2009, 2010 by David Turner, Robert Wilhelm, and Werner Lemberg.</string>          <key>version</key>          <string>2.13.3-r3</string> +        <key>name</key> +        <string>freetype</string> +        <key>description</key> +        <string>Font rendering library</string>        </map>        <key>glext</key>        <map> @@ -1383,15 +1383,6 @@        </map>        <key>llca</key>        <map> -        <key>copyright</key> -        <string>Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. -      </string> -        <key>license</key> -        <string>mit</string> -        <key>license_file</key> -        <string>LICENSES/ca-license.txt</string> -        <key>name</key> -        <string>llca</string>          <key>platforms</key>          <map>            <key>common</key> @@ -1409,8 +1400,17 @@              <string>common</string>            </map>          </map> +        <key>license</key> +        <string>mit</string> +        <key>license_file</key> +        <string>LICENSES/ca-license.txt</string> +        <key>copyright</key> +        <string>Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. +      </string>          <key>version</key>          <string>202407221423.0</string> +        <key>name</key> +        <string>llca</string>        </map>        <key>llphysicsextensions_source</key>        <map> @@ -1465,12 +1465,12 @@              <string>windows64</string>            </map>          </map> -        <key>copyright</key> -        <string>Copyright (c) 2010, Linden Research, Inc.</string>          <key>license</key>          <string>internal</string>          <key>license_file</key>          <string>LICENSES/llphysicsextensions.txt</string> +        <key>copyright</key> +        <string>Copyright (c) 2010, Linden Research, Inc.</string>          <key>version</key>          <string>1.0.11137145495</string>          <key>name</key> @@ -2354,14 +2354,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>        </map>        <key>threejs</key>        <map> -        <key>copyright</key> -        <string>Copyright © 2010-2021 three.js authors</string> -        <key>license</key> -        <string>MIT</string> -        <key>license_file</key> -        <string>LICENSES/THREEJS_LICENSE.txt</string> -        <key>name</key> -        <string>threejs</string>          <key>platforms</key>          <map>            <key>common</key> @@ -2379,8 +2371,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <string>common</string>            </map>          </map> +        <key>license</key> +        <string>MIT</string> +        <key>license_file</key> +        <string>LICENSES/THREEJS_LICENSE.txt</string> +        <key>copyright</key> +        <string>Copyright © 2010-2021 three.js authors</string>          <key>version</key>          <string>0.132.2</string> +        <key>name</key> +        <string>threejs</string>        </map>        <key>tinygltf</key>        <map> @@ -2616,14 +2616,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>        </map>        <key>vlc-bin</key>        <map> -        <key>copyright</key> -        <string>Copyright (C) 1998-2016 VLC authors and VideoLAN</string> -        <key>license</key> -        <string>GPL2</string> -        <key>license_file</key> -        <string>LICENSES/vlc.txt</string> -        <key>name</key> -        <string>vlc-bin</string>          <key>platforms</key>          <map>            <key>darwin64</key> @@ -2655,8 +2647,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <string>windows64</string>            </map>          </map> +        <key>license</key> +        <string>GPL2</string> +        <key>license_file</key> +        <string>LICENSES/vlc.txt</string> +        <key>copyright</key> +        <string>Copyright (C) 1998-2016 VLC authors and VideoLAN</string>          <key>version</key>          <string>3.0.21.11968962952</string> +        <key>name</key> +        <string>vlc-bin</string>        </map>        <key>vulkan_gltf</key>        <map> @@ -2854,16 +2854,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>        </map>        <key>tinyexr</key>        <map> -        <key>copyright</key> -        <string>Copyright (c) 2014 - 2021, Syoyo Fujita and many contributors.</string> -        <key>description</key> -        <string>tinyexr import library</string> -        <key>license</key> -        <string>3-clause BSD</string> -        <key>license_file</key> -        <string>LICENSES/tinyexr_license.txt</string> -        <key>name</key> -        <string>tinyexr</string>          <key>platforms</key>          <map>            <key>common</key> @@ -2881,16 +2871,26 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <string>common</string>            </map>          </map> -        <key>source_type</key> -        <string>git</string> +        <key>license</key> +        <string>3-clause BSD</string> +        <key>license_file</key> +        <string>LICENSES/tinyexr_license.txt</string> +        <key>copyright</key> +        <string>Copyright (c) 2014 - 2021, Syoyo Fujita and many contributors.</string> +        <key>version</key> +        <string>1.0.9-5e8947c</string> +        <key>name</key> +        <string>tinyexr</string>          <key>vcs_branch</key>          <string>dependabot/github_actions/secondlife/action-autobuild-4</string>          <key>vcs_revision</key>          <string>4dc4d1d90d82a22843e2adf5130f9ecb5ee5769e</string>          <key>vcs_url</key>          <string>https://github.com/secondlife/3p-tinyexr</string> -        <key>version</key> -        <string>1.0.9-5e8947c</string> +        <key>description</key> +        <string>tinyexr import library</string> +        <key>source_type</key> +        <string>git</string>        </map>        <key>discord_sdk</key>        <map> diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake index 9b77becf29..e27929fa08 100644 --- a/indra/cmake/CEFPlugin.cmake +++ b/indra/cmake/CEFPlugin.cmake @@ -29,7 +29,6 @@ elseif (DARWIN)          ${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.a          ${ARCH_PREBUILT_DIRS_RELEASE}/libdullahan.a          ${APPKIT_LIBRARY} -        "-F ${CEF_LIBRARY}"         )  elseif (LINUX) diff --git a/indra/cmake/PluginAPI.cmake b/indra/cmake/PluginAPI.cmake index 114415e514..a2bf13db2c 100644 --- a/indra/cmake/PluginAPI.cmake +++ b/indra/cmake/PluginAPI.cmake @@ -1,5 +1,7 @@  # -*- cmake -*- +include(OpenGL) +  add_library( ll::pluginlibraries INTERFACE IMPORTED )  if (WINDOWS) @@ -13,4 +15,6 @@ if (WINDOWS)        )  endif (WINDOWS) +target_link_libraries( ll::pluginlibraries INTERFACE OpenGL::GL) +target_include_directories( ll::pluginlibraries INTERFACE ${CMAKE_SOURCE_DIR}/llimage ${CMAKE_SOURCE_DIR}/llrender) diff --git a/indra/llfilesystem/lldir_mac.cpp b/indra/llfilesystem/lldir_mac.cpp index b9be75c528..2db1b6ec5d 100644 --- a/indra/llfilesystem/lldir_mac.cpp +++ b/indra/llfilesystem/lldir_mac.cpp @@ -149,7 +149,7 @@ LLDir_Mac::LLDir_Mac()          mWorkingDir = getCurPath(); -        mLLPluginDir = mAppRODataDir + mDirDelimiter + "llplugin"; +        mLLPluginDir = mAppRODataDir + mDirDelimiter + "SLPlugin.app" + mDirDelimiter + "Contents" + mDirDelimiter + "Frameworks";      }  } diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt index 005426acde..e008a4093e 100644 --- a/indra/llplugin/CMakeLists.txt +++ b/indra/llplugin/CMakeLists.txt @@ -35,6 +35,6 @@ list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES})  add_library (llplugin ${llplugin_SOURCE_FILES})  target_include_directories( llplugin  INTERFACE   ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries( llplugin llcommon llmath llrender llmessage ) +target_link_libraries( llplugin llcommon llmath llmessage llxml )  add_subdirectory(slplugin) diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 8a356da93a..77a4b08af5 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -132,9 +132,13 @@ void LLPluginClassMedia::reset()      mLastMouseY = 0;      mStatus = LLPluginClassMediaOwner::MEDIA_NONE;      mSleepTime = 1.0f / 100.0f; +    mCanUndo = false; +    mCanRedo = false;      mCanCut = false;      mCanCopy = false;      mCanPaste = false; +    mCanDoDelete = false; +    mCanSelectAll = false;      mMediaName.clear();      mMediaDescription.clear();      mBackgroundColor = LLColor4(1.0f, 1.0f, 1.0f, 1.0f); @@ -907,6 +911,18 @@ void LLPluginClassMedia::sendAuthResponse(bool ok, const std::string &username,      sendMessage(message);  } +void LLPluginClassMedia::undo() +{ +    LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_undo"); +    sendMessage(message); +} + +void LLPluginClassMedia::redo() +{ +    LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_redo"); +    sendMessage(message); +} +  void LLPluginClassMedia::cut()  {      LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_cut"); @@ -925,6 +941,24 @@ void LLPluginClassMedia::paste()      sendMessage(message);  } +void LLPluginClassMedia::doDelete() +{ +    LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_delete"); +    sendMessage(message); +} + +void LLPluginClassMedia::selectAll() +{ +    LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_select_all"); +    sendMessage(message); +} + +void LLPluginClassMedia::showPageSource() +{ +    LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_show_source"); +    sendMessage(message); +} +  void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path_cache,                                           const std::string &username,                                           const std::string &user_data_path_cef_log) @@ -1178,6 +1212,14 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)          }          else if(message_name == "edit_state")          { +            if(message.hasValue("undo")) +            { +                mCanUndo = message.getValueBoolean("undo"); +            } +            if(message.hasValue("redo")) +            { +                mCanRedo = message.getValueBoolean("redo"); +            }              if(message.hasValue("cut"))              {                  mCanCut = message.getValueBoolean("cut"); @@ -1190,6 +1232,14 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)              {                  mCanPaste = message.getValueBoolean("paste");              } +            if (message.hasValue("delete")) +            { +                mCanDoDelete = message.getValueBoolean("delete"); +            } +            if (message.hasValue("select_all")) +            { +                mCanSelectAll = message.getValueBoolean("select_all"); +            }          }          else if(message_name == "name_text")          { diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index d74b790d8f..71522bcd7d 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -29,7 +29,6 @@  #ifndef LL_LLPLUGINCLASSMEDIA_H  #define LL_LLPLUGINCLASSMEDIA_H -#include "llgltypes.h"  #include "llpluginprocessparent.h"  #include "llrect.h"  #include "llpluginclassmediaowner.h" @@ -201,6 +200,12 @@ public:      LLPluginClassMediaOwner::EMediaStatus getStatus() const { return mStatus; } +    void    undo(); +    bool    canUndo() const { return mCanUndo; }; + +    void    redo(); +    bool    canRedo() const { return mCanRedo; }; +      void    cut();      bool    canCut() const { return mCanCut; }; @@ -210,6 +215,14 @@ public:      void    paste();      bool    canPaste() const { return mCanPaste; }; +    void    doDelete(); +    bool    canDoDelete() const { return mCanDoDelete; }; + +    void    selectAll(); +    bool    canSelectAll() const { return mCanSelectAll; }; + +    void    showPageSource(); +      // These can be called before init(), and they will be queued and sent before the media init message.      void    setUserDataPath(const std::string &user_data_path_cache, const std::string &username, const std::string &user_data_path_cef_log);      void    setLanguageCode(const std::string &language_code); @@ -351,9 +364,9 @@ protected:      bool        mTextureParamsReceived;     // the mRequestedTexture* fields are only valid when this is true      S32         mRequestedTextureDepth; -    LLGLenum    mRequestedTextureInternalFormat; -    LLGLenum    mRequestedTextureFormat; -    LLGLenum    mRequestedTextureType; +    U32         mRequestedTextureInternalFormat; +    U32         mRequestedTextureFormat; +    U32         mRequestedTextureType;      bool        mRequestedTextureSwapBytes;      bool        mRequestedTextureCoordsOpenGL; @@ -419,9 +432,13 @@ protected:      F64             mSleepTime; +    bool            mCanUndo; +    bool            mCanRedo;      bool            mCanCut;      bool            mCanCopy;      bool            mCanPaste; +    bool            mCanDoDelete; +    bool            mCanSelectAll;      std::string     mMediaName;      std::string     mMediaDescription; diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt index dbd888a1d2..dc2d82017d 100644 --- a/indra/media_plugins/cef/CMakeLists.txt +++ b/indra/media_plugins/cef/CMakeLists.txt @@ -69,16 +69,8 @@ if (DARWIN)      PROPERTIES      PREFIX ""      BUILD_WITH_INSTALL_RPATH 1 -    INSTALL_NAME_DIR "@executable_path" +    INSTALL_RPATH "@executable_path/../Frameworks"      LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"    ) -  add_custom_command(TARGET media_plugin_cef -    POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "@executable_path/Chromium Embedded Framework" -        "@executable_path/../../../../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" -        "$<TARGET_FILE:media_plugin_cef>" -    VERBATIM -    COMMENT "Fixing path to CEF Framework" -  ) -  endif (DARWIN) diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index 64fc7e452b..caf804f915 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -38,6 +38,13 @@  #include "volume_catcher.h"  #include "media_plugin_base.h" +// _getpid()/getpid() +#if LL_WINDOWS +#include <process.h> +#else +#include <unistd.h> +#endif +  #include "dullahan.h"  //////////////////////////////////////////////////////////////////////////////// @@ -64,7 +71,7 @@ private:      void onLoadStartCallback();      void onRequestExitCallback();      void onLoadEndCallback(int httpStatusCode, std::string url); -    void onLoadError(int status, const std::string error_text); +    void onLoadError(int status, const std::string error_text, const std::string error_url);      void onAddressChangeCallback(std::string url);      void onOpenPopupCallback(std::string url, std::string target);      bool onHTTPAuthCallback(const std::string host, const std::string realm, std::string& username, std::string& password); @@ -99,12 +106,14 @@ private:      std::string mAuthUsername;      std::string mAuthPassword;      bool mAuthOK; +    bool mCanUndo; +    bool mCanRedo;      bool mCanCut;      bool mCanCopy;      bool mCanPaste; +    bool mCanDelete; +    bool mCanSelectAll;      std::string mRootCachePath; -    std::string mCachePath; -    std::string mContextCachePath;      std::string mCefLogFile;      bool mCefLogVerbose;      std::vector<std::string> mPickedFiles; @@ -139,10 +148,13 @@ MediaPluginBase(host_send_func, host_user_data)      mAuthUsername = "";      mAuthPassword = "";      mAuthOK = false; +    mCanUndo = false; +    mCanRedo = false;      mCanCut = false;      mCanCopy = false;      mCanPaste = false; -    mCachePath = ""; +    mCanDelete = false; +    mCanSelectAll = false;      mCefLogFile = "";      mCefLogVerbose = false;      mPickedFiles.clear(); @@ -242,15 +254,17 @@ void MediaPluginCEF::onLoadStartCallback()  /////////////////////////////////////////////////////////////////////////////////  // -void MediaPluginCEF::onLoadError(int status, const std::string error_text) +void MediaPluginCEF::onLoadError(int status, const std::string error_text, const std::string error_url)  {      std::stringstream msg; -    msg << "<b>Loading error!</b>"; +    msg << "<b>Loading error</b>"; +    msg << "<p>"; +    msg << "Error message: " << error_text;      msg << "<p>"; -    msg << "Message: " << error_text; -    msg << "<br>"; -    msg << "Code: " << status; +    msg << "Error URL: <tt>" << error_url << "</tt>"; +    msg << "<p>"; +    msg << "Error code: " << status;      mCEFLib->showBrowserMessage(msg.str());  } @@ -607,7 +621,12 @@ void MediaPluginCEF::receiveMessage(const char* message_string)                  mCEFLib->setOnTooltipCallback(std::bind(&MediaPluginCEF::onTooltipCallback, this, std::placeholders::_1));                  mCEFLib->setOnLoadStartCallback(std::bind(&MediaPluginCEF::onLoadStartCallback, this));                  mCEFLib->setOnLoadEndCallback(std::bind(&MediaPluginCEF::onLoadEndCallback, this, std::placeholders::_1, std::placeholders::_2)); -                mCEFLib->setOnLoadErrorCallback(std::bind(&MediaPluginCEF::onLoadError, this, std::placeholders::_1, std::placeholders::_2)); + +                // CEF 139 seems to have introduced a loading failure at the login page (only?) I haven't seen it on +                // any other page and it only happens about 1 in 8 times. Without this handler for the error page +                // (red box, error message/code/url) the page load recovers after display a brief built in error. +                // Not ideal but better than stopping altgoether. Will restore this once I discover the error. +                //mCEFLib->setOnLoadErrorCallback(std::bind(&MediaPluginCEF::onLoadError, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));                  mCEFLib->setOnAddressChangeCallback(std::bind(&MediaPluginCEF::onAddressChangeCallback, this, std::placeholders::_1));                  mCEFLib->setOnOpenPopupCallback(std::bind(&MediaPluginCEF::onOpenPopupCallback, this, std::placeholders::_1, std::placeholders::_2));                  mCEFLib->setOnHTTPAuthCallback(std::bind(&MediaPluginCEF::onHTTPAuthCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); @@ -635,10 +654,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)                  // and set it to white                  settings.background_color = 0xffffffff; // white -                settings.cache_enabled = true;                  settings.root_cache_path = mRootCachePath; -                settings.cache_path = mCachePath; -                settings.context_cache_path = mContextCachePath;                  settings.cookies_enabled = mCookiesEnabled;                  // configure proxy argument if enabled and valid @@ -729,23 +745,32 @@ void MediaPluginCEF::receiveMessage(const char* message_string)                  std::string user_data_path_cache = message_in.getValue("cache_path");                  std::string subfolder = message_in.getValue("username"); -                mRootCachePath = user_data_path_cache + "cef_cache"; -                if (!subfolder.empty()) -                { -                    std::string delim; +                // media plugin doesn't have access to gDirUtilp +                std::string path_separator;  #if LL_WINDOWS -                    // media plugin doesn't have access to gDirUtilp -                    delim = "\\"; +                path_separator = "\\";  #else -                    delim = "/"; +                path_separator = "/";  #endif -                    mCachePath = mRootCachePath + delim + subfolder; -                } -                else -                { -                    mCachePath = mRootCachePath; -                } -                mContextCachePath = ""; // disabled by "" + +                mRootCachePath = user_data_path_cache + "cef_cache"; + +                // Issue #4498 Introduce an additional sub-folder underneath the main cache +                // folder so that each CEF media instance gets its own (as per the CEF API +                // official position). These folders will be removed at startup by Viewer code +                // so that their non-trivial size does not exhaust available disk space. This +                // begs the question - why turn on the cache at all? There are 2 reasons - firstly +                // some of the instances will benefit from per Viewer session caching and will +                // use the injected SL cookie and secondly, it's not clear how having no cache +                // interacts with the multiple simultaneous paradigm we use. +                mRootCachePath += path_separator; +# if LL_WINDOWS +                mRootCachePath += std::to_string(_getpid()); +# else +                mRootCachePath += std::to_string(getpid()); +# endif + +                  mCefLogFile = message_in.getValue("cef_log_file");                  mCefLogVerbose = message_in.getValueBoolean("cef_verbose_log");              } @@ -923,6 +948,14 @@ void MediaPluginCEF::receiveMessage(const char* message_string)              {                  authResponse(message_in);              } +            if (message_name == "edit_undo") +            { +                mCEFLib->editUndo(); +            } +            if (message_name == "edit_redo") +            { +                mCEFLib->editRedo(); +            }              if (message_name == "edit_cut")              {                  mCEFLib->editCut(); @@ -935,6 +968,18 @@ void MediaPluginCEF::receiveMessage(const char* message_string)              {                  mCEFLib->editPaste();              } +            if (message_name == "edit_delete") +            { +                mCEFLib->editDelete(); +            } +            if (message_name == "edit_select_all") +            { +                mCEFLib->editSelectAll(); +            } +            if (message_name == "edit_show_source") +            { +                mCEFLib->viewSource(); +            }          }          else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER)          { @@ -1086,14 +1131,31 @@ void MediaPluginCEF::unicodeInput(std::string event, LLSD native_key_data = LLSD  //  void MediaPluginCEF::checkEditState()  { +    bool can_undo = mCEFLib->editCanUndo(); +    bool can_redo = mCEFLib->editCanRedo();      bool can_cut = mCEFLib->editCanCut();      bool can_copy = mCEFLib->editCanCopy();      bool can_paste = mCEFLib->editCanPaste(); +    bool can_delete = mCEFLib->editCanDelete(); +    bool can_select_all = mCEFLib->editCanSelectAll(); -    if ((can_cut != mCanCut) || (can_copy != mCanCopy) || (can_paste != mCanPaste)) +    if ((can_undo != mCanUndo) || (can_redo != mCanRedo) || (can_cut != mCanCut) || (can_copy != mCanCopy) +        || (can_paste != mCanPaste) || (can_delete != mCanDelete) || (can_select_all != mCanSelectAll))      {          LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_state"); +        if (can_undo != mCanUndo) +        { +            mCanUndo = can_undo; +            message.setValueBoolean("undo", can_undo); +        } + +        if (can_redo != mCanRedo) +        { +            mCanRedo = can_redo; +            message.setValueBoolean("redo", can_redo); +        } +          if (can_cut != mCanCut)          {              mCanCut = can_cut; @@ -1112,6 +1174,18 @@ void MediaPluginCEF::checkEditState()              message.setValueBoolean("paste", can_paste);          } +        if (can_delete != mCanDelete) +        { +            mCanDelete = can_delete; +            message.setValueBoolean("delete", can_delete); +        } + +        if (can_select_all != mCanSelectAll) +        { +            mCanSelectAll = can_select_all; +            message.setValueBoolean("select_all", can_select_all); +        } +          sendMessage(message);      }  } diff --git a/indra/media_plugins/example/CMakeLists.txt b/indra/media_plugins/example/CMakeLists.txt index 71343d5f85..be8ffe5a40 100644 --- a/indra/media_plugins/example/CMakeLists.txt +++ b/indra/media_plugins/example/CMakeLists.txt @@ -39,7 +39,7 @@ if (DARWIN)      PROPERTIES      PREFIX ""      BUILD_WITH_INSTALL_RPATH 1 -    INSTALL_NAME_DIR "@executable_path" +    INSTALL_RPATH "@executable_path/../Frameworks"      LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"    ) diff --git a/indra/media_plugins/libvlc/CMakeLists.txt b/indra/media_plugins/libvlc/CMakeLists.txt index 863b4617e9..d2b2a61648 100644 --- a/indra/media_plugins/libvlc/CMakeLists.txt +++ b/indra/media_plugins/libvlc/CMakeLists.txt @@ -43,7 +43,7 @@ if (DARWIN)      PROPERTIES      PREFIX ""      BUILD_WITH_INSTALL_RPATH 1 -    INSTALL_NAME_DIR "@executable_path" +    INSTALL_RPATH "@executable_path/../Frameworks"      LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"    ) diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp index 4240613a0c..ad0ecaf4ab 100644 --- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp +++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp @@ -174,7 +174,7 @@ void MediaPluginLibVLC::initVLC()      };  #if LL_DARWIN -    setenv("VLC_PLUGIN_PATH", ".", 1); +    setenv("VLC_PLUGIN_PATH", "./plugins", 1);  #endif      int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 117473554e..570c74f1cf 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -393,6 +393,7 @@ set(viewer_SOURCE_FILES      llmaniprotate.cpp      llmanipscale.cpp      llmaniptranslate.cpp +    llfloatermarketplace.cpp      llmarketplacefunctions.cpp      llmarketplacenotifications.cpp      llmaterialeditor.cpp @@ -930,6 +931,7 @@ set(viewer_HEADER_FILES      llfloaterlinkreplace.h      llfloaterloadprefpreset.h      llfloatermap.h +    llfloatermarketplace.h      llfloatermarketplacelistings.h      llfloatermediasettings.h      llfloatermemleak.h diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 88f6005dce..9eb0d3fade 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4425,6 +4425,9 @@ bool LLAppViewer::initCache()      const U32 CACHE_NUMBER_OF_REGIONS_FOR_OBJECTS = 128;      LLVOCache::getInstance()->initCache(LL_PATH_CACHE, CACHE_NUMBER_OF_REGIONS_FOR_OBJECTS, getObjectCacheVersion()); +    // Remove old, stale CEF cache folders +    purgeCefStaleCaches(); +      return true;  } @@ -4449,18 +4452,27 @@ void LLAppViewer::loadKeyBindings()      LLUrlRegistry::instance().setKeybindingHandler(&gViewerInput);  } +// As per GHI #4498, remove old, stale CEF cache folders from previous sessions +void LLAppViewer::purgeCefStaleCaches() +{ +    // TODO: we really shouldn't use a hard coded name for the cache folder here... +    const std::string browser_parent_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache"); +    if (LLFile::isdir(browser_parent_cache)) +    { +        // This is a sledgehammer approach - nukes the cef_cache dir entirely +        // which is then recreated the first time a CEF instance creates an +        // individual cache folder. If we ever decide to retain some folders +        // e.g. Search UI cache - then we will need a more granular approach. +        gDirUtilp->deleteDirAndContents(browser_parent_cache); +    } +} +  void LLAppViewer::purgeCache()  {      LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL;      LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE);      LLVOCache::getInstance()->removeCache(LL_PATH_CACHE);      LLViewerShaderMgr::instance()->clearShaderCache(); -    std::string browser_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache"); -    if (LLFile::isdir(browser_cache)) -    { -        // cef does not support clear_cache and clear_cookies, so clear what we can manually. -        gDirUtilp->deleteDirAndContents(browser_cache); -    }      gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), "*");  } @@ -4529,6 +4541,7 @@ void LLAppViewer::forceDisconnect(const std::string& mesg)      }      else      { +        sendSimpleLogoutRequest();          args["MESSAGE"] = big_reason;          LLNotificationsUtil::add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect );      } @@ -5309,6 +5322,27 @@ void LLAppViewer::sendLogoutRequest()      }  } +void LLAppViewer::sendSimpleLogoutRequest() +{ +    if (!mLogoutRequestSent && gMessageSystem) +    { +        gLogoutInProgress = true; + +        LLMessageSystem* msg = gMessageSystem; +        msg->newMessageFast(_PREHASH_LogoutRequest); +        msg->nextBlockFast(_PREHASH_AgentData); +        msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +        msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +        gAgent.sendReliableMessage(); + +        LL_INFOS("Agent") << "Logging out as agent: " << gAgent.getID() << " Session: " << gAgent.getSessionID() << LL_ENDL; + +        gLogoutTimer.reset(); +        gLogoutMaxTime = LOGOUT_REQUEST_TIME; +        mLogoutRequestSent = true; +    } +} +  void LLAppViewer::updateNameLookupUrl(const LLViewerRegion * regionp)  {      if (!regionp || !regionp->capabilitiesReceived()) diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 132d7bfe25..3afde6b9f5 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -220,6 +220,7 @@ public:      void initGeneralThread();      void purgeUserDataOnExit() { mPurgeUserDataOnExit = true; } +    void purgeCefStaleCaches();  // Remove old, stale CEF cache folders      void purgeCache(); // Clear the local cache.      void purgeCacheImmediate(); //clear local cache immediately.      S32  updateTextureThreads(F32 max_time); @@ -310,6 +311,10 @@ private:      void sendLogoutRequest();      void disconnectViewer(); +    // Does not create a marker file. For lost network case, +    // to at least attempt to remove the ghost from the world. +    void sendSimpleLogoutRequest(); +      // *FIX: the app viewer class should be some sort of singleton, no?      // Perhaps its child class is the singleton and this should be an abstract base.      static LLAppViewer* sInstance; diff --git a/indra/newview/llfloatermarketplace.cpp b/indra/newview/llfloatermarketplace.cpp new file mode 100644 index 0000000000..889daf84ab --- /dev/null +++ b/indra/newview/llfloatermarketplace.cpp @@ -0,0 +1,47 @@ +/** + * @file llfloatermarketplace.cpp + * @brief floater for the Marketplace web site + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloatermarketplace.h" +#include "lluictrlfactory.h" + +LLFloaterMarketplace::LLFloaterMarketplace(const LLSD& key) +    :   LLFloater(key) +{ +} + +LLFloaterMarketplace::~LLFloaterMarketplace() +{ +} + +bool LLFloaterMarketplace::postBuild() +{ +    enableResizeCtrls(true, true, false); +    return true; +} + + diff --git a/indra/newview/llfloatermarketplace.h b/indra/newview/llfloatermarketplace.h new file mode 100644 index 0000000000..2ae4d0d64a --- /dev/null +++ b/indra/newview/llfloatermarketplace.h @@ -0,0 +1,40 @@ +/** + * @file llfloatermarketplace.h + * @brief floater for the Marketplace web site + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#pragma once + +#include "llfloater.h" + +class LLFloaterMarketplace: +    public LLFloater +{ +    friend class LLFloaterReg; +private: +    LLFloaterMarketplace(const LLSD& key); +    ~LLFloaterMarketplace(); +    bool postBuild() override; +}; + diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index d3c8bf3451..9762154a26 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -1,11 +1,10 @@  /**   * @file llfloatersearch.cpp - * @author Martin Reddy - * @brief Search floater - uses an embedded web browser control + * @brief Floater for Search (update 2025, preload)   * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2011, Linden Research, Inc.   *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -27,68 +26,34 @@  #include "llviewerprecompiledheaders.h" +#include "llfloatersearch.h" + +#include "llagent.h"  #include "llcommandhandler.h"  #include "llfloaterreg.h" -#include "llfloatersearch.h" -#include "llhttpconstants.h"  #include "llmediactrl.h" -#include "llnotificationsutil.h" -#include "lllogininstance.h" -#include "lluri.h" -#include "llagent.h" -#include "llui.h" +#include "lluictrlfactory.h"  #include "llviewercontrol.h"  #include "llweb.h"  // support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps -class LLSearchHandler : public LLCommandHandler -{ -public: -    // requires trusted browser to trigger -    LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { } -    bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) -    { -        const size_t parts = tokens.size(); - -        // get the (optional) category for the search -        std::string collection; -        if (parts > 0) -        { -            collection = tokens[0].asString(); +class LLSearchHandler : public LLCommandHandler { +    public: +        // requires trusted browser to trigger +        LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { } +        bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) { +            const size_t parts = tokens.size(); + +            // open the search floater and perform the requested search +            LLFloaterReg::showInstance("search", tokens); +            return true;          } - -        // get the (optional) search string -        std::string search_text; -        if (parts > 1) -        { -            search_text = tokens[1].asString(); -        } - -        // create the LLSD arguments for the search floater -        LLFloaterSearch::Params p; -        p.search.collection = collection; -        p.search.query = LLURI::unescape(search_text); - -        // open the search floater and perform the requested search -        LLFloaterReg::showInstance("search", p); -        return true; -    }  };  LLSearchHandler gSearchHandler; -LLFloaterSearch::SearchQuery::SearchQuery() -:   category("category", ""), -    collection("collection", ""), -    query("query") -{} - -LLFloaterSearch::LLFloaterSearch(const Params& key) : -    LLFloaterWebContent(key), -    mSearchGodLevel(0) +LLFloaterSearch::LLFloaterSearch(const LLSD& key) +    : LLFloater(key)  { -    // declare a map that transforms a category name into -    // the URL suffix that is used to search that category -      mSearchType.insert("standard");      mSearchType.insert("land");      mSearchType.insert("classified"); @@ -100,76 +65,61 @@ LLFloaterSearch::LLFloaterSearch(const Params& key) :      mCollectionType.insert("people");  } -bool LLFloaterSearch::postBuild() +LLFloaterSearch::~LLFloaterSearch()  { -    LLFloaterWebContent::postBuild(); -    mWebBrowser->addObserver(this); - -    return true;  } -void LLFloaterSearch::onOpen(const LLSD& key) +void LLFloaterSearch::onOpen(const LLSD& tokens)  { -    Params p(key); -    p.trusted_content = true; -    p.allow_address_entry = false; - -    LLFloaterWebContent::onOpen(p); -    mWebBrowser->setFocus(true); -    search(p.search); +    initiateSearch(tokens);  } -void LLFloaterSearch::onClose(bool app_quitting) +void LLFloaterSearch::initiateSearch(const LLSD& tokens)  { -    LLFloaterWebContent::onClose(app_quitting); -    // tear down the web view so we don't show the previous search -    // result when the floater is opened next time -    destroy(); -} +    std::string url = gSavedSettings.getString("SearchURL"); -void LLFloaterSearch::godLevelChanged(U8 godlevel) -{ -    // search results can change based upon god level - if the user -    // changes god level, then give them a warning (we don't refresh -    // the search as this might undo any page navigation or -    // AJAX-driven changes since the last search). +    LLSD subs; -    //FIXME: set status bar text +    // Setting this substitution here results in a full set of collections being +    // substituted into the final URL using the logic from the original search. +    subs["TYPE"] = "standard"; -    //getChildView("refresh_search")->setVisible( (godlevel != mSearchGodLevel)); -} +    const size_t parts = tokens.size(); -void LLFloaterSearch::search(const SearchQuery &p) -{ -    if (! mWebBrowser || !p.validateBlock()) +    // get the (optional) category for the search +    std::string collection; +    if (parts > 0)      { -        return; +        collection = tokens[0].asString();      } -    // reset the god level warning as we're sending the latest state -    getChildView("refresh_search")->setVisible(false); -    mSearchGodLevel = gAgent.getGodLevel(); +    // get the (optional) search string +    std::string search_text; +    if (parts > 1) +    { +        search_text = tokens[1].asString(); +    } -    // work out the subdir to use based on the requested category -    LLSD subs; -    if (mSearchType.find(p.category) != mSearchType.end()) +    // TODO: where does category get set? I cannot find a reference to +    // it in internal docs - might be conflated with values in mSearchType +    std::string category; +    if (mSearchType.find(category) != mSearchType.end())      { -        subs["TYPE"] = p.category; +        subs["TYPE"] = category;      }      else      {          subs["TYPE"] = "standard";      } -    // add the search query string -    subs["QUERY"] = LLURI::escape(p.query); +    subs["QUERY"] = LLURI::escape(search_text);      subs["COLLECTION"] = "";      if (subs["TYPE"] == "standard")      { -        if (mCollectionType.find(p.collection) != mCollectionType.end()) +        if (mCollectionType.find(collection) != mCollectionType.end())          { -            subs["COLLECTION"] = "&collection_chosen=" + std::string(p.collection); +            subs["COLLECTION"] = "&collection_chosen=" + std::string(collection);          }          else          { @@ -182,30 +132,41 @@ void LLFloaterSearch::search(const SearchQuery &p)          }      } -    // add the user's preferred maturity (can be changed via prefs) -    std::string maturity; +    // Default to PG +    std::string maturity = "g";      if (gAgent.prefersAdult())      { -        maturity = "gma";  // PG,Mature,Adult +        // PG,Mature,Adult +        maturity = "gma";      }      else if (gAgent.prefersMature())      { -        maturity = "gm";  // PG,Mature -    } -    else -    { -        maturity = "g";  // PG +        // PG,Mature +        maturity = "gm";      }      subs["MATURITY"] = maturity; -    // add the user's god status +    // God status      subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0"; -    // get the search URL and expand all of the substitutions -    // (also adds things like [LANGUAGE], [VERSION], [OS], etc.) -    std::string url = gSavedSettings.getString("SearchURL"); +    // This call expands a set of generic substitutions like language, viewer version +    // etc. and then also does the same with the list of subs passed in.      url = LLWeb::expandURLSubstitutions(url, subs); -    // and load the URL in the web view -    mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); +    // Naviation to the calculated URL - we know it's HTML so we can +    // tell the media system not to bother with the MIME type check. +    LLMediaCtrl* search_browser = findChild<LLMediaCtrl>("search_contents"); +    search_browser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); +} + +bool LLFloaterSearch::postBuild() +{ +    enableResizeCtrls(true, true, false); + +    // This call is actioned by the preload code in llViewerWindow +    // that creates the search floater during the login process +    // using a generic search with no query +    initiateSearch(LLSD()); + +    return true;  } diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h index beaac2ad2f..e8a2be4797 100644 --- a/indra/newview/llfloatersearch.h +++ b/indra/newview/llfloatersearch.h @@ -1,11 +1,10 @@  /**   * @file llfloatersearch.h - * @author Martin Reddy - * @brief Search floater - uses an embedded web browser control + * @brief Floater for Search (update 2025, preload)   * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2011, Linden Research, Inc.   *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -25,70 +24,23 @@   * $/LicenseInfo$   */ -#ifndef LL_LLFLOATERSEARCH_H -#define LL_LLFLOATERSEARCH_H +#pragma once -#include "llfloaterwebcontent.h" -#include "llviewermediaobserver.h" +#include "llfloater.h" -#include <string> +class LLFloaterSearch: +    public LLFloater { +        friend class LLFloaterReg; -class LLMediaCtrl; +    public: +        void onOpen(const LLSD& key) override; -/// -/// The search floater allows users to perform all search operations. -/// All search functionality is now implemented via web services and -/// so this floater simply embeds a web view and displays the search -/// web page. The browser control is explicitly marked as "trusted" -/// so that the user can click on teleport links in search results. -/// -class LLFloaterSearch : -    public LLFloaterWebContent -{ -public: -    struct SearchQuery : public LLInitParam::Block<SearchQuery> -    { -        Optional<std::string> category; -        Optional<std::string> collection; -        Optional<std::string> query; +    private: +        LLFloaterSearch(const LLSD& key); +        ~LLFloaterSearch(); +        void initiateSearch(const LLSD& tokens); +        bool postBuild() override; -        SearchQuery(); -    }; - -    struct _Params : public LLInitParam::Block<_Params, LLFloaterWebContent::Params> -    { -        Optional<SearchQuery> search; -    }; - -    typedef LLSDParamAdapter<_Params> Params; - -    LLFloaterSearch(const Params& key); - -    /// show the search floater with a new search -    /// see search() for details on the key parameter. -    /*virtual*/ void onOpen(const LLSD& key); - -    /*virtual*/ void onClose(bool app_quitting); - -    /// perform a search with the specific search term. -    /// The key should be a map that can contain the following keys: -    ///  - "id": specifies the text phrase to search for -    ///  - "category": one of "all" (default), "people", "places", -    ///    "events", "groups", "wiki", "destinations", "classifieds" -    void search(const SearchQuery &query); - -    /// changing godmode can affect the search results that are -    /// returned by the search website - use this method to tell the -    /// search floater that the user has changed god level. -    void godLevelChanged(U8 godlevel); - -private: -    /*virtual*/ bool postBuild(); - -    std::set<std::string> mSearchType; -    std::set<std::string> mCollectionType; -    U8          mSearchGodLevel; +        std::set<std::string> mSearchType; +        std::set<std::string> mCollectionType;  }; - -#endif  // LL_LLFLOATERSEARCH_H - diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 202008f7f9..c7b60b2fd5 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -347,6 +347,7 @@ bool LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )      {          LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar;          registar.add("Open.WebInspector", boost::bind(&LLMediaCtrl::onOpenWebInspector, this)); +        registar.add("Open.ShowSource", boost::bind(&LLMediaCtrl::onShowSource, this));          // stinson 05/05/2014 : use this as the parent of the context menu if the static menu          // container has yet to be created @@ -364,8 +365,9 @@ bool LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )      {          // hide/show debugging options          bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging"); +        menu->setItemVisible("debug_separator", media_plugin_debugging_enabled);          menu->setItemVisible("open_webinspector", media_plugin_debugging_enabled ); -        menu->setItemVisible("debug_separator", media_plugin_debugging_enabled ); +        menu->setItemVisible("show_page_source", media_plugin_debugging_enabled);          menu->show(x, y);          LLMenuGL::showPopup(this, menu, x, y); @@ -444,6 +446,12 @@ void LLMediaCtrl::onOpenWebInspector()          mMediaSource->getMediaPlugin()->showWebInspector( true );  } +void LLMediaCtrl::onShowSource() +{ +    if (mMediaSource && mMediaSource->hasMedia()) +        mMediaSource->getMediaPlugin()->showPageSource(); +} +  ////////////////////////////////////////////////////////////////////////////////  //  bool LLMediaCtrl::handleKeyHere( KEY key, MASK mask ) diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 9f9564af46..a644ef3071 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -171,6 +171,7 @@ public:          // right click debugging item          void onOpenWebInspector(); +        void onShowSource();          LLUUID getTextureID() {return mMediaTextureID;} diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index bb93e2e79e..82c959d7f7 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -161,7 +161,8 @@ bool LLStatusBar::postBuild()      getChild<LLUICtrl>("buyL")->setCommitCallback(          boost::bind(&LLStatusBar::onClickBuyCurrency, this)); -    getChild<LLUICtrl>("goShop")->setCommitCallback(boost::bind(&LLWeb::loadURL, gSavedSettings.getString("MarketplaceURL"), LLStringUtil::null, LLStringUtil::null)); +    getChild<LLUICtrl>("goShop")->setCommitCallback( +        boost::bind(&LLStatusBar::onClickShop, this));      mBoxBalance = getChild<LLTextBox>("balance");      mBoxBalance->setClickedCallback(&LLStatusBar::onClickRefreshBalance, this); @@ -520,6 +521,11 @@ void LLStatusBar::onClickBuyCurrency()      LLFirstUse::receiveLindens(false);  } +void LLStatusBar::onClickShop() +{ +    LLFloaterReg::toggleInstanceOrBringToFront("marketplace"); +} +  void LLStatusBar::onMouseEnterPresetsCamera()  {      LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder"); diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index a8fc621ff8..eb4ca8e894 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -101,6 +101,7 @@ public:  private:      void onClickBuyCurrency(); +    void onClickShop();      void onVolumeChanged(const LLSD& newvalue);      void onVoiceChanged(const LLSD& newvalue);      void onObscureBalanceChanged(const LLSD& newvalue); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index cc187a1f98..93b5806acf 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -49,6 +49,7 @@  #include "llviewerregion.h"  #include "llviewerstats.h"  #include "llviewerstatsrecorder.h" +#include "llviewerthrottle.h"  #include "llviewerassetstats.h"  #include "llworld.h"  #include "llsdparam.h" @@ -2434,7 +2435,7 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, bool threaded, bool qa_mod        mOriginFetchSource(LLTextureFetch::FROM_ALL),        mTextureInfoMainThread(false)  { -    mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); +    mMaxBandwidth = LLViewerThrottle::getMaxBandwidthKbps();      mTextureInfo.setLogging(true);      LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp()); @@ -2953,11 +2954,10 @@ void LLTextureFetch::commonUpdate()  size_t LLTextureFetch::update(F32 max_time_ms)  {      LL_PROFILE_ZONE_SCOPED; -    static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS", 3000.0);      {          mNetworkQueueMutex.lock();                                      // +Mfnq -        mMaxBandwidth = band_width(); +        mMaxBandwidth = LLViewerThrottle::getMaxBandwidthKbps();          add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, mHTTPTextureBits);          mHTTPTextureBits = (U32Bits)0; diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 8560a01c4b..8cbede8303 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -49,6 +49,7 @@  #include "llviewerobjectlist.h"  #include "llviewertexture.h"  #include "llviewertexturelist.h" +#include "llviewerthrottle.h"  #include "llviewerwindow.h"  #include "llwindow.h"  #include "llvovolume.h" @@ -633,7 +634,7 @@ void LLGLTexMemBar::draw()                                               LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &x_right);      F32Kilobits bandwidth(LLAppViewer::getTextureFetch()->getTextureBandwidth()); -    F32Kilobits max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS")); +    F32Kilobits max_bandwidth(LLViewerThrottle::getMaxBandwidthKbps());      color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color;      color[VALPHA] = text_color[VALPHA];      text = llformat("BW:%.0f/%.0f",bandwidth.value(), max_bandwidth.value()); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 4b3af6d7e8..3b35ca8db1 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -21,6 +21,7 @@   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA   *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ @@ -98,6 +99,7 @@  #include "llfloaterlinkreplace.h"  #include "llfloaterloadprefpreset.h"  #include "llfloatermap.h" +#include "llfloatermarketplace.h"  #include "llfloatermarketplacelistings.h"  #include "llfloatermediasettings.h"  #include "llfloatermemleak.h" @@ -419,6 +421,7 @@ void LLViewerFloaterReg::registerFloaters()      LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>);      LLFloaterReg::add("media_settings", "floater_media_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaSettings>); +    LLFloaterReg::add("marketplace", "floater_marketplace.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplace>);      LLFloaterReg::add("marketplace_listings", "floater_marketplace_listings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceListings>);      LLFloaterReg::add("marketplace_validation", "floater_marketplace_validation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceValidation>);      LLFloaterReg::add("message_critical", "floater_critical.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 82a52e63f6..89861d74bc 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -1259,35 +1259,46 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)      {          LLAppViewer::instance()->postToMainCoro([=]()              { -                LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents"); -                if (media_instance) +                std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart); +                std::string cookie_name = ""; +                std::string cookie_value = ""; +                std::string cookie_path = ""; +                bool httponly = true; +                bool secure = true; + +                LLViewerMedia* inst = getInstance(); +                if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure))                  { -                    LLViewerMedia* inst = getInstance(); -                    std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart); -                    std::string cookie_name = ""; -                    std::string cookie_value = ""; -                    std::string cookie_path = ""; -                    bool httponly = true; -                    bool secure = true; -                    if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) && -                        media_instance->getMediaPlugin()) +                    // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the +                    // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked. +                    // For now, we use the URL for the OpenID POST request since it will have the same authority +                    // as the domain field. +                    // (Feels like there must be a less dirty way to construct a URL from component LLURL parts) +                    // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further +                    // down. +                    std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority)); + +                    // list of floater names and webbrowser therein to set the cookie that arrived via login into +                    struct MediaCookieInstance { +                        std::string floater_name; +                        std::string browser_name; +                    }; +                    struct MediaCookieInstance media_cookie_instances[] = { +                        {"search", "search_contents" }, +                        {"marketplace", "marketplace_contents" }, +                        {"destinations", "destination_guide_contents" }, +                    }; +                    for (MediaCookieInstance mci : media_cookie_instances)                      { -                        // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the -                        // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked. -                        // For now, we use the URL for the OpenID POST request since it will have the same authority -                        // as the domain field. -                        // (Feels like there must be a less dirty way to construct a URL from component LLURL parts) -                        // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further -                        // down. -                        std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority)); - -                        media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host, -                            cookie_path, httponly, secure); - -                        // Now that we have parsed the raw cookie, we must store it so that each new media instance -                        // can also get a copy and faciliate logging into internal SL sites. -                        media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value, -                            cookie_host, cookie_path, httponly, secure); +                        LLMediaCtrl* media_instance = LLFloaterReg::getInstance(mci.floater_name)->getChild<LLMediaCtrl>(mci.browser_name); +                        if (media_instance && media_instance->getMediaPlugin()) +                        { +                            media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host, +                                cookie_path, httponly, secure); + +                            media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value, +                                cookie_host, cookie_path, httponly, secure); +                        }                      }                  }              }); @@ -3500,6 +3511,46 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  ////////////////////////////////////////////////////////////////////////////////  // virtual  void +LLViewerMediaImpl::undo() +{ +    if (mMediaSource) +        mMediaSource->undo(); +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +bool +LLViewerMediaImpl::canUndo() const +{ +    if (mMediaSource) +        return mMediaSource->canUndo(); +    else +        return FALSE; +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +void +LLViewerMediaImpl::redo() +{ +    if (mMediaSource) +        mMediaSource->redo(); +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +bool +LLViewerMediaImpl::canRedo() const +{ +    if (mMediaSource) +        return mMediaSource->canRedo(); +    else +        return FALSE; +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +void  LLViewerMediaImpl::cut()  {      if (mMediaSource) @@ -3557,6 +3608,46 @@ LLViewerMediaImpl::canPaste() const          return false;  } +//////////////////////////////////////////////////////////////////////////////// +// virtual +void +LLViewerMediaImpl::doDelete() +{ +    if (mMediaSource) +        mMediaSource->doDelete(); +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +bool +LLViewerMediaImpl::canDoDelete() const +{ +    if (mMediaSource) +        return mMediaSource->canDoDelete(); +    else +        return FALSE; +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +void +LLViewerMediaImpl::selectAll() +{ +    if (mMediaSource) +        mMediaSource->selectAll(); +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +bool +LLViewerMediaImpl::canSelectAll() const +{ +    if (mMediaSource) +        return mMediaSource->canSelectAll(); +    else +        return FALSE; +} +  void LLViewerMediaImpl::setUpdated(bool updated)  {      mIsUpdated = updated ; diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 5753615a43..c17cf59815 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -341,6 +341,12 @@ public:      /*virtual*/ void handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent);      // LLEditMenuHandler overrides +    /*virtual*/ void    undo(); +    /*virtual*/ bool    canUndo() const; + +    /*virtual*/ void    redo(); +    /*virtual*/ bool    canRedo() const; +      /*virtual*/ void    cut();      /*virtual*/ bool    canCut() const; @@ -350,6 +356,12 @@ public:      /*virtual*/ void    paste();      /*virtual*/ bool    canPaste() const; +    /*virtual*/ void    doDelete(); +    /*virtual*/ bool    canDoDelete() const; + +    /*virtual*/ void    selectAll(); +    /*virtual*/ bool    canSelectAll() const; +      void addObject(LLVOVolume* obj) ;      void removeObject(LLVOVolume* obj) ;      const std::list< LLVOVolume* >* getObjectList() const ; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 7a8a57c03d..f7688b762f 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4354,13 +4354,6 @@ void set_god_level(U8 god_level)      // changing god-level can affect which menus we see      show_debug_menus(); - -    // changing god-level can invalidate search results -    LLFloaterSearch *search = dynamic_cast<LLFloaterSearch*>(LLFloaterReg::getInstance("search")); -    if (search) -    { -        search->godLevelChanged(god_level); -    }  }  #ifdef TOGGLE_HACKED_GODLIKE_VIEWER diff --git a/indra/newview/llviewerthrottle.cpp b/indra/newview/llviewerthrottle.cpp index 8d935e4243..3ccfbea6e2 100644 --- a/indra/newview/llviewerthrottle.cpp +++ b/indra/newview/llviewerthrottle.cpp @@ -225,7 +225,7 @@ void LLViewerThrottle::setMaxBandwidth(F32 kbits_per_second, bool from_event)  void LLViewerThrottle::load()  { -    mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS")*1024; +    mMaxBandwidth = getMaxBandwidthKbps() * 1024;      resetDynamicThrottle();      mCurrent.dump();  } @@ -242,6 +242,15 @@ void LLViewerThrottle::sendToSim() const      mCurrent.sendToSim();  } +F32 LLViewerThrottle::getMaxBandwidthKbps() +{ +    constexpr F32 MIN_BANDWIDTH = 100.0f; // 100 Kbps +    constexpr F32 MAX_BANDWIDTH = 10000.0f; // 10 Mbps + +    static LLCachedControl<F32> bandwidth(gSavedSettings, "ThrottleBandwidthKBPS", 3000.0); +    return llclamp(bandwidth(), MIN_BANDWIDTH, MAX_BANDWIDTH); +} +  LLViewerThrottleGroup LLViewerThrottle::getThrottleGroup(const F32 bandwidth_kbps)  { diff --git a/indra/newview/llviewerthrottle.h b/indra/newview/llviewerthrottle.h index 9973c88549..ef898a97d7 100644 --- a/indra/newview/llviewerthrottle.h +++ b/indra/newview/llviewerthrottle.h @@ -64,6 +64,7 @@ public:      void save() const;      void sendToSim() const; +    static F32 getMaxBandwidthKbps();      F32 getMaxBandwidth()const          { return mMaxBandwidth; }      F32 getCurrentBandwidth() const     { return mCurrentBandwidth; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 2f943b4836..70498ecab4 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2317,6 +2317,18 @@ void LLViewerWindow::initWorldUI()              url = LLWeb::expandURLSubstitutions(url, LLSD());              avatar_welcome_pack->navigateTo(url, HTTP_CONTENT_TEXT_HTML);          } +        LLMediaCtrl* search = LLFloaterReg::getInstance("search")->findChild<LLMediaCtrl>("search_contents"); +        if (search) +        { +            search->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); +        } +        LLMediaCtrl* marketplace = LLFloaterReg::getInstance("marketplace")->getChild<LLMediaCtrl>("marketplace_contents"); +        if (marketplace) +        { +            marketplace->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); +            std::string url = gSavedSettings.getString("MarketplaceURL"); +            marketplace->navigateTo(url, HTTP_CONTENT_TEXT_HTML); +        }      }  } diff --git a/indra/newview/skins/default/xui/da/floater_search.xml b/indra/newview/skins/default/xui/da/floater_search.xml deleted file mode 100644 index 80a30b1aa1..0000000000 --- a/indra/newview/skins/default/xui/da/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title="FIND"> -	<floater.string name="loading_text"> -		Henter... -	</floater.string> -	<floater.string name="done_text"> -		Færdig -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Gentag søgning med "God level" -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/de/floater_search.xml b/indra/newview/skins/default/xui/de/floater_search.xml deleted file mode 100644 index bd39bf2bce..0000000000 --- a/indra/newview/skins/default/xui/de/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Wird geladen... -	</floater.string> -	<floater.string name="done_text"> -		Fertig -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Suche wiederholen, um aktuellen Gott-Level zu berücksichtigen -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_marketplace.xml b/indra/newview/skins/default/xui/en/floater_marketplace.xml new file mode 100644 index 0000000000..2299e02c63 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_marketplace.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + positioning="cascading" + legacy_header_height="225" + can_minimize="true" + can_close="true" + can_resize="true" + min_height="800" + min_width="800" + height="800" + layout="topleft" + name="Marketplace" + single_instance="true" + help_topic="marketplace" + save_rect="true" + save_visibility="true" + title="MARKETPLACE" + width="800"> +    <web_browser +      top="25" +      height="775" +      width="800" +      follows="all" +      name="marketplace_contents" +      trusted_content="true"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index fc1e32915a..76a486e211 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -1,18 +1,26 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater -  positioning="cascading" -  legacy_header_height="18" -  can_resize="true" -  height="775" -  layout="topleft" -  min_height="400" -  min_width="500" -  name="floater_search" -  help_topic="floater_search" -  save_rect="true" -  save_visibility="true" -  title="" -  initial_mime_type="text/html" -  width="780" -  tab_stop="true" -  filename="floater_web_content.xml"/> + positioning="cascading" + legacy_header_height="225" + can_minimize="true" + can_close="true" + can_resize="true" + min_height="800" + min_width="800" + height="800" + layout="topleft" + name="Search" + single_instance="true" + help_topic="search" + save_rect="true" + save_visibility="true" + title="SEARCH" + width="800"> +    <web_browser +      top="25" +      height="775" +      width="800" +      follows="all" +      name="search_contents" +      trusted_content="true"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml index 2e1dfa00c7..53796f0959 100644 --- a/indra/newview/skins/default/xui/en/floater_web_content.xml +++ b/indra/newview/skins/default/xui/en/floater_web_content.xml @@ -178,7 +178,7 @@          width="22">          <button.commit_callback            function="WebContent.TestURL" -          parameter="https://sl-viewer-media-system.s3.amazonaws.com/index.html"/> +          parameter="https://sl-viewer-media-system.s3.amazonaws.com/bookmarks/index.html"/>        </button>      </layout_panel>      <layout_panel diff --git a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml index f9864637a0..e687ae93e8 100644 --- a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml +++ b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml @@ -40,4 +40,12 @@      <menu_item_call.on_click       function="Open.WebInspector" />    </menu_item_call> +  <menu_item_call +   label="Show Source" +   layout="topleft" +   name="show_page_source" +   visible="false"> +    <menu_item_call.on_click +     function="Open.ShowSource" /> +  </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/es/floater_search.xml b/indra/newview/skins/default/xui/es/floater_search.xml deleted file mode 100644 index e24d8064a1..0000000000 --- a/indra/newview/skins/default/xui/es/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Cargando... -	</floater.string> -	<floater.string name="done_text"> -		Hecho -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Redo search to reflect current God level -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_search.xml b/indra/newview/skins/default/xui/fr/floater_search.xml deleted file mode 100644 index 32800182ea..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Chargement... -	</floater.string> -	<floater.string name="done_text"> -		Terminé -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Relancer la recherche pour refléter le niveau divin actuel -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/it/floater_search.xml b/indra/newview/skins/default/xui/it/floater_search.xml deleted file mode 100644 index ac3dc17aa3..0000000000 --- a/indra/newview/skins/default/xui/it/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Caricamento in corso... -	</floater.string> -	<floater.string name="done_text"> -		Fine -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Ripeti ricerca in modo che rifletta il livello di diritti Admin attuale -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_search.xml b/indra/newview/skins/default/xui/ja/floater_search.xml deleted file mode 100644 index 531ac77f95..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		読み込んでいます…。 -	</floater.string> -	<floater.string name="done_text"> -		完了 -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				現在のゴッドレベルに反映させるため、検索をやり直してください。 -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_search.xml b/indra/newview/skins/default/xui/pt/floater_search.xml deleted file mode 100644 index 3509cb786d..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Carregando... -	</floater.string> -	<floater.string name="done_text"> -		Pronto -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Buscar novamente com status God -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_search.xml b/indra/newview/skins/default/xui/ru/floater_search.xml deleted file mode 100644 index 405a6598ac..0000000000 --- a/indra/newview/skins/default/xui/ru/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Загрузка... -	</floater.string> -	<floater.string name="done_text"> -		Готово -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Повторить поиск, чтобы показать текущий уровень творца -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_search.xml b/indra/newview/skins/default/xui/tr/floater_search.xml deleted file mode 100644 index 08c1e5162c..0000000000 --- a/indra/newview/skins/default/xui/tr/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Yükleniyor... -	</floater.string> -	<floater.string name="done_text"> -		Tamamlandı -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Mevcut Yönetici seviyesini dikkate alarak aramayı yenile -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_search.xml b/indra/newview/skins/default/xui/zh/floater_search.xml deleted file mode 100644 index 3e85a529ae..0000000000 --- a/indra/newview/skins/default/xui/zh/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		載入中... -	</floater.string> -	<floater.string name="done_text"> -		完成 -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				以目前具備的神階級再搜尋一次 -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index a0428ef95d..c69f4bd1f3 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -623,12 +623,16 @@ class Windows_x86_64_Manifest(ViewerManifest):              with self.prefix(src=os.path.join(pkgdir, 'bin', config)):                  self.path("chrome_elf.dll")                  self.path("d3dcompiler_47.dll") +                self.path("dxcompiler.dll") +                self.path("dxil.dll")                  self.path("libcef.dll")                  self.path("libEGL.dll")                  self.path("libGLESv2.dll") -                self.path("dullahan_host.exe") -                self.path("snapshot_blob.bin")                  self.path("v8_context_snapshot.bin") +                self.path("vk_swiftshader.dll") +                self.path("vk_swiftshader_icd.json") +                self.path("vulkan-1.dll") +                self.path("dullahan_host.exe")              # MSVC DLLs needed for CEF and have to be in same directory as plugin              with self.prefix(src=os.path.join(self.args['build'], os.pardir, @@ -863,9 +867,6 @@ class Darwin_x86_64_Manifest(ViewerManifest):              with self.prefix(src=relpkgdir, dst="Frameworks"):                  self.path("libndofdev.dylib") -                CEF_framework = "Chromium Embedded Framework.framework" -                self.path2basename(relpkgdir, CEF_framework) -                CEF_framework = self.dst_path_of(CEF_framework)                  if self.args.get('bugsplat'):                      self.path2basename(relpkgdir, "BugsplatMac.framework") @@ -1061,113 +1062,31 @@ class Darwin_x86_64_Manifest(ViewerManifest):                  # Dullahan helper apps go inside SLPlugin.app                  with self.prefix(dst=os.path.join(                      "SLPlugin.app", "Contents", "Frameworks")): - -                    frameworkname = 'Chromium Embedded Framework' - -                    # This code constructs a relative symlink from the -                    # target framework folder back to the real CEF framework. -                    # It needs to be relative so that the symlink still works when -                    # (as is normal) the user moves the app bundle out of the DMG -                    # and into the /Applications folder. Note we pass catch=False, -                    # letting the uncaught exception terminate the process, since -                    # without this symlink, Second Life web media can't possibly work. - -                    # It might seem simpler just to symlink Frameworks back to -                    # the parent of Chromimum Embedded Framework.framework. But -                    # that would create a symlink cycle, which breaks our -                    # packaging step. So make a symlink from Chromium Embedded -                    # Framework.framework to the directory of the same name, which -                    # is NOT an ancestor of the symlink. - -                    # from SLPlugin.app/Contents/Frameworks/Chromium Embedded -                    # Framework.framework back to -                    # $viewer_app/Contents/Frameworks/Chromium Embedded Framework.framework -                    SLPlugin_framework = self.relsymlinkf(CEF_framework, catch=False) - -                    # for all the multiple CEF/Dullahan (as of CEF 76) helper app bundles we need: -                    for helper in ( -                        "DullahanHelper", -                        "DullahanHelper (GPU)", -                        "DullahanHelper (Renderer)", -                        "DullahanHelper (Plugin)", -                    ): -                        # app is the directory name of the app bundle, with app/Contents/MacOS/helper as the executable -                        app = helper + ".app" - -                        # copy DullahanHelper.app -                        self.path2basename(relpkgdir, app) - -                        # and fix that up with a Frameworks/CEF symlink too -                        with self.prefix(dst=os.path.join( -                                app, 'Contents', 'Frameworks')): -                            # from Dullahan Helper *.app/Contents/Frameworks/Chromium Embedded -                            # Framework.framework back to -                            # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework -                            # Since SLPlugin_framework is itself a -                            # symlink, don't let relsymlinkf() resolve -- -                            # explicitly call relpath(symlink=True) and -                            # create that symlink here. -                            helper_framework = \ -                            self.symlinkf(self.relpath(SLPlugin_framework, symlink=True), catch=False) - -                        # change_command includes install_name_tool, the -                        # -change subcommand and the old framework rpath -                        # stamped into the executable. To use it with -                        # run_command(), we must still append the new -                        # framework path and the pathname of the -                        # executable to change. -                        change_command = [ -                            'install_name_tool', '-change', -                            '@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework'] - -                        with self.prefix(dst=os.path.join( -                                app, 'Contents', 'MacOS')): -                            # Now self.get_dst_prefix() is, at runtime, -                            # @executable_path. Locate the helper app -                            # framework (which is a symlink) from here. -                            newpath = os.path.join( -                                '@executable_path', -                                    self.relpath(helper_framework, symlink=True), -                                frameworkname) -                                # and restamp the Dullahan Helper executable itself -                            self.run_command( -                                change_command + -                                    [newpath, self.dst_path_of(helper)]) - -                # SLPlugin plugins -                with self.prefix(dst="llplugin"): -                    dylibexecutable = 'media_plugin_cef.dylib' +                    # copy CEF plugin                      self.path2basename("../media_plugins/cef/" + self.args['configuration'], -                                       dylibexecutable) - -                    # Do this install_name_tool *after* media plugin is copied over. -                    # Locate the framework lib executable -- relative to -                    # SLPlugin.app/Contents/MacOS, which will be our -                    # @executable_path at runtime! -                    newpath = os.path.join( -                        '@executable_path', -                        self.relpath(SLPlugin_framework, executable_path["SLPlugin.app"], -                                     symlink=True), -                        frameworkname) -                    # restamp media_plugin_cef.dylib -                    self.run_command( -                        change_command + -                        [newpath, self.dst_path_of(dylibexecutable)]) - -                    # copy LibVLC plugin itself -                    dylibexecutable = 'media_plugin_libvlc.dylib' -                    self.path2basename("../media_plugins/libvlc/" + self.args['configuration'], dylibexecutable) -                    # add @rpath for the correct LibVLC subfolder -                    self.run_command(['install_name_tool', '-add_rpath', '@loader_path/lib', self.dst_path_of(dylibexecutable)]) - -                    # copy LibVLC dynamic libraries -                    with self.prefix(src=relpkgdir, dst="lib"): +                                       "media_plugin_cef.dylib") + +                    # copy LibVLC plugin +                    self.path2basename("../media_plugins/libvlc/" + self.args['configuration'], +                                       "media_plugin_libvlc.dylib") + +                    # CEF framework and vlc libraries goes inside Contents/Frameworks. +                    with self.prefix(src=os.path.join(pkgdir, 'lib', 'release')): +                        self.path("Chromium Embedded Framework.framework") +                        self.path("DullahanHelper.app") +                        self.path("DullahanHelper (Alerts).app") +                        self.path("DullahanHelper (GPU).app") +                        self.path("DullahanHelper (Renderer).app") +                        self.path("DullahanHelper (Plugin).app") + +                        # Copy libvlc                          self.path( "libvlc*.dylib*" )                          # copy LibVLC plugins folder -                        with self.prefix(src='plugins', dst=""): +                        with self.prefix(src='plugins', dst="plugins"):                              self.path( "*.dylib" )                              self.path( "plugins.dat" ) +      def package_finish(self):          imagename = self.installer_base_name()          self.set_github_output('imagename', imagename) | 
