diff --git a/packages/desktop-gui/cypress/integration/project_nav_spec.js b/packages/desktop-gui/cypress/integration/project_nav_spec.js index 33c790fbf2..dd6e51fef8 100644 --- a/packages/desktop-gui/cypress/integration/project_nav_spec.js +++ b/packages/desktop-gui/cypress/integration/project_nav_spec.js @@ -128,13 +128,11 @@ describe('Project Nav', function () { return b.displayName !== 'Chrome' }) - let family = dropdownBrowsers[i].family - - family = family === 'electron' ? 'chrome' : family + let name = dropdownBrowsers[i].name // first one is shown in selection, so skip first cy.wrap($i).should('have.class', - `fa-${family}`) + `browser-icon ./fonts/${name}.svg`) }) }) @@ -150,7 +148,7 @@ describe('Project Nav', function () { it('displays default browser icon in chosen', () => { cy.get('.browsers-list>a').first() - .find('.fa-chrome') + .find('.chrome') }) }) }) @@ -195,8 +193,8 @@ describe('Project Nav', function () { }) it('displays browser icon as spinner', () => { - cy.get('.browsers-list>a').first().find('i') - .should('have.class', 'fas fa-sync-alt fa-spin') + cy.get('.browsers-list>a').find('img') + .should('have.class', 'browser-icon ./fonts/loading.svg') }) it('disables browser dropdown', () => { @@ -213,8 +211,8 @@ describe('Project Nav', function () { }) it('displays browser icon as opened', () => { - cy.get('.browsers-list>a').first().find('i') - .should('have.class', 'fas fa-check-circle') + cy.get('.browsers-list>a').first().find('img') + .should('have.class', 'browser-icon ./fonts/checkmark.svg') }) it('disables browser dropdown', () => { @@ -257,7 +255,7 @@ describe('Project Nav', function () { it('displays default browser icon', () => { cy.get('.browsers-list>a').first() - .find('.fa-chrome') + .find('.chrome') }) }) @@ -277,7 +275,7 @@ describe('Project Nav', function () { it('displays default browser icon', () => { cy.get('.browsers-list>a').first() - .find('.fa-chrome') + .find('.chrome') }) }) }) @@ -301,7 +299,7 @@ describe('Project Nav', function () { it('displays local storage browser icon in chosen', () => { cy.get('.browsers-list>a').first() - .find('.fa-chrome') + .find('.chromium') }) }) @@ -388,6 +386,8 @@ describe('Project Nav', function () { it('displays generic icon', () => { cy.get('.browsers-list>a').first() .should('contain', 'Custom Foo') + .find('.browser-icon').should('have.class', + `browser-icon ./fonts/defaultBrowser.svg`) }) it('pre-selects the custom browser', () => { diff --git a/packages/desktop-gui/src/app/nav.scss b/packages/desktop-gui/src/app/nav.scss index acb96cd55a..91b0e52132 100644 --- a/packages/desktop-gui/src/app/nav.scss +++ b/packages/desktop-gui/src/app/nav.scss @@ -169,26 +169,20 @@ display: inline-block; } - .browser-icon { - color: #4573d9; + .browser-icon { + width: 16px; + height: 16px; } - .chrome > .browser-icon { - color: #1da261; - } - .canary > .browser-icon { - color: #f29b14; - } - .chromium > .browser-icon { - color: #4573d9; - } - .electron > .browser-icon { - color: #2b2e3a; - } - .firefox > .browser-icon { - color: #ff720d; + .selected .browser-icon { + position: relative; + top: -1px; } + .electron .browser-icon { + position: relative; + top: -1px; + } .dropdown-menu { left: auto; @@ -196,6 +190,7 @@ } } + .nav .browser-info { color: #999; margin-left: 6px; diff --git a/packages/desktop-gui/src/dropdown/dropdown.jsx b/packages/desktop-gui/src/dropdown/dropdown.jsx index ebce51d024..d558255493 100644 --- a/packages/desktop-gui/src/dropdown/dropdown.jsx +++ b/packages/desktop-gui/src/dropdown/dropdown.jsx @@ -49,7 +49,7 @@ class Dropdown extends Component { _button () { if (this.props.others.length) { return ( - + {this._buttonContent()} ) diff --git a/packages/desktop-gui/src/project-nav/browsers.jsx b/packages/desktop-gui/src/project-nav/browsers.jsx index 957846c94d..54c1a91d64 100644 --- a/packages/desktop-gui/src/project-nav/browsers.jsx +++ b/packages/desktop-gui/src/project-nav/browsers.jsx @@ -6,6 +6,15 @@ import MarkdownRenderer from '../lib/markdown-renderer' import projectsApi from '../projects/projects-api' +import electron from './icons/electron.svg' +import chrome from './icons/chrome.svg' +import canary from './icons/canary.svg' +import chromium from './icons/chromium.svg' +import loading from './icons/loading.svg' +import checkmark from './icons/checkmark.svg' +import firefox from './icons/firefox.svg' +import defaultBrowser from './icons/defaultBrowser.svg' + @observer export default class Browsers extends Component { render () { @@ -58,19 +67,42 @@ export default class Browsers extends Component { let prefixText if (project.browserState === 'opening') { - icon = 'fas fa-sync-alt fa-spin' + icon = loading prefixText = 'Opening' } else if (project.browserState === 'opened') { - icon = 'fas fa-check-circle green far' + icon = checkmark prefixText = 'Running' } else { - icon = `fab fa-${browser.icon}` + icon = getIcon(browser.name) prefixText = '' } + function getIcon (browserName) { + switch (browserName) { + case 'electron': { + return electron + } + case 'chrome': { + return chrome + } + case 'canary': { + return canary + } + case 'chromium': { + return chromium + } + case 'firefox': { + return firefox + } + default: { + return defaultBrowser + } + } + } + return ( - {' '} + {' '} {prefixText}{' '} {browser.displayName}{' '} {browser.majorVersion} diff --git a/packages/desktop-gui/src/project-nav/icons/canary.svg b/packages/desktop-gui/src/project-nav/icons/canary.svg new file mode 100644 index 0000000000..109007f96e --- /dev/null +++ b/packages/desktop-gui/src/project-nav/icons/canary.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/desktop-gui/src/project-nav/icons/checkmark.svg b/packages/desktop-gui/src/project-nav/icons/checkmark.svg new file mode 100644 index 0000000000..4f1db975db --- /dev/null +++ b/packages/desktop-gui/src/project-nav/icons/checkmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/desktop-gui/src/project-nav/icons/chrome.svg b/packages/desktop-gui/src/project-nav/icons/chrome.svg new file mode 100644 index 0000000000..ef756605fe --- /dev/null +++ b/packages/desktop-gui/src/project-nav/icons/chrome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/desktop-gui/src/project-nav/icons/chromium.svg b/packages/desktop-gui/src/project-nav/icons/chromium.svg new file mode 100644 index 0000000000..e9ecd6a2b1 --- /dev/null +++ b/packages/desktop-gui/src/project-nav/icons/chromium.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/desktop-gui/src/project-nav/icons/defaultBrowser.svg b/packages/desktop-gui/src/project-nav/icons/defaultBrowser.svg new file mode 100644 index 0000000000..2cf9196997 --- /dev/null +++ b/packages/desktop-gui/src/project-nav/icons/defaultBrowser.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/desktop-gui/src/project-nav/icons/electron.svg b/packages/desktop-gui/src/project-nav/icons/electron.svg new file mode 100644 index 0000000000..3a45a11f58 --- /dev/null +++ b/packages/desktop-gui/src/project-nav/icons/electron.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/desktop-gui/src/project-nav/icons/firefox.svg b/packages/desktop-gui/src/project-nav/icons/firefox.svg new file mode 100644 index 0000000000..004dbc7d0c --- /dev/null +++ b/packages/desktop-gui/src/project-nav/icons/firefox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/desktop-gui/src/project-nav/icons/loading.svg b/packages/desktop-gui/src/project-nav/icons/loading.svg new file mode 100644 index 0000000000..5af3cba42d --- /dev/null +++ b/packages/desktop-gui/src/project-nav/icons/loading.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/driver/src/cy/assertions.js b/packages/driver/src/cy/assertions.js index 0e5a613d02..7fde3d5d60 100644 --- a/packages/driver/src/cy/assertions.js +++ b/packages/driver/src/cy/assertions.js @@ -284,7 +284,18 @@ const create = function (state, queue, retryFn) { // assertions if (cmdHasFunctionArg(cmd)) { let index = cmd.get('assertionIndex') - const assertions = cmd.get('assertions') + let assertions = cmd.get('assertions') + + // https://github.com/cypress-io/cypress/issues/4981 + // `assertions` is undefined because assertions added by + // `should` command are not handled yet. + // So, don't increase i and go back to the last command. + if (!assertions) { + i -= 1 + cmd = cmds[i - 1] + index = cmd.get('assertionIndex') + assertions = cmd.get('assertions') + } // always increase the assertionIndex // so our next assertion matches up diff --git a/packages/driver/src/cy/keyboard.ts b/packages/driver/src/cy/keyboard.ts index bf92fdc292..840c69ad5a 100644 --- a/packages/driver/src/cy/keyboard.ts +++ b/packages/driver/src/cy/keyboard.ts @@ -263,7 +263,8 @@ const shouldUpdateValue = (el: HTMLElement, key: KeyDetails, options) => { debug('skipping inserting value since number input would be invalid', key.text, potentialValue) // when typing in a number input, only certain whitelisted chars will insert text if (!key.text.match(isValidNumberInputChar)) { - options.prevVal = '' + // https://github.com/cypress-io/cypress/issues/6055 + // Should not remove old valid values when a new one is not a valid number char, just dismiss it with return return } diff --git a/packages/driver/test/cypress/integration/commands/actions/type_spec.js b/packages/driver/test/cypress/integration/commands/actions/type_spec.js index 76d6f90130..f1942627c8 100644 --- a/packages/driver/test/cypress/integration/commands/actions/type_spec.js +++ b/packages/driver/test/cypress/integration/commands/actions/type_spec.js @@ -1252,6 +1252,13 @@ describe('src/cy/commands/actions/type', () => { .should('have.value', '-123.12') }) + // https://github.com/cypress-io/cypress/issues/6055 + it('can type negative numbers and dismiss invalid characters', () => { + cy.get('#number-without-value') + .type('-a42') + .should('have.value', '-42') + }) + it('can type {del}', () => { cy.get('#number-with-value') .type('{selectAll}{del}') diff --git a/packages/driver/test/cypress/integration/commands/assertions_spec.js b/packages/driver/test/cypress/integration/commands/assertions_spec.js index 4e578a7846..8ecdacda7d 100644 --- a/packages/driver/test/cypress/integration/commands/assertions_spec.js +++ b/packages/driver/test/cypress/integration/commands/assertions_spec.js @@ -211,6 +211,29 @@ describe('src/cy/commands/assertions', () => { }) }) + it('can be chained', () => { + cy.wrap('ab') + .should((subject) => { + expect(subject).to.be.a('string') + expect(subject).to.contain('a') + }) + .should((subject) => { + expect(subject).to.contain('b') + expect(subject).to.have.length(2) + }) + .and((subject) => { + expect(subject).to.eq('ab') + expect(subject).not.to.contain('c') + }) + .then(function () { + expect(this.logs.length).to.eq(8) + + this.logs.slice(1).forEach((log) => { + expect(log.get('name')).to.eq('assert') + }) + }) + }) + context('remote jQuery instances', () => { beforeEach(function () { this.remoteWindow = cy.state('window')