Merge pull request #14024 from wayne-chen/toggle404Redirect

Toggle going to 404 redirect domain
This commit is contained in:
John Conklin II 2018-09-25 20:44:57 -07:00 committed by GitHub
commit c5ff72bd20
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 76 additions and 37 deletions

View file

@ -3500,13 +3500,14 @@ bool Application::isServerlessMode() const {
} }
void Application::setIsInterstitialMode(bool interstitialMode) { void Application::setIsInterstitialMode(bool interstitialMode) {
Settings settings; bool enableInterstitial = DependencyManager::get<NodeList>()->getDomainHandler().getInterstitialModeEnabled();
bool enableInterstitial = settings.value("enableIntersitialMode", false).toBool(); if (enableInterstitial) {
if (_interstitialMode != interstitialMode && enableInterstitial) { if (_interstitialMode != interstitialMode) {
_interstitialMode = interstitialMode; _interstitialMode = interstitialMode;
DependencyManager::get<AudioClient>()->setAudioPaused(_interstitialMode); DependencyManager::get<AudioClient>()->setAudioPaused(_interstitialMode);
DependencyManager::get<AvatarManager>()->setMyAvatarDataPacketsPaused(_interstitialMode); DependencyManager::get<AvatarManager>()->setMyAvatarDataPacketsPaused(_interstitialMode);
}
} }
} }

View file

@ -432,7 +432,7 @@ public slots:
void setIsServerlessMode(bool serverlessDomain); void setIsServerlessMode(bool serverlessDomain);
void loadServerlessDomain(QUrl domainURL, bool errorDomain = false); void loadServerlessDomain(QUrl domainURL, bool errorDomain = false);
void setIsInterstitialMode(bool interstialMode); void setIsInterstitialMode(bool interstitialMode);
void updateVerboseLogging(); void updateVerboseLogging();

View file

@ -41,9 +41,15 @@ void ConnectionMonitor::init() {
} }
connect(&_timer, &QTimer::timeout, this, [this]() { connect(&_timer, &QTimer::timeout, this, [this]() {
qDebug() << "ConnectionMonitor: Redirecting to 404 error domain";
// set in a timeout error // set in a timeout error
emit setRedirectErrorState(REDIRECT_HIFI_ADDRESS, 5); bool enableInterstitial = DependencyManager::get<NodeList>()->getDomainHandler().getInterstitialModeEnabled();
if (enableInterstitial) {
qDebug() << "ConnectionMonitor: Redirecting to 404 error domain";
emit setRedirectErrorState(REDIRECT_HIFI_ADDRESS, "", 5);
} else {
qDebug() << "ConnectionMonitor: Showing connection failure window";
DependencyManager::get<DialogsManager>()->setDomainConnectionFailureVisibility(true);
}
}); });
} }
@ -53,4 +59,8 @@ void ConnectionMonitor::startTimer() {
void ConnectionMonitor::stopTimer() { void ConnectionMonitor::stopTimer() {
_timer.stop(); _timer.stop();
bool enableInterstitial = DependencyManager::get<NodeList>()->getDomainHandler().getInterstitialModeEnabled();
if (!enableInterstitial) {
DependencyManager::get<DialogsManager>()->setDomainConnectionFailureVisibility(false);
}
} }

View file

@ -24,7 +24,7 @@ public:
void init(); void init();
signals: signals:
void setRedirectErrorState(QUrl errorURL, int reasonCode); void setRedirectErrorState(QUrl errorURL, QString reasonMessage = "", int reasonCode = -1, const QString& extraInfo = "");
private slots: private slots:
void startTimer(); void startTimer();
@ -34,4 +34,4 @@ private:
QTimer _timer; QTimer _timer;
}; };
#endif // hifi_ConnectionMonitor_h #endif // hifi_ConnectionMonitor_h

View file

@ -180,6 +180,14 @@ void WindowScriptingInterface::setPreviousBrowseAssetLocation(const QString& loc
Setting::Handle<QVariant>(LAST_BROWSE_ASSETS_LOCATION_SETTING).set(location); Setting::Handle<QVariant>(LAST_BROWSE_ASSETS_LOCATION_SETTING).set(location);
} }
bool WindowScriptingInterface::getInterstitialModeEnabled() const {
return DependencyManager::get<NodeList>()->getDomainHandler().getInterstitialModeEnabled();
}
void WindowScriptingInterface::setInterstitialModeEnabled(bool enableInterstitialMode) {
DependencyManager::get<NodeList>()->getDomainHandler().setInterstitialModeEnabled(enableInterstitialMode);
}
bool WindowScriptingInterface::isPointOnDesktopWindow(QVariant point) { bool WindowScriptingInterface::isPointOnDesktopWindow(QVariant point) {
auto offscreenUi = DependencyManager::get<OffscreenUi>(); auto offscreenUi = DependencyManager::get<OffscreenUi>();
return offscreenUi->isPointOnDesktopWindow(point); return offscreenUi->isPointOnDesktopWindow(point);

View file

@ -49,6 +49,7 @@ class WindowScriptingInterface : public QObject, public Dependency {
Q_PROPERTY(int innerHeight READ getInnerHeight) Q_PROPERTY(int innerHeight READ getInnerHeight)
Q_PROPERTY(int x READ getX) Q_PROPERTY(int x READ getX)
Q_PROPERTY(int y READ getY) Q_PROPERTY(int y READ getY)
Q_PROPERTY(bool interstitialModeEnabled READ getInterstitialModeEnabled WRITE setInterstitialModeEnabled)
public: public:
WindowScriptingInterface(); WindowScriptingInterface();
@ -758,6 +759,9 @@ private:
QString getPreviousBrowseAssetLocation() const; QString getPreviousBrowseAssetLocation() const;
void setPreviousBrowseAssetLocation(const QString& location); void setPreviousBrowseAssetLocation(const QString& location);
bool getInterstitialModeEnabled() const;
void setInterstitialModeEnabled(bool enableInterstitialMode);
void ensureReticleVisible() const; void ensureReticleVisible() const;
int createMessageBox(QString title, QString text, int buttons, int defaultButton); int createMessageBox(QString title, QString text, int buttons, int defaultButton);

View file

@ -140,8 +140,7 @@ public:
* </table> * </table>
* @typedef {number} location.LookupTrigger * @typedef {number} location.LookupTrigger
*/ */
enum LookupTrigger enum LookupTrigger {
{
UserInput, UserInput,
Back, Back,
Forward, Forward,
@ -207,9 +206,8 @@ public slots:
// functions and signals that should be exposed are moved to a scripting interface class. // functions and signals that should be exposed are moved to a scripting interface class.
// //
// we currently expect this to be called from NodeList once handleLookupString has been called with a path // we currently expect this to be called from NodeList once handleLookupString has been called with a path
bool goToViewpointForPath(const QString& viewpointString, const QString& pathString) { bool goToViewpointForPath(const QString& viewpointString, const QString& pathString)
return handleViewpoint(viewpointString, false, DomainPathResponse, false, pathString); { return handleViewpoint(viewpointString, false, DomainPathResponse, false, pathString); }
}
/**jsdoc /**jsdoc
* Go back to the previous location in your navigation history, if there is one. * Go back to the previous location in your navigation history, if there is one.
@ -231,8 +229,7 @@ public slots:
* location history is correctly maintained. * location history is correctly maintained.
*/ */
void goToLocalSandbox(QString path = "", LookupTrigger trigger = LookupTrigger::StartupFromSettings) { void goToLocalSandbox(QString path = "", LookupTrigger trigger = LookupTrigger::StartupFromSettings) {
handleUrl(SANDBOX_HIFI_ADDRESS + path, trigger); handleUrl(SANDBOX_HIFI_ADDRESS + path, trigger); }
}
/**jsdoc /**jsdoc
* Go to the default "welcome" metaverse address. * Go to the default "welcome" metaverse address.
@ -364,8 +361,7 @@ signals:
* location.locationChangeRequired.connect(onLocationChangeRequired); * location.locationChangeRequired.connect(onLocationChangeRequired);
*/ */
void locationChangeRequired(const glm::vec3& newPosition, void locationChangeRequired(const glm::vec3& newPosition,
bool hasOrientationChange, bool hasOrientationChange, const glm::quat& newOrientation,
const glm::quat& newOrientation,
bool shouldFaceLocation); bool shouldFaceLocation);
/**jsdoc /**jsdoc
@ -448,11 +444,8 @@ private:
bool handleNetworkAddress(const QString& lookupString, LookupTrigger trigger, bool& hostChanged); bool handleNetworkAddress(const QString& lookupString, LookupTrigger trigger, bool& hostChanged);
void handlePath(const QString& path, LookupTrigger trigger, bool wasPathOnly = false); void handlePath(const QString& path, LookupTrigger trigger, bool wasPathOnly = false);
bool handleViewpoint(const QString& viewpointString, bool handleViewpoint(const QString& viewpointString, bool shouldFace, LookupTrigger trigger,
bool shouldFace, bool definitelyPathOnly = false, const QString& pathString = QString());
LookupTrigger trigger,
bool definitelyPathOnly = false,
const QString& pathString = QString());
bool handleUsername(const QString& lookupString); bool handleUsername(const QString& lookupString);
bool handleDomainID(const QString& host); bool handleDomainID(const QString& host);

View file

@ -15,6 +15,10 @@
#include <PathUtils.h> #include <PathUtils.h>
#include <shared/QtHelpers.h>
#include <QThread>
#include <QtCore/QJsonDocument> #include <QtCore/QJsonDocument>
#include <QtCore/QDataStream> #include <QtCore/QDataStream>
@ -134,6 +138,18 @@ void DomainHandler::hardReset() {
_pendingPath.clear(); _pendingPath.clear();
} }
bool DomainHandler::getInterstitialModeEnabled() const {
return _interstitialModeSettingLock.resultWithReadLock<bool>([&] {
return _enableInterstitialMode.get();
});
}
void DomainHandler::setInterstitialModeEnabled(bool enableInterstitialMode) {
_interstitialModeSettingLock.withWriteLock([&] {
_enableInterstitialMode.set(enableInterstitialMode);
});
}
void DomainHandler::setErrorDomainURL(const QUrl& url) { void DomainHandler::setErrorDomainURL(const QUrl& url) {
_errorDomainURL = url; _errorDomainURL = url;
return; return;
@ -340,11 +356,15 @@ void DomainHandler::loadedErrorDomain(std::map<QString, QString> namedPaths) {
DependencyManager::get<AddressManager>()->goToViewpointForPath(viewpoint, QString()); DependencyManager::get<AddressManager>()->goToViewpointForPath(viewpoint, QString());
} }
void DomainHandler::setRedirectErrorState(QUrl errorUrl, int reasonCode) { void DomainHandler::setRedirectErrorState(QUrl errorUrl, QString reasonMessage, int reasonCode, const QString& extraInfo) {
_errorDomainURL = errorUrl;
_lastDomainConnectionError = reasonCode; _lastDomainConnectionError = reasonCode;
_isInErrorState = true; if (getInterstitialModeEnabled()) {
emit redirectToErrorDomainURL(_errorDomainURL); _errorDomainURL = errorUrl;
_isInErrorState = true;
emit redirectToErrorDomainURL(_errorDomainURL);
} else {
emit domainConnectionRefused(reasonMessage, reasonCode, extraInfo);
}
} }
void DomainHandler::requestDomainSettings() { void DomainHandler::requestDomainSettings() {
@ -485,13 +505,9 @@ void DomainHandler::processDomainServerConnectionDeniedPacket(QSharedPointer<Rec
#if defined(Q_OS_ANDROID) #if defined(Q_OS_ANDROID)
emit domainConnectionRefused(reasonMessage, (int)reasonCode, extraInfo); emit domainConnectionRefused(reasonMessage, (int)reasonCode, extraInfo);
#else #else
if (reasonCode == ConnectionRefusedReason::ProtocolMismatch || reasonCode == ConnectionRefusedReason::NotAuthorized) {
// ingest the error - this is a "hard" connection refusal. // ingest the error - this is a "hard" connection refusal.
setRedirectErrorState(_errorDomainURL, (int)reasonCode); setRedirectErrorState(_errorDomainURL, reasonMessage, (int)reasonCode, extraInfo);
} else {
emit domainConnectionRefused(reasonMessage, (int)reasonCode, extraInfo);
}
_lastDomainConnectionError = (int)reasonCode;
#endif #endif
} }

View file

@ -19,6 +19,9 @@
#include <QtCore/QUrl> #include <QtCore/QUrl>
#include <QtNetwork/QHostInfo> #include <QtNetwork/QHostInfo>
#include <shared/ReadWriteLockable.h>
#include <SettingHandle.h>
#include "HifiSockAddr.h" #include "HifiSockAddr.h"
#include "NetworkPeer.h" #include "NetworkPeer.h"
#include "NLPacket.h" #include "NLPacket.h"
@ -83,6 +86,8 @@ public:
bool isConnected() const { return _isConnected; } bool isConnected() const { return _isConnected; }
void setIsConnected(bool isConnected); void setIsConnected(bool isConnected);
bool isServerless() const { return _domainURL.scheme() != URL_SCHEME_HIFI; } bool isServerless() const { return _domainURL.scheme() != URL_SCHEME_HIFI; }
bool getInterstitialModeEnabled() const;
void setInterstitialModeEnabled(bool enableInterstitialMode);
void connectedToServerless(std::map<QString, QString> namedPaths); void connectedToServerless(std::map<QString, QString> namedPaths);
@ -171,7 +176,7 @@ public slots:
void processDomainServerConnectionDeniedPacket(QSharedPointer<ReceivedMessage> message); void processDomainServerConnectionDeniedPacket(QSharedPointer<ReceivedMessage> message);
// sets domain handler in error state. // sets domain handler in error state.
void setRedirectErrorState(QUrl errorUrl, int reasonCode); void setRedirectErrorState(QUrl errorUrl, QString reasonMessage = "", int reason = -1, const QString& extraInfo = "");
bool isInErrorState() { return _isInErrorState; } bool isInErrorState() { return _isInErrorState; }
@ -224,6 +229,8 @@ private:
QJsonObject _settingsObject; QJsonObject _settingsObject;
QString _pendingPath; QString _pendingPath;
QTimer _settingsTimer; QTimer _settingsTimer;
mutable ReadWriteLockable _interstitialModeSettingLock;
Setting::Handle<bool> _enableInterstitialMode{ "enableInterstitialMode", false };
QSet<QString> _domainConnectionRefusals; QSet<QString> _domainConnectionRefusals;
bool _hasCheckedForAccessToken { false }; bool _hasCheckedForAccessToken { false };