Merge branch 'master' of github.com:highfidelity/hifi into 21193-updateNitpickReadme

This commit is contained in:
NissimHadar 2019-02-14 13:47:16 -08:00
commit 90aff53408
36 changed files with 289 additions and 511 deletions

View file

@ -24,6 +24,7 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Vibrator; import android.os.Vibrator;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -54,6 +55,7 @@ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnW
public static final String DOMAIN_URL = "url"; public static final String DOMAIN_URL = "url";
public static final String EXTRA_GOTO_USERNAME = "gotousername"; public static final String EXTRA_GOTO_USERNAME = "gotousername";
private static final String TAG = "Interface"; private static final String TAG = "Interface";
public static final String EXTRA_ARGS = "args";
private static final int WEB_DRAWER_RIGHT_MARGIN = 262; private static final int WEB_DRAWER_RIGHT_MARGIN = 262;
private static final int WEB_DRAWER_BOTTOM_MARGIN = 150; private static final int WEB_DRAWER_BOTTOM_MARGIN = 150;
private static final int NORMAL_DPI = 160; private static final int NORMAL_DPI = 160;
@ -78,6 +80,7 @@ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnW
private boolean nativeEnterBackgroundCallEnqueued = false; private boolean nativeEnterBackgroundCallEnqueued = false;
private SlidingDrawer mWebSlidingDrawer; private SlidingDrawer mWebSlidingDrawer;
private boolean mStartInDomain;
// private GvrApi gvrApi; // private GvrApi gvrApi;
// Opaque native pointer to the Application C++ object. // Opaque native pointer to the Application C++ object.
// This object is owned by the InterfaceActivity instance and passed to the native methods. // This object is owned by the InterfaceActivity instance and passed to the native methods.
@ -93,8 +96,14 @@ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnW
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.isLoading = true; super.isLoading = true;
Intent intent = getIntent(); Intent intent = getIntent();
if (intent.hasExtra(DOMAIN_URL) && !intent.getStringExtra(DOMAIN_URL).isEmpty()) { if (intent.hasExtra(DOMAIN_URL) && !TextUtils.isEmpty(intent.getStringExtra(DOMAIN_URL))) {
intent.putExtra("applicationArguments", "--url " + intent.getStringExtra(DOMAIN_URL)); intent.putExtra("applicationArguments", "--url " + intent.getStringExtra(DOMAIN_URL));
} else if (intent.hasExtra(EXTRA_ARGS)) {
String args = intent.getStringExtra(EXTRA_ARGS);
if (!TextUtils.isEmpty(args)) {
mStartInDomain = true;
intent.putExtra("applicationArguments", args);
}
} }
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@ -125,7 +134,10 @@ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnW
getActionBar().hide(); getActionBar().hide();
} }
}); });
startActivity(new Intent(this, SplashActivity.class)); Intent splashIntent = new Intent(this, SplashActivity.class);
splashIntent.putExtra(SplashActivity.EXTRA_START_IN_DOMAIN, mStartInDomain);
startActivity(splashIntent);
mVibrator = (Vibrator) this.getSystemService(VIBRATOR_SERVICE); mVibrator = (Vibrator) this.getSystemService(VIBRATOR_SERVICE);
headsetStateReceiver = new HeadsetStateReceiver(); headsetStateReceiver = new HeadsetStateReceiver();
} }

View file

@ -9,6 +9,7 @@ import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.text.TextUtils;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -27,9 +28,14 @@ public class PermissionChecker extends Activity {
private static final boolean CHOOSE_AVATAR_ON_STARTUP = false; private static final boolean CHOOSE_AVATAR_ON_STARTUP = false;
private static final String TAG = "Interface"; private static final String TAG = "Interface";
private static final String EXTRA_ARGS = "args";
private String mArgs;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mArgs =(getIntent().getStringExtra(EXTRA_ARGS));
Intent myIntent = new Intent(this, BreakpadUploaderService.class); Intent myIntent = new Intent(this, BreakpadUploaderService.class);
startService(myIntent); startService(myIntent);
if (CHOOSE_AVATAR_ON_STARTUP) { if (CHOOSE_AVATAR_ON_STARTUP) {
@ -76,6 +82,11 @@ public class PermissionChecker extends Activity {
private void launchActivityWithPermissions(){ private void launchActivityWithPermissions(){
Intent i = new Intent(this, InterfaceActivity.class); Intent i = new Intent(this, InterfaceActivity.class);
if (!TextUtils.isEmpty(mArgs)) {
i.putExtra(EXTRA_ARGS, mArgs);
}
startActivity(i); startActivity(i);
finish(); finish();
} }

View file

@ -7,6 +7,9 @@ import android.view.View;
public class SplashActivity extends Activity { public class SplashActivity extends Activity {
public static final String EXTRA_START_IN_DOMAIN = "start-in-domain";
private boolean mStartInDomain;
private native void registerLoadCompleteListener(); private native void registerLoadCompleteListener();
@Override @Override
@ -36,13 +39,27 @@ public class SplashActivity extends Activity {
} }
public void onAppLoadedComplete() { public void onAppLoadedComplete() {
if (HifiUtils.getInstance().isUserLoggedIn()) { if (!mStartInDomain) {
startActivity(new Intent(this, MainActivity.class)); if (HifiUtils.getInstance().isUserLoggedIn()) {
} else { startActivity(new Intent(this, MainActivity.class));
Intent menuIntent = new Intent(this, LoginMenuActivity.class); } else {
menuIntent.putExtra(LoginMenuActivity.EXTRA_FINISH_ON_BACK, true); Intent menuIntent = new Intent(this, LoginMenuActivity.class);
startActivity(menuIntent); menuIntent.putExtra(LoginMenuActivity.EXTRA_FINISH_ON_BACK, true);
startActivity(menuIntent);
}
} }
SplashActivity.this.finish(); SplashActivity.this.finish();
} }
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(EXTRA_START_IN_DOMAIN, mStartInDomain);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mStartInDomain = savedInstanceState.getBoolean(EXTRA_START_IN_DOMAIN, false);
}
} }

View file

@ -111,7 +111,7 @@ bool EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O
int32_t lodLevelOffset = nodeData->getBoundaryLevelAdjust() + (viewFrustumChanged ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST); int32_t lodLevelOffset = nodeData->getBoundaryLevelAdjust() + (viewFrustumChanged ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST);
newView.lodScaleFactor = powf(2.0f, lodLevelOffset); newView.lodScaleFactor = powf(2.0f, lodLevelOffset);
startNewTraversal(newView, root); startNewTraversal(newView, root, isFullScene);
// When the viewFrustum changed the sort order may be incorrect, so we re-sort // When the viewFrustum changed the sort order may be incorrect, so we re-sort
// and also use the opportunity to cull anything no longer in view // and also use the opportunity to cull anything no longer in view
@ -220,9 +220,10 @@ bool EntityTreeSendThread::addDescendantsToExtraFlaggedEntities(const QUuid& fil
return hasNewChild || hasNewDescendants; return hasNewChild || hasNewDescendants;
} }
void EntityTreeSendThread::startNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root) { void EntityTreeSendThread::startNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root,
bool forceFirstPass) {
DiffTraversal::Type type = _traversal.prepareNewTraversal(view, root); DiffTraversal::Type type = _traversal.prepareNewTraversal(view, root, forceFirstPass);
// there are three types of traversal: // there are three types of traversal:
// //
// (1) FirstTime = at login --> find everything in view // (1) FirstTime = at login --> find everything in view

View file

@ -42,7 +42,7 @@ private:
bool addAncestorsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData); bool addAncestorsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData);
bool addDescendantsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData); bool addDescendantsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData);
void startNewTraversal(const DiffTraversal::View& viewFrustum, EntityTreeElementPointer root); void startNewTraversal(const DiffTraversal::View& viewFrustum, EntityTreeElementPointer root, bool forceFirstPass = false);
bool traverseTreeAndBuildNextPacketPayload(EncodeBitstreamParams& params, const QJsonObject& jsonFilters) override; bool traverseTreeAndBuildNextPacketPayload(EncodeBitstreamParams& params, const QJsonObject& jsonFilters) override;
void preDistributionProcessing() override; void preDistributionProcessing() override;

View file

@ -333,7 +333,11 @@ if (APPLE)
COMMAND "${CMAKE_COMMAND}" -E copy_directory COMMAND "${CMAKE_COMMAND}" -E copy_directory
"${PROJECT_SOURCE_DIR}/resources/fonts" "${PROJECT_SOURCE_DIR}/resources/fonts"
"${RESOURCES_DEV_DIR}/fonts" "${RESOURCES_DEV_DIR}/fonts"
# add redirect json to macOS builds. #copy serverless for android
COMMAND "${CMAKE_COMMAND}" -E copy_directory
"${PROJECT_SOURCE_DIR}/resources/serverless"
"${RESOURCES_DEV_DIR}/serverless"
# add redirect json to macOS builds.
COMMAND "${CMAKE_COMMAND}" -E copy_if_different COMMAND "${CMAKE_COMMAND}" -E copy_if_different
"${PROJECT_SOURCE_DIR}/resources/serverless/redirect.json" "${PROJECT_SOURCE_DIR}/resources/serverless/redirect.json"
"${RESOURCES_DEV_DIR}/serverless/redirect.json" "${RESOURCES_DEV_DIR}/serverless/redirect.json"

View file

@ -1,275 +0,0 @@
import QtQuick 2.5
import QtWebChannel 1.0
import QtWebEngine 1.5
import controlsUit 1.0
import stylesUit 1.0
import "qrc:////qml//windows"
ScrollingWindow {
id: root
HifiConstants { id: hifi }
//HifiStyles.HifiConstants { id: hifistyles }
title: "Browser"
resizable: true
destroyOnHidden: true
width: 800
height: 600
property variant permissionsBar: {'securityOrigin':'none','feature':'none'}
property alias url: webview.url
property alias webView: webview
signal loadingChanged(int status)
x: 100
y: 100
Component.onCompleted: {
focus = true
shown = true
addressBar.text = webview.url
}
function setProfile(profile) {
webview.profile = profile;
}
function showPermissionsBar(){
permissionsContainer.visible=true;
}
function hidePermissionsBar(){
permissionsContainer.visible=false;
}
function allowPermissions(){
webview.grantFeaturePermission(permissionsBar.securityOrigin, permissionsBar.feature, true);
hidePermissionsBar();
}
function setAutoAdd(auto) {
desktop.setAutoAdd(auto);
}
Item {
id:item
width: pane.contentWidth
implicitHeight: pane.scrollHeight
Row {
id: buttons
spacing: 4
anchors.top: parent.top
anchors.topMargin: 8
anchors.left: parent.left
anchors.leftMargin: 8
HiFiGlyphs {
id: back;
enabled: webview.canGoBack;
text: hifi.glyphs.backward
color: enabled ? hifi.colors.text : hifi.colors.disabledText
size: 48
MouseArea { anchors.fill: parent; onClicked: webview.goBack() }
}
HiFiGlyphs {
id: forward;
enabled: webview.canGoForward;
text: hifi.glyphs.forward
color: enabled ? hifi.colors.text : hifi.colors.disabledText
size: 48
MouseArea { anchors.fill: parent; onClicked: webview.goForward() }
}
HiFiGlyphs {
id: reload;
enabled: webview.canGoForward;
text: webview.loading ? hifi.glyphs.close : hifi.glyphs.reload
color: enabled ? hifi.colors.text : hifi.colors.disabledText
size: 48
MouseArea { anchors.fill: parent; onClicked: webview.goForward() }
}
}
Item {
id: border
height: 48
anchors.top: parent.top
anchors.topMargin: 8
anchors.right: parent.right
anchors.rightMargin: 8
anchors.left: buttons.right
anchors.leftMargin: 8
Item {
id: barIcon
width: parent.height
height: parent.height
Image {
source: webview.icon;
x: (parent.height - height) / 2
y: (parent.width - width) / 2
sourceSize: Qt.size(width, height);
verticalAlignment: Image.AlignVCenter;
horizontalAlignment: Image.AlignHCenter
}
}
TextField {
id: addressBar
anchors.right: parent.right
anchors.rightMargin: 8
anchors.left: barIcon.right
anchors.leftMargin: 0
anchors.verticalCenter: parent.verticalCenter
focus: true
colorScheme: hifi.colorSchemes.dark
placeholderText: "Enter URL"
Component.onCompleted: ScriptDiscoveryService.scriptsModelFilter.filterRegExp = new RegExp("^.*$", "i")
Keys.onPressed: {
switch(event.key) {
case Qt.Key_Enter:
case Qt.Key_Return:
event.accepted = true
if (text.indexOf("http") != 0) {
text = "http://" + text;
}
root.hidePermissionsBar();
root.keyboardRaised = false;
webview.url = text;
break;
}
}
}
}
Rectangle {
id:permissionsContainer
visible:false
color: "#000000"
width: parent.width
anchors.top: buttons.bottom
height:40
z:100
gradient: Gradient {
GradientStop { position: 0.0; color: "black" }
GradientStop { position: 1.0; color: "grey" }
}
RalewayLight {
id: permissionsInfo
anchors.right:permissionsRow.left
anchors.rightMargin: 32
anchors.topMargin:8
anchors.top:parent.top
text: "This site wants to use your microphone/camera"
size: 18
color: hifi.colors.white
}
Row {
id: permissionsRow
spacing: 4
anchors.top:parent.top
anchors.topMargin: 8
anchors.right: parent.right
visible: true
z:101
Button {
id:allow
text: "Allow"
color: hifi.buttons.blue
colorScheme: root.colorScheme
width: 120
enabled: true
onClicked: root.allowPermissions();
z:101
}
Button {
id:block
text: "Block"
color: hifi.buttons.red
colorScheme: root.colorScheme
width: 120
enabled: true
onClicked: root.hidePermissionsBar();
z:101
}
}
}
WebView {
id: webview
url: "https://highfidelity.com/"
profile: FileTypeProfile;
// Create a global EventBridge object for raiseAndLowerKeyboard.
WebEngineScript {
id: createGlobalEventBridge
sourceCode: eventBridgeJavaScriptToInject
injectionPoint: WebEngineScript.Deferred
worldId: WebEngineScript.MainWorld
}
// Detect when may want to raise and lower keyboard.
WebEngineScript {
id: raiseAndLowerKeyboard
injectionPoint: WebEngineScript.Deferred
sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js"
worldId: WebEngineScript.MainWorld
}
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard ]
anchors.top: buttons.bottom
anchors.topMargin: 8
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
onFeaturePermissionRequested: {
if (feature == 2) { // QWebEnginePage::MediaAudioCapture
grantFeaturePermission(securityOrigin, feature, true);
} else {
permissionsBar.securityOrigin = securityOrigin;
permissionsBar.feature = feature;
root.showPermissionsBar();
}
}
onLoadingChanged: {
if (loadRequest.status === WebEngineView.LoadSucceededStatus) {
addressBar.text = loadRequest.url
}
root.loadingChanged(loadRequest.status);
}
onWindowCloseRequested: {
root.destroy();
}
Component.onCompleted: {
webChannel.registerObject("eventBridge", eventBridge);
webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
desktop.initWebviewProfileHandlers(webview.profile);
}
}
} // item
Keys.onPressed: {
switch(event.key) {
case Qt.Key_L:
if (event.modifiers == Qt.ControlModifier) {
event.accepted = true
addressBar.selectAll()
addressBar.forceActiveFocus()
}
break;
}
}
} // dialog

View file

@ -0,0 +1,58 @@
import QtQuick 2.5
import QtWebChannel 1.0
import QtWebEngine 1.5
import controlsUit 1.0
WebView {
id: webview
url: "https://highfidelity.com/"
profile: FileTypeProfile;
property var parentRoot: null
// Create a global EventBridge object for raiseAndLowerKeyboard.
WebEngineScript {
id: createGlobalEventBridge
sourceCode: eventBridgeJavaScriptToInject
injectionPoint: WebEngineScript.Deferred
worldId: WebEngineScript.MainWorld
}
// Detect when may want to raise and lower keyboard.
WebEngineScript {
id: raiseAndLowerKeyboard
injectionPoint: WebEngineScript.Deferred
sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js"
worldId: WebEngineScript.MainWorld
}
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard ]
onFeaturePermissionRequested: {
if (feature == 2) { // QWebEnginePage::MediaAudioCapture
grantFeaturePermission(securityOrigin, feature, true);
} else {
permissionsBar.securityOrigin = securityOrigin;
permissionsBar.feature = feature;
parentRoot.showPermissionsBar();
}
}
onLoadingChanged: {
if (loadRequest.status === WebEngineView.LoadSucceededStatus) {
addressBar.text = loadRequest.url
}
parentRoot.loadingChanged(loadRequest.status);
}
onWindowCloseRequested: {
parentRoot.destroy();
}
Component.onCompleted: {
webChannel.registerObject("eventBridge", eventBridge);
webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
desktop.initWebviewProfileHandlers(webview.profile);
}
}

View file

@ -1,50 +0,0 @@
//
// InfoView.qml
//
// Created by Bradley Austin Davis on 27 Apr 2015
// Copyright 2015 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
import QtQuick 2.5
import Hifi 1.0 as Hifi
import controlsUit 1.0
import "qrc:////qml//windows" as Windows
Windows.ScrollingWindow {
id: root
width: 800
height: 800
resizable: true
Hifi.InfoView {
id: infoView
width: pane.contentWidth
implicitHeight: pane.scrollHeight
WebView {
id: webview
objectName: "WebView"
anchors.fill: parent
url: infoView.url
}
}
Component.onCompleted: {
centerWindow(root);
}
onVisibleChanged: {
if (visible) {
centerWindow(root);
}
}
function centerWindow() {
desktop.centerOnVisible(root);
}
}

View file

@ -1,108 +0,0 @@
//
// QmlWebWindow.qml
//
// Created by Bradley Austin Davis on 17 Dec 2015
// Copyright 2015 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
import QtQuick 2.5
import QtWebEngine 1.1
import QtWebChannel 1.0
import "qrc:////qml//windows" as Windows
import controlsUit 1.0 as Controls
import stylesUit 1.0
Windows.ScrollingWindow {
id: root
HifiConstants { id: hifi }
title: "WebWindow"
resizable: true
shown: false
// Don't destroy on close... otherwise the JS/C++ will have a dangling pointer
destroyOnCloseButton: false
property alias source: webview.url
property alias scriptUrl: webview.userScriptUrl
// This is for JS/QML communication, which is unused in a WebWindow,
// but not having this here results in spurious warnings about a
// missing signal
signal sendToScript(var message);
signal moved(vector2d position);
signal resized(size size);
function notifyMoved() {
moved(Qt.vector2d(x, y));
}
function notifyResized() {
resized(Qt.size(width, height));
}
onXChanged: notifyMoved();
onYChanged: notifyMoved();
onWidthChanged: notifyResized();
onHeightChanged: notifyResized();
onShownChanged: {
keyboardEnabled = HMD.active;
}
Item {
width: pane.contentWidth
implicitHeight: pane.scrollHeight
Controls.WebView {
id: webview
url: "about:blank"
anchors.fill: parent
focus: true
profile: HFWebEngineProfile;
property string userScriptUrl: ""
// Create a global EventBridge object for raiseAndLowerKeyboard.
WebEngineScript {
id: createGlobalEventBridge
sourceCode: eventBridgeJavaScriptToInject
injectionPoint: WebEngineScript.DocumentCreation
worldId: WebEngineScript.MainWorld
}
// Detect when may want to raise and lower keyboard.
WebEngineScript {
id: raiseAndLowerKeyboard
injectionPoint: WebEngineScript.Deferred
sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js"
worldId: WebEngineScript.MainWorld
}
// User script.
WebEngineScript {
id: userScript
sourceUrl: webview.userScriptUrl
injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished.
worldId: WebEngineScript.MainWorld
}
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ]
function onWebEventReceived(event) {
if (event.slice(0, 17) === "CLARA.IO DOWNLOAD") {
ApplicationInterface.addAssetToWorldFromURL(event.slice(18));
}
}
Component.onCompleted: {
webChannel.registerObject("eventBridge", eventBridge);
webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
eventBridge.webEventReceived.connect(onWebEventReceived);
}
}
}
}

View file

@ -0,0 +1,53 @@
import QtQuick 2.5
import QtWebEngine 1.1
import QtWebChannel 1.0
import controlsUit 1.0 as Controls
import stylesUit 1.0
Controls.WebView {
id: webview
url: "about:blank"
anchors.fill: parent
focus: true
profile: HFWebEngineProfile;
property string userScriptUrl: ""
// Create a global EventBridge object for raiseAndLowerKeyboard.
WebEngineScript {
id: createGlobalEventBridge
sourceCode: eventBridgeJavaScriptToInject
injectionPoint: WebEngineScript.DocumentCreation
worldId: WebEngineScript.MainWorld
}
// Detect when may want to raise and lower keyboard.
WebEngineScript {
id: raiseAndLowerKeyboard
injectionPoint: WebEngineScript.Deferred
sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js"
worldId: WebEngineScript.MainWorld
}
// User script.
WebEngineScript {
id: userScript
sourceUrl: webview.userScriptUrl
injectionPoint: WebEngineScript.DocumentReady // DOM ready but page load may not be finished.
worldId: WebEngineScript.MainWorld
}
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard, userScript ]
function onWebEventReceived(event) {
if (event.slice(0, 17) === "CLARA.IO DOWNLOAD") {
ApplicationInterface.addAssetToWorldFromURL(event.slice(18));
}
}
Component.onCompleted: {
webChannel.registerObject("eventBridge", eventBridge);
webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
eventBridge.webEventReceived.connect(onWebEventReceived);
}
}

View file

@ -1,14 +1,13 @@
import QtQuick 2.5 import QtQuick 2.5
import controlsUit 1.0 import controlsUit 1.0
import stylesUit 1.0 import stylesUit 1.0
import "windows" import "windows"
import "."
ScrollingWindow { ScrollingWindow {
id: root id: root
HifiConstants { id: hifi } HifiConstants { id: hifi }
//HifiStyles.HifiConstants { id: hifistyles }
title: "Browser" title: "Browser"
resizable: true resizable: true
destroyOnHidden: true destroyOnHidden: true
@ -30,6 +29,7 @@ ScrollingWindow {
} }
function setProfile(profile) { function setProfile(profile) {
webview.profile = profile;
} }
function showPermissionsBar(){ function showPermissionsBar(){
@ -41,6 +41,7 @@ ScrollingWindow {
} }
function allowPermissions(){ function allowPermissions(){
webview.grantFeaturePermission(permissionsBar.securityOrigin, permissionsBar.feature, true);
hidePermissionsBar(); hidePermissionsBar();
} }
@ -198,10 +199,15 @@ ScrollingWindow {
} }
} }
ProxyWebView { BrowserWebView {
id: webview id: webview
anchors.centerIn: parent parentRoot: root
url: "https://highfidelity.com/"
anchors.top: buttons.bottom
anchors.topMargin: 8
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
} }
} // item } // item

View file

@ -0,0 +1,8 @@
import QtQuick 2.5
import controlsUit 1.0
ProxyWebView {
property var parentRoot: null
function grantFeaturePermission(origin, feature) {}
}

View file

@ -24,7 +24,7 @@ Windows.ScrollingWindow {
width: pane.contentWidth width: pane.contentWidth
implicitHeight: pane.scrollHeight implicitHeight: pane.scrollHeight
ProxyWebView { BaseWebView {
id: webview id: webview
objectName: "WebView" objectName: "WebView"
anchors.fill: parent anchors.fill: parent

View file

@ -11,6 +11,7 @@
import QtQuick 2.5 import QtQuick 2.5
import "windows" as Windows import "windows" as Windows
import "."
import controlsUit 1.0 as Controls import controlsUit 1.0 as Controls
import stylesUit 1.0 import stylesUit 1.0
@ -55,12 +56,8 @@ Windows.ScrollingWindow {
width: pane.contentWidth width: pane.contentWidth
implicitHeight: pane.scrollHeight implicitHeight: pane.scrollHeight
Controls.WebView { QmlWebWindowView {
id: webview id: webview
url: "about:blank"
property string userScriptUrl: ""
anchors.fill: parent
focus: true
} }
} }
} }

View file

@ -0,0 +1,5 @@
import QtQuick 2.5
import controlsUit 1.0
BaseWebView {
}

View file

@ -18,6 +18,7 @@ Rectangle {
property bool safeLoading: false property bool safeLoading: false
property bool loadingLatched: false property bool loadingLatched: false
property bool loading: false
property var loadingRequest: null property var loadingRequest: null

View file

@ -0,0 +1,7 @@
import QtQuick 2.0
import QtWebEngine 1.5
import "../../controls" as Controls
Controls.TabletWebView {
profile: WebEngineProfile { httpUserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}
}

View file

@ -2,7 +2,6 @@ import QtQuick 2.0
import "../../controls" as Controls import "../../controls" as Controls
Controls.TabletWebView { Controls.TabletWebView {
profile: WebEngineProfile { httpUserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}
} }

View file

@ -61,7 +61,8 @@ class Sound : public Resource {
public: public:
Sound(const QUrl& url, bool isStereo = false, bool isAmbisonic = false); Sound(const QUrl& url, bool isStereo = false, bool isAmbisonic = false);
Sound(const Sound& other) : Resource(other), _audioData(other._audioData), _numChannels(other._numChannels) {}
bool isReady() const { return (bool)_audioData; } bool isReady() const { return (bool)_audioData; }
bool isStereo() const { return _audioData ? _audioData->isStereo() : false; } bool isStereo() const { return _audioData ? _audioData->isStereo() : false; }

View file

@ -193,7 +193,8 @@ DiffTraversal::DiffTraversal() {
_path.reserve(MIN_PATH_DEPTH); _path.reserve(MIN_PATH_DEPTH);
} }
DiffTraversal::Type DiffTraversal::prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root) { DiffTraversal::Type DiffTraversal::prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root,
bool forceFirstPass) {
assert(root); assert(root);
// there are three types of traversal: // there are three types of traversal:
// //
@ -212,7 +213,7 @@ DiffTraversal::Type DiffTraversal::prepareNewTraversal(const DiffTraversal::View
Type type; Type type;
// If usesViewFrustum changes, treat it as a First traversal // If usesViewFrustum changes, treat it as a First traversal
if (_completedView.startTime == 0 || _currentView.usesViewFrustums() != _completedView.usesViewFrustums()) { if (forceFirstPass || _completedView.startTime == 0 || _currentView.usesViewFrustums() != _completedView.usesViewFrustums()) {
type = Type::First; type = Type::First;
_currentView.viewFrustums = view.viewFrustums; _currentView.viewFrustums = view.viewFrustums;
_currentView.lodScaleFactor = view.lodScaleFactor; _currentView.lodScaleFactor = view.lodScaleFactor;

View file

@ -61,7 +61,7 @@ public:
DiffTraversal(); DiffTraversal();
Type prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root); Type prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root, bool forceFirstPass = false);
const View& getCurrentView() const { return _currentView; } const View& getCurrentView() const { return _currentView; }

View file

@ -2640,15 +2640,8 @@ bool EntityItem::matchesJSONFilters(const QJsonObject& jsonFilters) const {
static const QString SERVER_SCRIPTS_PROPERTY = "serverScripts"; static const QString SERVER_SCRIPTS_PROPERTY = "serverScripts";
foreach(const auto& property, jsonFilters.keys()) { if (jsonFilters[SERVER_SCRIPTS_PROPERTY] == EntityQueryFilterSymbol::NonDefault) {
if (property == SERVER_SCRIPTS_PROPERTY && jsonFilters[property] == EntityQueryFilterSymbol::NonDefault) { return _serverScripts != ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS;
// check if this entity has a non-default value for serverScripts
if (_serverScripts != ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS) {
return true;
} else {
return false;
}
}
} }
// the json filter syntax did not match what we expected, return a match // the json filter syntax did not match what we expected, return a match

View file

@ -397,8 +397,6 @@ public:
bool isDefined() const { return _defined; } bool isDefined() const { return _defined; }
Texture(TextureUsageType usageType); Texture(TextureUsageType usageType);
Texture(const Texture& buf); // deep copy of the sysmem texture
Texture& operator=(const Texture& buf); // deep copy of the sysmem texture
~Texture(); ~Texture();
Stamp getStamp() const { return _stamp; } Stamp getStamp() const { return _stamp; }
@ -693,8 +691,10 @@ class TextureSource {
public: public:
TextureSource(const QUrl& url, int type = 0) : _imageUrl(url), _type(type) {} TextureSource(const QUrl& url, int type = 0) : _imageUrl(url), _type(type) {}
void setUrl(const QUrl& url) { _imageUrl = url; }
const QUrl& getUrl() const { return _imageUrl; } const QUrl& getUrl() const { return _imageUrl; }
const gpu::TexturePointer getGPUTexture() const { return _gpuTexture; } const gpu::TexturePointer getGPUTexture() const { return _gpuTexture; }
void setType(int type) { _type = type; }
int getType() const { return _type; } int getType() const { return _type; }
void resetTexture(gpu::TexturePointer texture); void resetTexture(gpu::TexturePointer texture);

View file

@ -121,6 +121,7 @@ public:
/// A texture map. /// A texture map.
class Texture { class Texture {
public: public:
QString id; QString id;
QString name; QString name;
QByteArray filename; QByteArray filename;

View file

@ -322,7 +322,7 @@ private:
void GeometryDefinitionResource::setExtra(void* extra) { void GeometryDefinitionResource::setExtra(void* extra) {
const GeometryExtra* geometryExtra = static_cast<const GeometryExtra*>(extra); const GeometryExtra* geometryExtra = static_cast<const GeometryExtra*>(extra);
_mapping = geometryExtra ? geometryExtra->mapping : QVariantHash(); _mapping = geometryExtra ? geometryExtra->mapping : QVariantHash();
_textureBaseUrl = resolveTextureBaseUrl(_url, geometryExtra ? geometryExtra->textureBaseUrl : QUrl()); _textureBaseUrl = geometryExtra ? resolveTextureBaseUrl(_url, geometryExtra->textureBaseUrl) : QUrl();
_combineParts = geometryExtra ? geometryExtra->combineParts : true; _combineParts = geometryExtra ? geometryExtra->combineParts : true;
} }

View file

@ -336,6 +336,7 @@ int networkTexturePointerMetaTypeId = qRegisterMetaType<QWeakPointer<NetworkText
NetworkTexture::NetworkTexture(const QUrl& url, bool resourceTexture) : NetworkTexture::NetworkTexture(const QUrl& url, bool resourceTexture) :
Resource(url), Resource(url),
Texture(),
_maxNumPixels(100) _maxNumPixels(100)
{ {
if (resourceTexture) { if (resourceTexture) {
@ -346,6 +347,7 @@ NetworkTexture::NetworkTexture(const QUrl& url, bool resourceTexture) :
NetworkTexture::NetworkTexture(const NetworkTexture& other) : NetworkTexture::NetworkTexture(const NetworkTexture& other) :
Resource(other), Resource(other),
Texture(other),
_type(other._type), _type(other._type),
_sourceChannel(other._sourceChannel), _sourceChannel(other._sourceChannel),
_currentlyLoadingResourceType(other._currentlyLoadingResourceType), _currentlyLoadingResourceType(other._currentlyLoadingResourceType),
@ -373,7 +375,12 @@ void NetworkTexture::setExtra(void* extra) {
_maxNumPixels = textureExtra ? textureExtra->maxNumPixels : ABSOLUTE_MAX_TEXTURE_NUM_PIXELS; _maxNumPixels = textureExtra ? textureExtra->maxNumPixels : ABSOLUTE_MAX_TEXTURE_NUM_PIXELS;
_sourceChannel = textureExtra ? textureExtra->sourceChannel : image::ColorChannel::NONE; _sourceChannel = textureExtra ? textureExtra->sourceChannel : image::ColorChannel::NONE;
_textureSource = std::make_shared<gpu::TextureSource>(_url, (int)_type); if (_textureSource) {
_textureSource->setUrl(_url);
_textureSource->setType((int)_type);
} else {
_textureSource = std::make_shared<gpu::TextureSource>(_url, (int)_type);
}
_lowestRequestedMipLevel = 0; _lowestRequestedMipLevel = 0;
auto fileNameLowercase = _url.fileName().toLower(); auto fileNameLowercase = _url.fileName().toLower();
@ -533,7 +540,6 @@ void NetworkTexture::makeRequest() {
} else { } else {
qWarning(networking) << "NetworkTexture::makeRequest() called while not in a valid state: " << _ktxResourceState; qWarning(networking) << "NetworkTexture::makeRequest() called while not in a valid state: " << _ktxResourceState;
} }
} }
void NetworkTexture::handleLocalRequestCompleted() { void NetworkTexture::handleLocalRequestCompleted() {

View file

@ -362,7 +362,6 @@ QSharedPointer<Resource> ResourceCache::getResource(const QUrl& url, const QUrl&
resource->moveToThread(qApp->thread()); resource->moveToThread(qApp->thread());
connect(resource.data(), &Resource::updateSize, this, &ResourceCache::updateTotalSize); connect(resource.data(), &Resource::updateSize, this, &ResourceCache::updateTotalSize);
resourcesWithExtraHash.insert(extraHash, resource); resourcesWithExtraHash.insert(extraHash, resource);
removeUnusedResource(resource);
resource->ensureLoading(); resource->ensureLoading();
} }
} }
@ -404,7 +403,7 @@ void ResourceCache::addUnusedResource(const QSharedPointer<Resource>& resource)
// If it doesn't fit or its size is unknown, remove it from the cache. // If it doesn't fit or its size is unknown, remove it from the cache.
if (resource->getBytes() == 0 || resource->getBytes() > _unusedResourcesMaxSize) { if (resource->getBytes() == 0 || resource->getBytes() > _unusedResourcesMaxSize) {
resource->setCache(nullptr); resource->setCache(nullptr);
removeResource(resource->getURL(), resource->getBytes()); removeResource(resource->getURL(), resource->getExtraHash(), resource->getBytes());
resetTotalResourceCounter(); resetTotalResourceCounter();
return; return;
} }
@ -443,7 +442,7 @@ void ResourceCache::reserveUnusedResource(qint64 resourceSize) {
auto size = it.value()->getBytes(); auto size = it.value()->getBytes();
locker.unlock(); locker.unlock();
removeResource(it.value()->getURL(), size); removeResource(it.value()->getURL(), it.value()->getExtraHash(), size);
locker.relock(); locker.relock();
_unusedResourcesSize -= size; _unusedResourcesSize -= size;
@ -489,9 +488,13 @@ void ResourceCache::resetResourceCounters() {
emit dirty(); emit dirty();
} }
void ResourceCache::removeResource(const QUrl& url, qint64 size) { void ResourceCache::removeResource(const QUrl& url, size_t extraHash, qint64 size) {
QWriteLocker locker(&_resourcesLock); QWriteLocker locker(&_resourcesLock);
_resources.remove(url); auto& resources = _resources[url];
resources.remove(extraHash);
if (resources.size() == 0) {
_resources.remove(url);
}
_totalResourcesSize -= size; _totalResourcesSize -= size;
} }
@ -664,7 +667,7 @@ void Resource::allReferencesCleared() {
} else { } else {
if (_cache) { if (_cache) {
// remove from the cache // remove from the cache
_cache->removeResource(getURL(), getBytes()); _cache->removeResource(getURL(), getExtraHash(), getBytes());
_cache->resetTotalResourceCounter(); _cache->resetTotalResourceCounter();
} }

View file

@ -272,7 +272,7 @@ private:
friend class ScriptableResourceCache; friend class ScriptableResourceCache;
void reserveUnusedResource(qint64 resourceSize); void reserveUnusedResource(qint64 resourceSize);
void removeResource(const QUrl& url, qint64 size = 0); void removeResource(const QUrl& url, size_t extraHash, qint64 size = 0);
void resetTotalResourceCounter(); void resetTotalResourceCounter();
void resetUnusedResourceCounter(); void resetUnusedResourceCounter();
@ -419,6 +419,7 @@ public:
virtual void setExtra(void* extra) {}; virtual void setExtra(void* extra) {};
void setExtraHash(size_t extraHash) { _extraHash = extraHash; } void setExtraHash(size_t extraHash) { _extraHash = extraHash; }
size_t getExtraHash() const { return _extraHash; }
signals: signals:
/// Fired when the resource begins downloading. /// Fired when the resource begins downloading.

View file

@ -19,8 +19,8 @@ function(check_test name)
endfunction() endfunction()
if (BUILD_TOOLS) if (BUILD_TOOLS)
# Allow different tools for production builds # Allow different tools for stable builds
if (RELEASE_TYPE STREQUAL "PRODUCTION") if (STABLE_BUILD)
set(ALL_TOOLS set(ALL_TOOLS
udt-test udt-test
vhacd-util vhacd-util

View file

@ -27,13 +27,30 @@ void AWSInterface::createWebPageFromResults(const QString& testResults,
const QString& workingDirectory, const QString& workingDirectory,
QCheckBox* updateAWSCheckBox, QCheckBox* updateAWSCheckBox,
QLineEdit* urlLineEdit) { QLineEdit* urlLineEdit) {
_testResults = testResults;
_workingDirectory = workingDirectory; _workingDirectory = workingDirectory;
// Verify filename is in correct format
// For example `D:/tt/TestResults--2019-02-10_17-30-57(local)[DESKTOP-6BO62Q9].zip`
QStringList parts = testResults.split('/');
QString zipFilename = parts[parts.length() - 1];
QStringList zipFolderNameParts = zipFilename.split(QRegExp("[\\(\\)\\[\\]]"), QString::SkipEmptyParts);
if (!QRegularExpression("TestResults--\\d{4}(-\\d\\d){2}_\\d\\d(-\\d\\d){2}").match(zipFolderNameParts[0]).hasMatch() ||
!QRegularExpression("\\w").match(zipFolderNameParts[1]).hasMatch() || // build (local, build number or PR number)
!QRegularExpression("\\w").match(zipFolderNameParts[2]).hasMatch() // machine name
) {
QMessageBox::critical(0, "Filename is in wrong format", "'" + zipFilename + "' is not in nitpick format");
return;
}
_testResults = testResults;
_urlLineEdit = urlLineEdit; _urlLineEdit = urlLineEdit;
_urlLineEdit->setEnabled(false); _urlLineEdit->setEnabled(false);
extractTestFailuresFromZippedFolder(); QString zipFilenameWithoutExtension = zipFilename.split('.')[0];
extractTestFailuresFromZippedFolder(_workingDirectory + "/" + zipFilenameWithoutExtension);
createHTMLFile(); createHTMLFile();
if (updateAWSCheckBox->isChecked()) { if (updateAWSCheckBox->isChecked()) {
@ -44,14 +61,12 @@ void AWSInterface::createWebPageFromResults(const QString& testResults,
} }
} }
void AWSInterface::extractTestFailuresFromZippedFolder() { void AWSInterface::extractTestFailuresFromZippedFolder(const QString& folderName) {
// For a test results zip file called `D:/tt/TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ].zip` // For a test results zip file called `D:/tt/TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ].zip`
// the folder will be called `TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ]` // the folder will be called `TestResults--2018-10-02_16-54-11(9426)[DESKTOP-PMKNLSQ]`
// and, this folder will be in the working directory // and, this folder will be in the working directory
QStringList parts = _testResults.split('/'); if (QDir(folderName).exists()) {
QString zipFolderName = _workingDirectory + "/" + parts[parts.length() - 1].split('.')[0]; QDir dir = folderName;
if (QDir(zipFolderName).exists()) {
QDir dir = zipFolderName;
dir.removeRecursively(); dir.removeRecursively();
} }

View file

@ -30,7 +30,7 @@ public:
QCheckBox* updateAWSCheckBox, QCheckBox* updateAWSCheckBox,
QLineEdit* urlLineEdit); QLineEdit* urlLineEdit);
void extractTestFailuresFromZippedFolder(); void extractTestFailuresFromZippedFolder(const QString& folderName);
void createHTMLFile(); void createHTMLFile();
void startHTMLpage(QTextStream& stream); void startHTMLpage(QTextStream& stream);

View file

@ -40,7 +40,7 @@ Nitpick::Nitpick(QWidget* parent) : QMainWindow(parent) {
_ui.plainTextEdit->setReadOnly(true); _ui.plainTextEdit->setReadOnly(true);
setWindowTitle("Nitpick - v2.1.1"); setWindowTitle("Nitpick - v2.1.2");
} }
Nitpick::~Nitpick() { Nitpick::~Nitpick() {

View file

@ -835,11 +835,16 @@ void Test::createRecursiveScript(const QString& directory, bool interactiveMode)
<< endl; << endl;
textStream << "Script.include(PATH_TO_THE_REPO_PATH_UTILS_FILE);" << endl << endl; textStream << "Script.include(PATH_TO_THE_REPO_PATH_UTILS_FILE);" << endl << endl;
textStream << "if (typeof nitpick === 'undefined') nitpick = createNitpick(Script.resolvePath(\".\"));" << endl; // The 'depth' variable is used to signal when to start running the recursive scripts
textStream << "if (typeof testsRootPath === 'undefined') testsRootPath = nitpick.getTestsRootPath();" << endl << endl; textStream << "if (typeof depth === 'undefined') {" << endl;
textStream << " depth = 0;" << endl;
textStream << "nitpick.enableRecursive();" << endl; textStream << " nitpick = createNitpick(Script.resolvePath(\".\"));" << endl;
textStream << "nitpick.enableAuto();" << endl << endl; textStream << " testsRootPath = nitpick.getTestsRootPath();" << endl << endl;
textStream << " nitpick.enableRecursive();" << endl;
textStream << " nitpick.enableAuto();" << endl;
textStream << "} else {" << endl;
textStream << " depth++" << endl;
textStream << "}" << endl << endl;
// Now include the test scripts // Now include the test scripts
for (int i = 0; i < directories.length(); ++i) { for (int i = 0; i < directories.length(); ++i) {
@ -847,8 +852,9 @@ void Test::createRecursiveScript(const QString& directory, bool interactiveMode)
} }
textStream << endl; textStream << endl;
textStream << "if (typeof runningRecursive === 'undefined') {" << endl; textStream << "if (depth > 0) {" << endl;
textStream << " runningRecursive = true;" << endl; textStream << " depth--;" << endl;
textStream << "} else {" << endl;
textStream << " nitpick.runRecursive();" << endl; textStream << " nitpick.runRecursive();" << endl;
textStream << "}" << endl << endl; textStream << "}" << endl << endl;
@ -1091,7 +1097,7 @@ void Test::setTestRailCreateMode(TestRailCreateMode testRailCreateMode) {
void Test::createWebPage(QCheckBox* updateAWSCheckBox, QLineEdit* urlLineEdit) { void Test::createWebPage(QCheckBox* updateAWSCheckBox, QLineEdit* urlLineEdit) {
QString testResults = QFileDialog::getOpenFileName(nullptr, "Please select the zipped test results to update from", nullptr, QString testResults = QFileDialog::getOpenFileName(nullptr, "Please select the zipped test results to update from", nullptr,
"Zipped Test Results (*.zip)"); "Zipped Test Results (TestResults--*.zip)");
if (testResults.isNull()) { if (testResults.isNull()) {
return; return;
} }

View file

@ -554,7 +554,7 @@ void TestRunnerDesktop::evaluateResults() {
nitpick->startTestsEvaluation(false, true, _snapshotFolder, _branch, _user); nitpick->startTestsEvaluation(false, true, _snapshotFolder, _branch, _user);
} }
void TestRunnerDesktop::automaticTestRunEvaluationComplete(QString zippedFolder, int numberOfFailures) { void TestRunnerDesktop::automaticTestRunEvaluationComplete(const QString& zippedFolder, int numberOfFailures) {
addBuildNumberToResults(zippedFolder); addBuildNumberToResults(zippedFolder);
restoreHighFidelityAppDataFolder(); restoreHighFidelityAppDataFolder();
@ -580,14 +580,19 @@ void TestRunnerDesktop::automaticTestRunEvaluationComplete(QString zippedFolder,
_runNow->setEnabled(true); _runNow->setEnabled(true);
} }
void TestRunnerDesktop::addBuildNumberToResults(QString zippedFolderName) { void TestRunnerDesktop::addBuildNumberToResults(const QString& zippedFolderName) {
QString augmentedFilename; QString augmentedFilename { zippedFolderName };
if (!_runLatest->isChecked()) { if (!_runLatest->isChecked()) {
augmentedFilename = zippedFolderName.replace("local", getPRNumberFromURL(_url->text())); augmentedFilename.replace("local", getPRNumberFromURL(_url->text()));
} else { } else {
augmentedFilename = zippedFolderName.replace("local", _buildInformation.build); augmentedFilename.replace("local", _buildInformation.build);
}
if (!QFile::rename(zippedFolderName, augmentedFilename)) {
QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Could not rename '" + zippedFolderName + "' to '" + augmentedFilename);
exit(-1);
} }
QFile::rename(zippedFolderName, augmentedFilename);
} }
void TestRunnerDesktop::restoreHighFidelityAppDataFolder() { void TestRunnerDesktop::restoreHighFidelityAppDataFolder() {

View file

@ -61,8 +61,8 @@ public:
void runInterfaceWithTestScript(); void runInterfaceWithTestScript();
void evaluateResults(); void evaluateResults();
void automaticTestRunEvaluationComplete(QString zippedFolderName, int numberOfFailures); void automaticTestRunEvaluationComplete(const QString& zippedFolderName, int numberOfFailures);
void addBuildNumberToResults(QString zippedFolderName); void addBuildNumberToResults(const QString& zippedFolderName);
void copyFolder(const QString& source, const QString& destination); void copyFolder(const QString& source, const QString& destination);