From 14fbd18b4f86feb82f1be497f6003c74ae727f1c Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 19 Oct 2021 12:23:48 +0100 Subject: [PATCH] Merge branch 'master' of https://github.com/ethereum/remix-project into e2epluginapi2 --- .../src/local-plugin/src/app/app.tsx | 8 +- apps/remix-ide-e2e/src/tests/plugin_api.ts | 193 ++++++++++++------ .../assets/css/intro.js/2.7.0/introjs.min.css | 1 + .../assets/css/intro.js/4.1.0/introjs.min.css | 2 + apps/remix-ide/src/remixEngine.js | 2 +- 5 files changed, 136 insertions(+), 70 deletions(-) create mode 100644 apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css create mode 100644 apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index c9cb1d113a..f10251cccd 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -46,7 +46,8 @@ function App () { profiles.map((profile: Profile) => { if (profile.events) { profile.events.map((event: string) => { - client.on(profile.name as any, event, (...args:any) => { + client.on(profile.name as any, event, (...args: any) => { + console.log('event :', event, args) setEvents({ event: event, args: args @@ -67,9 +68,12 @@ function App () { let ob: any = null try { ob = JSON.parse(payload) - } catch (e) {} + if (ob && !Array.isArray(ob)) { ob = [ob] } + } catch (e) { } const args = ob || [payload] + console.log('calling :', profile.name, method, ...args) const result = await client.call(profile.name as any, method, ...args) + console.log('result :', result) setLog(result) } catch (e) { setLog(e.message) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 98c2956045..99867259ed 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -1,6 +1,7 @@ 'use strict' import { ExternalProfile, LocationProfile, Profile } from '@remixproject/plugin-utils' import { NightwatchBrowser } from 'nightwatch' +import { resolve } from 'url' import init from '../helpers/init' declare global { @@ -15,7 +16,7 @@ const localPluginData: Profile & LocationProfile & ExternalProfile = { location: 'sidePanel' } -const getBrowserLogs = function (browser: NightwatchBrowser) { +const getBrowserLogs = async function (browser: NightwatchBrowser) { browser.getLog('browser', (logEntries) => { if (logEntries && logEntries.length > 0) { console.log('Browser log:') @@ -23,37 +24,72 @@ const getBrowserLogs = function (browser: NightwatchBrowser) { } }) } -const debugValues = function (browser: NightwatchBrowser, field: string, expected: string) { - browser.waitForElementVisible(`//*[@id="${field}"]`).getText(`//*[@id="${field}"]`, (result) => { - if (!result.value.toString().includes(expected)) { - console.log('Actual result:') - console.log(result.value.toString()) - console.log('Expected result:') - console.log(expected) - getBrowserLogs(browser) +const debugValues = async function (browser: NightwatchBrowser, field: string, expected: any) { + return new Promise((resolve) => { + if (!expected) { + resolve(true) + return } + browser.waitForElementVisible(`//*[@id="${field}"]`).getText(`//*[@id="${field}"]`, (result) => { + console.log(result) + if (!result.value.toString().includes(expected)) { + console.log('Actual result:') + console.log(result.value.toString()) + console.log('Expected result:') + console.log(expected) + getBrowserLogs(browser) + browser.assert.ok(false, 'Returned value from call does not match expected value.') + } else { + browser.assert.ok(true) + } + resolve(true) + }) }) } -const clickAndCheckLog = function (browser: NightwatchBrowser, buttonText: string, methodResult: any, eventResult: any, payload: any) { - if (payload) { +const setPayload = async (browser: NightwatchBrowser, payload: any) => { + return new Promise((resolve) => { if (typeof payload !== 'string') payload = JSON.stringify(payload) - browser.clearValue('//*[@id="payload"]').setValue('//*[@id="payload"]', payload).pause(1000) - } - if (methodResult && typeof methodResult !== 'string') methodResult = JSON.stringify(methodResult) - if (eventResult && typeof eventResult !== 'string') eventResult = JSON.stringify(eventResult) - browser - .useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`).click(`//*[@data-id='${buttonText}']`) - .pause(2000) - - if (methodResult) { - debugValues(browser, 'methods', methodResult) - browser.waitForElementVisible('//*[@id="methods"]').verify.containsText('//*[@id="methods"]', methodResult) - } - if (eventResult) { - debugValues(browser, 'events', eventResult) - browser.waitForElementVisible('//*[@id="events"]').verify.containsText('//*[@id="events"]', eventResult) + browser.clearValue('//*[@id="payload"]').setValue('//*[@id="payload"]', payload, (result) => { + resolve(result) + }) + }) +} + +const clickButton = async (browser: NightwatchBrowser, buttonText: string) => { + return new Promise((resolve) => { + browser.useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`) + .click(`//*[@data-id='${buttonText}']`) + .pause(2000, () => resolve(true)) + }) +} + +const checkForAcceptAndRemember = async function (browser: NightwatchBrowser) { + return new Promise((resolve) => { + browser.frameParent().element('xpath', '//*[@data-id="modalDialogModalBody"]', (visible:any) => { + if (visible.status && visible.status === -1) { + // @ts-ignore + browser.frame(0, () => { resolve(true) }) + } else { + browser.click('//*[@id="remember"]').click('//*[@id="modal-footer-ok"]', () => { + // @ts-ignore + browser.frame(0, () => { resolve(true) }) + }) + } + }) + }) +} + +const clickAndCheckLog = async (browser: NightwatchBrowser, buttonText: string, methodResult: any, eventResult: any, payload: any) => { + if (payload) { + await setPayload(browser, payload) } + if (methodResult && typeof methodResult !== 'string') { methodResult = JSON.stringify(methodResult) } + if (eventResult && typeof eventResult !== 'string') { eventResult = JSON.stringify(eventResult) } + await clickButton(browser, buttonText) + await checkForAcceptAndRemember(browser) + await debugValues(browser, 'methods', methodResult) + await debugValues(browser, 'events', eventResult) } const assertPluginIsActive = function (browser: NightwatchBrowser, id: string) { @@ -67,7 +103,7 @@ module.exports = { afterEach: function (browser: NightwatchBrowser) { browser.getLog('browser', (logEntries) => { - console.log(logEntries) + // console.log(logEntries) }) }, @@ -79,70 +115,93 @@ module.exports = { // FILESYSTEM - 'Should get current workspace': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) + 'Should get current workspace': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) }, - 'Should get current files': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) + + 'Should get current files': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) }, - 'Should throw error on current file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null, null) + 'Should throw error on current file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null, null) }, - 'Should open readme.txt': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:open', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') + 'Should open readme.txt': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:open', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') }, - 'Should have current file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) + 'Should have current file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) }, - 'Should create dir': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:mkdir', null, null, 'testdir') - clickAndCheckLog(browser, 'fileManager:readdir', 'testdir', null, '/') + 'Should create dir': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:mkdir', null, null, 'testdir') + await clickAndCheckLog(browser, 'fileManager:readdir', 'testdir', null, '/') }, - 'Should get file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:getFile', 'REMIX EXAMPLE PROJECT', null, 'README.txt') + 'Should get file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:getFile', 'REMIX EXAMPLE PROJECT', null, 'README.txt') }, - 'Should close all files': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:closeAllFiles', null, { event: 'noFileSelected', args: [] }, null) + 'Should close all files': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:closeAllFiles', null, { event: 'noFileSelected', args: [] }, null) }, - 'Should switch to file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['contracts/1_Storage.sol'] }, 'contracts/1_Storage.sol') - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null, null) - clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) + 'Should switch to file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['contracts/1_Storage.sol'] }, 'contracts/1_Storage.sol') + await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null, null) + await clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') + await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) }, - 'Should write to file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileSaved', args: ['README.txt'] }, ['README.txt', 'test']) - // @ts-ignore - browser.frameParent().acceptAndRemember(true, true).frame(0) - clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'README.txt') + 'Should write to file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileSaved', args: ['README.txt'] }, ['README.txt', 'test']) + await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'README.txt') + }, + 'Should write to new file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileAdded', args: ['testing.txt'] }, ['testing.txt', 'test']) + await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'testing.txt') + }, + 'Should rename file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:rename', null, null, ['testing.txt', 'testrename.txt']) + await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'testrename.txt') }, - 'Should create workspace': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'testspace') - clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'testspace', isLocalhost: false, absolutePath: '.workspaces/testspace' }, null, null) - clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) + 'Should create empty workspace': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, ['emptyworkspace', false]) + await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'emptyworkspace', isLocalhost: false, absolutePath: '.workspaces/emptyworkspace' }, null, null) + await clickAndCheckLog(browser, 'fileManager:readdir', {}, null, '/') + }, + 'Should create workspace': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'testspace') + await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'testspace', isLocalhost: false, absolutePath: '.workspaces/testspace' }, null, null) + await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) }, // COMPILER - 'Should compile a file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') + 'Should compile a file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') }, - 'Should get compilationresults': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'solidity:getCompilationResult', 'contracts/1_Storage.sol', null, null) + 'Should get compilationresults': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'solidity:getCompilationResult', 'contracts/1_Storage.sol', null, null) }, // DGIT - 'Should have changes on new workspace': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') - clickAndCheckLog(browser, 'dGitProvider:status', [['README.txt', 0, 2, 0], ['contracts/1_Storage.sol', 0, 2, 0], ['contracts/2_Owner.sol', 0, 2, 0], ['contracts/3_Ballot.sol', 0, 2, 0], ['scripts/deploy_ethers.js', 0, 2, 0], ['scripts/deploy_web3.js', 0, 2, 0], ['tests/4_Ballot_test.sol', 0, 2, 0]], null, null) + 'Should have changes on new workspace': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') + await clickAndCheckLog(browser, 'dGitProvider:status', [['README.txt', 0, 2, 0], ['contracts/1_Storage.sol', 0, 2, 0], ['contracts/2_Owner.sol', 0, 2, 0], ['contracts/3_Ballot.sol', 0, 2, 0], ['scripts/deploy_ethers.js', 0, 2, 0], ['scripts/deploy_web3.js', 0, 2, 0], ['tests/4_Ballot_test.sol', 0, 2, 0]], null, null) + }, + + 'Should stage contract': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'dGitProvider:add', null, null, { + filepath: 'contracts/1_Storage.sol' + }) + await clickAndCheckLog(browser, 'dGitProvider:status', [['README.txt', 0, 2, 0], ['contracts/1_Storage.sol', 0, 2, 2], ['contracts/2_Owner.sol', 0, 2, 0], ['contracts/3_Ballot.sol', 0, 2, 0], ['scripts/deploy_ethers.js', 0, 2, 0], ['scripts/deploy_web3.js', 0, 2, 0], ['tests/4_Ballot_test.sol', 0, 2, 0]], null, null) + }, + 'Should commit changes': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'dGitProvider:commit', null, null, { author: { name: 'Remix', email: 'Remix' }, message: 'commit-message' }) + await clickAndCheckLog(browser, 'dGitProvider:log', 'commit-message', null, null) }, // UNIT TESTING - 'Should activate solidityUnitTesting': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') + 'Should activate solidityUnitTesting': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') browser.frameParent() assertPluginIsActive(browser, 'solidityUnitTesting') // @ts-ignore diff --git a/apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css b/apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css new file mode 100644 index 0000000000..4f508ed90c --- /dev/null +++ b/apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css @@ -0,0 +1 @@ +.introjs-overlay{position:absolute;box-sizing:content-box;z-index:999999;background-color:#000;opacity:0;background:-moz-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:-webkit-gradient(radial,center center,0px,center center,100%,color-stop(0%,rgba(0,0,0,0.4)),color-stop(100%,rgba(0,0,0,0.9)));background:-webkit-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:-o-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:-ms-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#66000000',endColorstr='#e6000000',GradientType=1)";-ms-filter:"alpha(opacity=50)";filter:alpha(opacity=50);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1.0!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:white;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{box-sizing:content-box;position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border:1px solid rgba(0,0,0,.5);border-radius:4px;box-shadow:0 2px 15px rgba(0,0,0,.4);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{box-sizing:content-box;position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer *:before,.introjs-helperLayer *:after{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{box-sizing:content-box;position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:bold;color:white;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid white;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid white;content:'';position:absolute}.introjs-arrow.top{top:-10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:white;border-left-color:transparent}.introjs-arrow.top-right{top:-10px;right:10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:white;border-left-color:transparent}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:white;border-left-color:transparent}.introjs-arrow.right{right:-10px;top:10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:white}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:white}.introjs-arrow.bottom{bottom:-10px;border-top-color:white;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.introjs-arrow.left{left:-10px;top:10px;border-top-color:transparent;border-right-color:white;border-bottom-color:transparent;border-left-color:transparent}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-top-color:transparent;border-right-color:white;border-bottom-color:transparent;border-left-color:transparent}.introjs-tooltip{box-sizing:content-box;position:absolute;visibility:visible;padding:10px;background-color:white;min-width:200px;max-width:300px;border-radius:3px;box-shadow:0 1px 10px rgba(0,0,0,.4);-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:.3em .8em;border:1px solid #d4d4d4;margin:0;text-decoration:none;text-shadow:1px 1px 0 #fff;font:11px/normal sans-serif;color:#333;white-space:nowrap;cursor:pointer;outline:0;background-color:#ececec;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f4f4f4),to(#ececec));background-image:-moz-linear-gradient(#f4f4f4,#ececec);background-image:-o-linear-gradient(#f4f4f4,#ececec);background-image:linear-gradient(#f4f4f4,#ececec);-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em;zoom:1;*display:inline;margin-top:10px}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:focus,.introjs-button:active{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:0}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:hover,.introjs-disabled:focus{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center}.introjs-bullets ul{box-sizing:content-box;clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:hover{background:#999}.introjs-bullets ul li a.active{background:#999}.introjs-progress{box-sizing:content-box;overflow:hidden;height:10px;margin:10px 0 5px 0;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{box-sizing:content-box;float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{box-sizing:content-box;position:absolute;background:transparent;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,0.57)}.introjs-hint-pulse{box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,0.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,0.24);z-index:10;position:absolute;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{box-sizing:content-box;border:10px solid rgba(146,146,146,0.36);background:transparent;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:.0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(0.1);opacity:.3}75%{-webkit-transform:scale(0.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:.0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:.0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(0.1);opacity:.3}75%{-moz-transform:scale(0.5);opacity:.5}100%{-moz-transform:scale(1);opacity:.0}}@keyframes introjspulse{0%{transform:scale(0);opacity:.0}25%{transform:scale(0);opacity:.1}50%{transform:scale(0.1);opacity:.3}75%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:.0}} \ No newline at end of file diff --git a/apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css b/apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css new file mode 100644 index 0000000000..d8b1714797 --- /dev/null +++ b/apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css @@ -0,0 +1,2 @@ +@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes introjspulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.introjs-overlay{position:absolute;-webkit-box-sizing:content-box;box-sizing:content-box;z-index:999999;opacity:0;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-showElement{z-index:9999999!important}tr.introjs-showElement>td{z-index:9999999!important;position:relative}tr.introjs-showElement>th{z-index:9999999!important;position:relative}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0}.introjs-relativePosition{position:relative}.introjs-helperLayer{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;z-index:9999998;border-radius:4px;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-helperLayer :before{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-helperLayer :after{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-tooltipReferenceLayer{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif;-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;visibility:hidden;z-index:100000000;background-color:transparent;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-tooltipReferenceLayer *{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif}.introjs-helperNumberLayer{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif;color:#9e9e9e;text-align:center;padding-top:10px;padding-bottom:10px}.introjs-arrow{border:5px solid transparent;content:"";position:absolute}.introjs-arrow.top{top:-10px;left:10px;border-bottom-color:#fff}.introjs-arrow.top-right{top:-10px;right:10px;border-bottom-color:#fff}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-bottom-color:#fff}.introjs-arrow.right{right:-10px;top:10px;border-left-color:#fff}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-left-color:#fff}.introjs-arrow.bottom{bottom:-10px;left:10px;border-top-color:#fff}.introjs-arrow.bottom-right{bottom:-10px;right:10px;border-top-color:#fff}.introjs-arrow.bottom-middle{bottom:-10px;left:50%;margin-left:-5px;border-top-color:#fff}.introjs-arrow.left{left:-10px;top:10px;border-right-color:#fff}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-right-color:#fff}.introjs-tooltip{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;visibility:visible;background-color:#fff;min-width:250px;max-width:300px;border-radius:5px;-webkit-box-shadow:0 3px 30px rgba(33,33,33,.3);box-shadow:0 3px 30px rgba(33,33,33,.3);-webkit-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltiptext{padding:20px}.introjs-tooltip-title{font-size:18px;margin:0;padding:0;font-weight:700;float:left;line-height:32px}.introjs-tooltip-header{padding-left:20px;padding-right:20px;padding-top:10px}.introjs-tooltip-header:after{content:".";visibility:hidden;display:block;height:0;clear:both}.introjs-tooltipbuttons{border-top:1px solid #e0e0e0;padding:10px;text-align:right;white-space:nowrap}.introjs-tooltipbuttons:after{content:"";visibility:hidden;display:block;height:0;clear:both}.introjs-button{-webkit-box-sizing:content-box;box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:.5rem 1rem;border:1px solid #bdbdbd;text-decoration:none;text-shadow:1px 1px 0 #fff;font-size:14px;color:#424242;white-space:nowrap;cursor:pointer;outline:0;background-color:#f4f4f4;border-radius:.2em;zoom:1}.introjs-button:hover{outline:0;text-decoration:none;border-color:#9e9e9e;background-color:#e0e0e0;color:#212121}.introjs-button:focus{outline:0;text-decoration:none;background-color:#eee;-webkit-box-shadow:0 0 0 .2rem rgba(158,158,158,.5);box-shadow:0 0 0 .2rem rgba(158,158,158,.5);border:1px solid #616161;color:#212121}.introjs-button:active{outline:0;text-decoration:none;background-color:#e0e0e0;border-color:#9e9e9e;color:#212121}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{-webkit-box-sizing:content-box;box-sizing:content-box;color:#616161;float:right;font-size:20px;cursor:pointer;font-weight:700;line-height:1;text-align:center;padding:7px 10px}.introjs-skipbutton:focus,.introjs-skipbutton:hover{color:#212121;outline:0;text-decoration:none}.introjs-prevbutton{float:left}.introjs-nextbutton{float:right}.introjs-disabled{color:#9e9e9e;border-color:#bdbdbd;-webkit-box-shadow:none;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-disabled:focus,.introjs-disabled:hover{color:#9e9e9e;border-color:#bdbdbd;-webkit-box-shadow:none;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center;padding-top:10px;padding-bottom:10px}.introjs-bullets ul{-webkit-box-sizing:content-box;box-sizing:content-box;clear:both;margin:0 auto 0;padding:0;display:inline-block}.introjs-bullets ul li{-webkit-box-sizing:content-box;box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{-webkit-transition:width .1s ease-in;-o-transition:width .1s ease-in;transition:width .1s ease-in;-webkit-box-sizing:content-box;box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:focus,.introjs-bullets ul li a:hover{width:15px;background:#999;text-decoration:none;outline:0}.introjs-bullets ul li a.active{width:15px;background:#999}.introjs-progress{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:hidden;height:10px;margin:10px;border-radius:4px;background-color:#e0e0e0}.introjs-progressbar{-webkit-box-sizing:content-box;box-sizing:content-box;float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-pulse{-webkit-box-sizing:content-box;box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,.27);border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;position:absolute;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;animation:none}.introjs-hint-dot{-webkit-box-sizing:content-box;box-sizing:content-box;border:10px solid rgba(146,146,146,.36);background:0 0;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0} +/*# sourceMappingURL=introjs.min.css.map */ \ No newline at end of file diff --git a/apps/remix-ide/src/remixEngine.js b/apps/remix-ide/src/remixEngine.js index fd40429fa1..1ad385146b 100644 --- a/apps/remix-ide/src/remixEngine.js +++ b/apps/remix-ide/src/remixEngine.js @@ -13,7 +13,7 @@ export class RemixEngine extends Engine { if (name === 'dGitProvider') return { queueTimeout: 60000 * 4 } if (name === 'slither') return { queueTimeout: 60000 * 4 } // Requires when a solc version is installed if (name === 'hardhat') return { queueTimeout: 60000 * 4 } - if (name === 'solidityUnitTesting') return { queueTimeout: 60000 * 4 } + if (name === 'localPlugin') return { queueTimeout: 60000 * 4 } return { queueTimeout: 10000 } }