Best JavaScript code snippet using playwright-internal
ReplOptions.js
Source:ReplOptions.js
1// @flow2import { css } from 'glamor';3import React, { Component } from 'react';4import {5 envPresetDefaults,6 pluginConfigs,7 presetPluginConfigs8} from './PluginConfig';9import PresetLoadingAnimation from './PresetLoadingAnimation';10import Svg from './Svg';11import { colors, media } from './styles';12import type {13 EnvConfig,14 PluginConfig,15 PluginState,16 PluginStateMap17} from './types';18type ToggleEnvPresetSetting = (name: string, value: any) => void;19type ToggleExpanded = (isExpanded: boolean) => void;20type ToggleSetting = (name: string, isEnabled: boolean) => void;21type Props = {22 builtIns: boolean,23 className: string,24 debugEnvPreset: boolean,25 envConfig: EnvConfig,26 envPresetState: PluginState,27 isExpanded: boolean,28 lineWrap: boolean,29 onEnvPresetSettingChange: ToggleEnvPresetSetting,30 onIsExpandedChange: ToggleExpanded,31 onSettingChange: ToggleSetting,32 pluginState: PluginStateMap,33 presetState: PluginStateMap,34 runtimePolyfillConfig: PluginConfig,35 runtimePolyfillState: PluginState36};37const ReplOptions = (props: Props) =>38 <div className={`${styles.wrapper} ${props.className}`}>39 {props.isExpanded40 ? <ExpandedContainer {...props} />41 : <CollapsedContainer {...props} />}42 </div>;43export default ReplOptions;44// The choice of Component over PureComponent is intentional here.45// It simplifies the re-use of PluginState objects,46// Without requiring gratuitous use of Object-spread.47class ExpandedContainer extends Component {48 props: Props;49 static defaultProps = {50 className: ''51 };52 render() {53 const {54 builtIns,55 debugEnvPreset,56 envConfig,57 envPresetState,58 lineWrap,59 onIsExpandedChange,60 onSettingChange,61 pluginState,62 presetState,63 runtimePolyfillConfig,64 runtimePolyfillState65 } = this.props;66 const disableEnvSettings =67 !envPresetState.isLoaded || !envConfig.isEnvPresetEnabled;68 return (69 <div className={styles.expandedContainer}>70 <div className={styles.section}>71 <div className={styles.sectionHeader}>Settings</div>72 <PluginToggle73 config={runtimePolyfillConfig}74 label="Evaluate"75 onSettingChange={onSettingChange}76 state={runtimePolyfillState}77 />78 <label className={styles.settingsLabel}>79 <input80 checked={lineWrap}81 onChange={this._onLineWrappingChange}82 className={styles.inputCheckboxLeft}83 type="checkbox"84 />85 Line Wrap86 </label>87 {pluginConfigs.map(config =>88 <PluginToggle89 config={config}90 key={config.package}91 onSettingChange={onSettingChange}92 state={pluginState[config.package]}93 />94 )}95 </div>96 <div className={styles.section}>97 <div className={styles.sectionHeader}>Presets</div>98 {presetPluginConfigs.map(config =>99 <PluginToggle100 config={config}101 key={config.package}102 onSettingChange={onSettingChange}103 state={presetState[config.package]}104 />105 )}106 </div>107 <div className={`${styles.section} ${styles.sectionEnv}`}>108 <label109 className={`${styles.sectionHeader} ${styles.sectionEnvHeader}`}110 >111 {envPresetState.isLoading112 ? <PresetLoadingAnimation />113 : 'Env Preset'}114 <input115 checked={envConfig.isEnvPresetEnabled}116 className={styles.envPresetCheckbox}117 type="checkbox"118 onChange={this._onEnvPresetEnabledChange}119 />120 </label>121 <div className={styles.envPresetColumn}>122 <label123 className={`${styles.envPresetColumnLabel} ${styles.highlight}`}124 >125 Browser126 </label>127 <textarea128 disabled={disableEnvSettings}129 className={styles.envPresetInput}130 onChange={this._onBrowsersChange}131 placeholder={envPresetDefaults.browsers.placeholder}132 value={envConfig.browsers}133 />134 </div>135 <label className={styles.envPresetRow}>136 <span className={`${styles.envPresetLabel} ${styles.highlight}`}>137 Electron138 </span>139 <input140 className={`${styles.envPresetNumber} ${styles.envPresetInput}`}141 disabled={142 !envPresetState.isLoaded ||143 !envConfig.isEnvPresetEnabled ||144 !envConfig.isElectronEnabled145 }146 type="number"147 min={envPresetDefaults.electron.min}148 max={999}149 step={envPresetDefaults.electron.step}150 onChange={this._onElectronChange}151 value={envConfig.electron}152 />153 <input154 checked={envConfig.isElectronEnabled}155 className={styles.envPresetCheckbox}156 disabled={disableEnvSettings}157 onChange={this._onIsElectronEnabledChange}158 type="checkbox"159 />160 </label>161 <label className={styles.envPresetRow}>162 <span className={`${styles.envPresetLabel} ${styles.highlight}`}>163 Node164 </span>165 <input166 className={`${styles.envPresetNumber} ${styles.envPresetInput}`}167 disabled={168 !envPresetState.isLoaded ||169 !envConfig.isEnvPresetEnabled ||170 !envConfig.isNodeEnabled171 }172 type="number"173 min={envPresetDefaults.node.min}174 max={999}175 step={envPresetDefaults.node.step}176 onChange={this._onNodeChange}177 value={envConfig.node}178 />179 <input180 checked={envConfig.isNodeEnabled}181 className={styles.envPresetCheckbox}182 disabled={disableEnvSettings}183 onChange={this._onIsNodeEnabledChange}184 type="checkbox"185 />186 </label>187 <label className={styles.settingsLabel}>188 <input189 checked={builtIns}190 className={styles.inputCheckboxLeft}191 disabled={runtimePolyfillState.isEnabled || disableEnvSettings}192 onChange={this._onBuiltInsChange}193 type="checkbox"194 />195 Built-ins196 </label>197 <label className={styles.settingsLabel}>198 <input199 checked={debugEnvPreset}200 className={styles.inputCheckboxLeft}201 disabled={disableEnvSettings}202 onChange={this._onDebugChange}203 type="checkbox"204 />205 Debug206 </label>207 </div>208 <div209 className={`${styles.closeButton} ${nestedCloseButton}`}210 onClick={() => onIsExpandedChange(false)}211 >212 <Svg213 className={styles.closeButtonIcon}214 path="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z"215 />216 </div>217 </div>218 );219 }220 _onBrowsersChange = (event: SyntheticInputEvent) => {221 this.props.onEnvPresetSettingChange('browsers', event.target.value);222 };223 _onEnvPresetEnabledChange = (event: SyntheticInputEvent) => {224 this.props.onEnvPresetSettingChange(225 'isEnvPresetEnabled',226 event.target.checked227 );228 };229 _onBuiltInsChange = (event: SyntheticInputEvent) => {230 this.props.onSettingChange('builtIns', event.target.checked);231 };232 _onDebugChange = (event: SyntheticInputEvent) => {233 this.props.onSettingChange('debugEnvPreset', event.target.checked);234 };235 _onElectronChange = (event: SyntheticInputEvent) => {236 this.props.onEnvPresetSettingChange(237 'electron',238 parseFloat(event.target.value)239 );240 };241 _onIsElectronEnabledChange = (event: SyntheticInputEvent) => {242 this.props.onEnvPresetSettingChange(243 'isElectronEnabled',244 event.target.checked245 );246 };247 _onIsNodeEnabledChange = (event: SyntheticInputEvent) => {248 this.props.onEnvPresetSettingChange('isNodeEnabled', event.target.checked);249 };250 _onLineWrappingChange = (event: SyntheticInputEvent) => {251 this.props.onSettingChange('lineWrap', event.target.checked);252 };253 _onNodeChange = (event: SyntheticInputEvent) => {254 this.props.onEnvPresetSettingChange('node', parseFloat(event.target.value));255 };256}257type CollapsedContainerProps = {258 onIsExpandedChange: boolean => any259};260const CollapsedContainer = ({ onIsExpandedChange }: CollapsedContainerProps) =>261 <div className={styles.collapsedContainer}>262 <div263 className={`${styles.closeButton} ${nestedCloseButton}`}264 onClick={() => onIsExpandedChange(true)}265 >266 <Svg267 className={styles.closeButtonIcon}268 path="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z"269 />270 </div>271 </div>;272type PluginToggleProps = {273 config: PluginConfig,274 label?: string,275 state: PluginState,276 onSettingChange: ToggleSetting277};278const PluginToggle = ({279 config,280 label,281 state,282 onSettingChange283}: PluginToggleProps) =>284 <label key={config.package} className={styles.settingsLabel}>285 <input286 checked={state.isEnabled && !state.didError}287 className={styles.inputCheckboxLeft}288 disabled={state.isLoading || state.didError}289 onChange={(event: SyntheticInputEvent) =>290 onSettingChange(config.package, event.target.checked)}291 type="checkbox"292 />293 {state.isLoading ? <PresetLoadingAnimation /> : label || config.label}294 </label>;295// Defined separately from styles due to nesting.296const nestedCloseButton = css({});297const styles = {298 wrapper: css({299 position: 'relative',300 overflow: 'visible',301 zIndex: 6,302 backgroundColor: colors.inverseBackground,303 color: colors.inverseForegroundLight,304 transition: 'transform 0.25s ease-in-out',305 [media.large]: {306 height: '100%' // Safari fix for scrolling/overflow307 }308 }),309 collapsedContainer: css({310 backgroundColor: colors.inverseBackground,311 [media.large]: {312 width: '0.5rem',313 height: '100%'314 },315 [media.mediumAndDown]: {316 height: '0.5rem',317 width: '100%'318 },319 [`& .${nestedCloseButton}`]: {320 [media.mediumAndDown]: {321 transition: 'top 0.25s ease-in-out',322 top: '-0.5rem'323 },324 [media.large]: {325 transition: 'left 0.25s ease-in-out',326 left: '-0.5rem'327 }328 },329 '&:hover': {330 [`& .${nestedCloseButton}`]: {331 [media.mediumAndDown]: {332 top: 0333 },334 [media.large]: {335 left: 0336 }337 }338 }339 }),340 expandedContainer: css({341 minWidth: '150px',342 display: 'flex',343 overflow: 'auto',344 boxSshadow:345 'rgba(0, 0, 0, 0.12) 0px 1px 6px, rgba(0, 0, 0, 0.24) 0px 1px 4px',346 [media.large]: {347 flexDirection: 'column',348 height: '100%',349 [`& .${nestedCloseButton}`]: {350 right: '-1.5rem'351 }352 },353 [media.mediumAndDown]: {354 flexDirection: 'row',355 flexWrap: 'wrap',356 overflow: 'auto',357 [`& .${nestedCloseButton}`]: {358 bottom: '-1.5rem'359 }360 }361 }),362 closeButton: css({363 position: 'absolute',364 display: 'flex',365 justifyContent: 'center',366 alignItems: 'center',367 cursor: 'pointer',368 backgroundColor: colors.inverseBackground,369 color: colors.inverseForegroundLight,370 [media.large]: {371 height: '5rem',372 width: '3rem',373 top: 'calc(50% - 3rem)',374 borderTopRightRadius: '5rem',375 borderBottomRightRadius: '5rem'376 },377 [media.mediumAndDown]: {378 height: '3rem',379 width: '5rem',380 left: 'calc(50% - 3rem)',381 borderBottomLeftRadius: '5rem',382 borderBottomRightRadius: '5rem'383 }384 }),385 closeButtonIcon: css({386 width: '2rem',387 height: '2rem',388 [media.mediumAndDown]: {389 transform: 'rotate(90deg)'390 }391 }),392 section: css({393 display: 'flex',394 flexDirection: 'column',395 overflow: 'auto',396 flex: '0 0 auto',397 maxHeight: '100%',398 padding: '1.5rem',399 zIndex: 7,400 [media.mediumAndDown]: {401 flex: '1 0 100px',402 maxHeight: '100%',403 overflow: 'auto'404 }405 }),406 sectionEnv: css({407 borderBottom: 'none',408 borderRight: 'none',409 [media.mediumAndDown]: {410 flex: '1 0 150px'411 }412 }),413 inputCheckboxLeft: css({414 margin: '0 0.75rem 0 0 !important' // TODO (bvaughn) Override input[type="checkbox"] style in main.css415 }),416 highlight: css({417 textTransform: 'uppercase',418 fontSize: '1rem',419 fontWeight: 'bold',420 color: colors.inverseForeground421 }),422 sectionHeader: css({423 flex: '0 0 2.5rem',424 fontSize: '1.5rem',425 fontWeight: 'bold',426 color: colors.inverseForegroundLight427 }),428 sectionEnvHeader: css({429 display: 'flex',430 flexDirection: 'row',431 alignItems: 'center',432 justifyContent: 'space-between'433 }),434 settingsLabel: css({435 flex: '0 0 2.5rem',436 display: 'flex',437 flexDirection: 'row',438 alignItems: 'center',439 margin: '0 -1.5rem',440 padding: '0 1.5rem',441 transition: 'background-color 250ms ease-in-out, color 250ms ease-in-out',442 fontWeight: 'normal',443 '&:hover': {444 backgroundColor: colors.inverseBackgroundDark,445 color: colors.inverseForeground446 }447 }),448 envPresetColumn: css({449 display: 'flex',450 flexDirection: 'column',451 margin: '0.75rem 0',452 flex: '0 0 auto'453 }),454 envPresetColumnLabel: css({455 margin: '0.75rem 0'456 }),457 envPresetRow: css({458 display: 'flex',459 flexDirection: 'row',460 alignItems: 'center',461 flex: '0 0 auto',462 margin: '0.75rem 0'463 }),464 envPresetNumber: css({465 flex: '0 0 4rem',466 maxWidth: '4rem'467 }),468 envPresetCheckbox: css({469 flex: '0 0 auto',470 margin: '0 0 0 0.75rem !important' // TODO (bvaughn) Override input[type="checkbox"] style in main.css471 }),472 envPresetLabel: css({473 flex: 1474 }),475 envPresetInput: css({476 WebkitAppearance: 'none',477 border: 'none',478 borderRadius: '0.25rem',479 '&:disabled': {480 opacity: 0.5481 }482 })...
BeforeInputEventPlugin-test.internal.js
Source:BeforeInputEventPlugin-test.internal.js
1/**2 * Copyright (c) 2013-present, Facebook, Inc.3 *4 * This source code is licensed under the MIT license found in the5 * LICENSE file in the root directory of this source tree.6 *7 * @emails react-core8 */9'use strict';10var React = require('react');11var ReactTestUtils = require('react-dom/test-utils');12var EventMapping = {13 compositionstart: 'topCompositionStart',14 compositionend: 'topCompositionEnd',15 keyup: 'topKeyUp',16 keydown: 'topKeyDown',17 keypress: 'topKeyPress',18 textInput: 'topTextInput',19 textinput: null, // Not defined now20};21describe('BeforeInputEventPlugin', function() {22 var ModuleCache;23 function simulateIE11() {24 document.documentMode = 11;25 window.CompositionEvent = {};26 delete window.TextEvent;27 }28 function simulateWebkit() {29 delete document.documentMode;30 window.CompositionEvent = {};31 window.TextEvent = {};32 }33 function initialize(simulator) {34 // Need to delete cached modules before executing simulator35 jest.resetModules();36 // Initialize variables in the scope of BeforeInputEventPlugin37 simulator();38 // Modules which have dependency on BeforeInputEventPlugin are stored39 // in ModuleCache so that we can use these modules ouside test functions.40 this.ReactDOM = require('react-dom');41 // TODO: can we express this test with only public API?42 this.ReactDOMComponentTree = require('../../client/ReactDOMComponentTree');43 this.SyntheticCompositionEvent = require('../SyntheticCompositionEvent').default;44 this.SyntheticInputEvent = require('../SyntheticInputEvent').default;45 this.BeforeInputEventPlugin = require('../BeforeInputEventPlugin').default;46 }47 function extract(node, eventType, optionalData) {48 var evt = document.createEvent('HTMLEvents');49 evt.initEvent(eventType, true, true);50 evt = Object.assign(evt, optionalData);51 return ModuleCache.BeforeInputEventPlugin.extractEvents(52 EventMapping[eventType],53 ModuleCache.ReactDOMComponentTree.getInstanceFromNode(node),54 evt,55 node,56 );57 }58 function setElementText(node) {59 return args => (node.innerHTML = args);60 }61 function accumulateEvents(node, events) {62 // We don't use accumulateInto module to apply partial application.63 return function() {64 var newArgs = [node].concat(Array.prototype.slice.call(arguments));65 var newEvents = extract.apply(this, newArgs);66 Array.prototype.push.apply(events, newEvents);67 };68 }69 function EventMismatchError(idx, message) {70 this.name = 'EventMismatchError';71 this.message = '[' + idx + '] ' + message;72 }73 EventMismatchError.prototype = Object.create(Error.prototype);74 function verifyEvents(actualEvents, expectedEvents) {75 expect(actualEvents.length).toBe(expectedEvents.length);76 expectedEvents.forEach(function(expected, idx) {77 var actual = actualEvents[idx];78 expect(function() {79 if (actual === null && expected.type === null) {80 // Both are null. Expected.81 } else if (actual === null) {82 throw new EventMismatchError(idx, 'Expected not to be null');83 } else if (84 expected.type === null ||85 !(actual instanceof expected.type)86 ) {87 throw new EventMismatchError(idx, 'Unexpected type: ' + actual);88 } else {89 // Type match.90 Object.keys(expected.data).forEach(function(expectedKey) {91 if (!(expectedKey in actual)) {92 throw new EventMismatchError(idx, 'KeyNotFound: ' + expectedKey);93 } else if (actual[expectedKey] !== expected.data[expectedKey]) {94 throw new EventMismatchError(95 idx,96 'ValueMismatch: ' + actual[expectedKey],97 );98 }99 });100 }101 }).not.toThrow();102 });103 }104 // IE fires an event named `textinput` with all lowercase characters,105 // instead of a standard name `textInput`. As of now, React does not have106 // a corresponding topEvent to IE's textinput, but both events are added to107 // this scenario data for future use.108 var Test_Scenario = [109 // Composition test110 {run: accumulateEvents, arg: ['compositionstart', {data: ''}]},111 {run: accumulateEvents, arg: ['textInput', {data: 'A'}]},112 {run: accumulateEvents, arg: ['textinput', {data: 'A'}]},113 {run: accumulateEvents, arg: ['keyup', {keyCode: 65}]},114 {run: setElementText, arg: ['ABC']},115 {run: accumulateEvents, arg: ['textInput', {data: 'abc'}]},116 {run: accumulateEvents, arg: ['textinput', {data: 'abc'}]},117 {run: accumulateEvents, arg: ['keyup', {keyCode: 32}]},118 {run: setElementText, arg: ['XYZ']},119 {run: accumulateEvents, arg: ['textInput', {data: 'xyz'}]},120 {run: accumulateEvents, arg: ['textinput', {data: 'xyz'}]},121 {run: accumulateEvents, arg: ['keyup', {keyCode: 32}]},122 {run: accumulateEvents, arg: ['compositionend', {data: 'Hello'}]},123 // Emoji test124 {125 run: accumulateEvents,126 arg: ['keypress', {char: '\uD83D\uDE0A', which: 65}],127 },128 {run: accumulateEvents, arg: ['textInput', {data: '\uD83D\uDE0A'}]},129 ];130 /* Defined expected results as a factory of result data because we need131 lazy evaluation for event modules.132 Event modules are reloaded to simulate a different platform per testcase.133 If we define expected results as a simple dictionary here, the comparison134 of 'instanceof' fails after module cache is reset. */135 // Webkit behavior is simple. We expect SyntheticInputEvent at each136 // textInput, SyntheticCompositionEvent at composition, and nothing from137 // keyUp.138 var Expected_Webkit = () => [139 {type: ModuleCache.SyntheticCompositionEvent, data: {}},140 {type: null},141 {type: null},142 {type: ModuleCache.SyntheticInputEvent, data: {data: 'A'}},143 {type: null},144 {type: null}, // textinput of A145 {type: null},146 {type: null}, // keyUp of 65147 {type: null},148 {type: ModuleCache.SyntheticInputEvent, data: {data: 'abc'}},149 {type: null},150 {type: null}, // textinput of abc151 {type: null},152 {type: null}, // keyUp of 32153 {type: null},154 {type: ModuleCache.SyntheticInputEvent, data: {data: 'xyz'}},155 {type: null},156 {type: null}, // textinput of xyz157 {type: null},158 {type: null}, // keyUp of 32159 {type: ModuleCache.SyntheticCompositionEvent, data: {data: 'Hello'}},160 {type: null},161 // Emoji test162 {type: null},163 {type: null},164 {type: null},165 {type: ModuleCache.SyntheticInputEvent, data: {data: '\uD83D\uDE0A'}},166 ];167 // For IE11, we use fallback data instead of IE's textinput events.168 // We expect no SyntheticInputEvent from textinput. Fallback beforeInput is169 // expected to be triggered at compositionend with a text of the target170 // element, not event data.171 var Expected_IE11 = () => [172 {type: ModuleCache.SyntheticCompositionEvent, data: {}},173 {type: null},174 {type: null},175 {type: null}, // textInput of A176 {type: null},177 {type: null}, // textinput of A178 {type: null},179 {type: null}, // keyUp of 65180 {type: null},181 {type: null}, // textInput of abc182 {type: null},183 {type: null}, // textinput of abc184 // fallbackData should NOT be set at keyUp with any of END_KEYCODES185 {type: null},186 {type: null}, // keyUp of 32187 {type: null},188 {type: null}, // textInput of xyz189 {type: null},190 {type: null}, // textinput of xyz191 {type: null},192 {type: null}, // keyUp of 32193 // fallbackData is retrieved from the element, which is XYZ,194 // at a time of compositionend195 {type: ModuleCache.SyntheticCompositionEvent, data: {}},196 {type: ModuleCache.SyntheticInputEvent, data: {data: 'XYZ'}},197 // Emoji test198 {type: null},199 {type: ModuleCache.SyntheticInputEvent, data: {data: '\uD83D\uDE0A'}},200 {type: null},201 {type: null},202 ];203 function TestEditableReactComponent(Emulator, Scenario, ExpectedResult) {204 ModuleCache = new initialize(Emulator);205 class EditableDiv extends React.Component {206 render() {207 return <div contentEditable="true" />;208 }209 }210 var rendered = ReactTestUtils.renderIntoDocument(<EditableDiv />);211 var node = ModuleCache.ReactDOM.findDOMNode(rendered);212 var events = [];213 Scenario.forEach(el => el.run.call(this, node, events).apply(this, el.arg));214 verifyEvents(events, ExpectedResult());215 }216 it('extract onBeforeInput from native textinput events', function() {217 TestEditableReactComponent(simulateWebkit, Test_Scenario, Expected_Webkit);218 });219 it('extract onBeforeInput from fallback objects', function() {220 TestEditableReactComponent(simulateIE11, Test_Scenario, Expected_IE11);221 });...
BeforeInputEventPlugin-test.js
Source:BeforeInputEventPlugin-test.js
1/**2 * Copyright 2013-present, Facebook, Inc.3 * All rights reserved.4 *5 * This source code is licensed under the BSD-style license found in the6 * LICENSE file in the root directory of this source tree. An additional grant7 * of patent rights can be found in the PATENTS file in the same directory.8 *9 * @emails react-core10 */11'use strict';12var React = require('react');13var ReactTestUtils = require('ReactTestUtils');14var EventMapping = {15 compositionstart: 'topCompositionStart',16 compositionend: 'topCompositionEnd',17 keyup: 'topKeyUp',18 keydown: 'topKeyDown',19 textInput: 'topTextInput',20 textinput: null, // Not defined now21};22describe('BeforeInputEventPlugin', function() {23 var ModuleCache;24 function simulateIE11() {25 document.documentMode = 11;26 window.CompositionEvent = {};27 delete window.TextEvent;28 }29 function simulateWebkit() {30 delete document.documentMode;31 window.CompositionEvent = {};32 window.TextEvent = {};33 }34 function initialize(simulator) {35 // Need to delete cached modules before executing simulator36 jest.resetModules();37 // Initialize variables in the scope of BeforeInputEventPlugin38 simulator();39 // Modules which have dependency on BeforeInputEventPlugin are stored40 // in ModuleCache so that we can use these modules ouside test functions.41 this.ReactDOM = require('react-dom');42 this.ReactDOMComponentTree = require('ReactDOMComponentTree');43 this.SyntheticCompositionEvent = require('SyntheticCompositionEvent');44 this.SyntheticInputEvent = require('SyntheticInputEvent');45 this.BeforeInputEventPlugin = require('BeforeInputEventPlugin');46 }47 function extract(node, eventType, optionalData) {48 var evt = document.createEvent('HTMLEvents');49 evt.initEvent(eventType, true, true);50 evt = Object.assign(evt, optionalData);51 return ModuleCache.BeforeInputEventPlugin.extractEvents(52 EventMapping[eventType],53 ModuleCache.ReactDOMComponentTree.getInstanceFromNode(node),54 evt,55 node,56 );57 }58 function setElementText(node) {59 return args => (node.innerHTML = args);60 }61 function accumulateEvents(node, events) {62 // We don't use accumulateInto module to apply partial application.63 return function() {64 var newArgs = [node].concat(Array.prototype.slice.call(arguments));65 var newEvents = extract.apply(this, newArgs);66 Array.prototype.push.apply(events, newEvents);67 };68 }69 function EventMismatchError(idx, message) {70 this.name = 'EventMismatchError';71 this.message = '[' + idx + '] ' + message;72 }73 EventMismatchError.prototype = Object.create(Error.prototype);74 function verifyEvents(actualEvents, expectedEvents) {75 expect(actualEvents.length).toBe(expectedEvents.length);76 expectedEvents.forEach(function(expected, idx) {77 var actual = actualEvents[idx];78 expect(function() {79 if (actual === null && expected.type === null) {80 // Both are null. Expected.81 } else if (actual === null) {82 throw new EventMismatchError(idx, 'Expected not to be null');83 } else if (84 expected.type === null ||85 !(actual instanceof expected.type)86 ) {87 throw new EventMismatchError(idx, 'Unexpected type: ' + actual);88 } else {89 // Type match.90 Object.keys(expected.data).forEach(function(expectedKey) {91 if (!(expectedKey in actual)) {92 throw new EventMismatchError(idx, 'KeyNotFound: ' + expectedKey);93 } else if (actual[expectedKey] !== expected.data[expectedKey]) {94 throw new EventMismatchError(95 idx,96 'ValueMismatch: ' + actual[expectedKey],97 );98 }99 });100 }101 }).not.toThrow();102 });103 }104 // IE fires an event named `textinput` with all lowercase characters,105 // instead of a standard name `textInput`. As of now, React does not have106 // a corresponding topEvent to IE's textinput, but both events are added to107 // this scenario data for future use.108 var Scenario_Composition = [109 {run: accumulateEvents, arg: ['compositionstart', {data: ''}]},110 {run: accumulateEvents, arg: ['textInput', {data: 'A'}]},111 {run: accumulateEvents, arg: ['textinput', {data: 'A'}]},112 {run: accumulateEvents, arg: ['keyup', {keyCode: 65}]},113 {run: setElementText, arg: ['ABC']},114 {run: accumulateEvents, arg: ['textInput', {data: 'abc'}]},115 {run: accumulateEvents, arg: ['textinput', {data: 'abc'}]},116 {run: accumulateEvents, arg: ['keyup', {keyCode: 32}]},117 {run: setElementText, arg: ['XYZ']},118 {run: accumulateEvents, arg: ['textInput', {data: 'xyz'}]},119 {run: accumulateEvents, arg: ['textinput', {data: 'xyz'}]},120 {run: accumulateEvents, arg: ['keyup', {keyCode: 32}]},121 {run: accumulateEvents, arg: ['compositionend', {data: 'Hello'}]},122 ];123 /* Defined expected results as a factory of result data because we need124 lazy evaluation for event modules.125 Event modules are reloaded to simulate a different platform per testcase.126 If we define expected results as a simple dictionary here, the comparison127 of 'instanceof' fails after module cache is reset. */128 // Webkit behavior is simple. We expect SyntheticInputEvent at each129 // textInput, SyntheticCompositionEvent at composition, and nothing from130 // keyUp.131 var Expected_Webkit = () => [132 {type: ModuleCache.SyntheticCompositionEvent, data: {}},133 {type: null},134 {type: null},135 {type: ModuleCache.SyntheticInputEvent, data: {data: 'A'}},136 {type: null},137 {type: null}, // textinput of A138 {type: null},139 {type: null}, // keyUp of 65140 {type: null},141 {type: ModuleCache.SyntheticInputEvent, data: {data: 'abc'}},142 {type: null},143 {type: null}, // textinput of abc144 {type: null},145 {type: null}, // keyUp of 32146 {type: null},147 {type: ModuleCache.SyntheticInputEvent, data: {data: 'xyz'}},148 {type: null},149 {type: null}, // textinput of xyz150 {type: null},151 {type: null}, // keyUp of 32152 {type: ModuleCache.SyntheticCompositionEvent, data: {data: 'Hello'}},153 {type: null},154 ];155 // For IE11, we use fallback data instead of IE's textinput events.156 // We expect no SyntheticInputEvent from textinput. Fallback beforeInput is157 // expected to be triggered at compositionend with a text of the target158 // element, not event data.159 var Expected_IE11 = () => [160 {type: ModuleCache.SyntheticCompositionEvent, data: {}},161 {type: null},162 {type: null},163 {type: null}, // textInput of A164 {type: null},165 {type: null}, // textinput of A166 {type: null},167 {type: null}, // keyUp of 65168 {type: null},169 {type: null}, // textInput of abc170 {type: null},171 {type: null}, // textinput of abc172 // fallbackData should NOT be set at keyUp with any of END_KEYCODES173 {type: null},174 {type: null}, // keyUp of 32175 {type: null},176 {type: null}, // textInput of xyz177 {type: null},178 {type: null}, // textinput of xyz179 {type: null},180 {type: null}, // keyUp of 32181 // fallbackData is retrieved from the element, which is XYZ,182 // at a time of compositionend183 {type: ModuleCache.SyntheticCompositionEvent, data: {}},184 {type: ModuleCache.SyntheticInputEvent, data: {data: 'XYZ'}},185 ];186 function TestEditableReactComponent(Emulator, Scenario, ExpectedResult) {187 ModuleCache = new initialize(Emulator);188 class EditableDiv extends React.Component {189 render() {190 return <div contentEditable="true" />;191 }192 }193 var rendered = ReactTestUtils.renderIntoDocument(<EditableDiv />);194 var node = ModuleCache.ReactDOM.findDOMNode(rendered);195 var events = [];196 Scenario.forEach(el => el.run.call(this, node, events).apply(this, el.arg));197 verifyEvents(events, ExpectedResult());198 }199 it('extract onBeforeInput from native textinput events', function() {200 TestEditableReactComponent(201 simulateWebkit,202 Scenario_Composition,203 Expected_Webkit,204 );205 });206 it('extract onBeforeInput from fallback objects', function() {207 TestEditableReactComponent(208 simulateIE11,209 Scenario_Composition,210 Expected_IE11,211 );212 });...
CreateArticleComponent.js
Source:CreateArticleComponent.js
1// @flow2import * as React from 'react';3import { Component } from 'react-simplified';4import { Category } from '../services';5import { Article } from '../services';6export class AddNewArticleForm extends Component<{7 categories: Category[],8 article: Article,9 addMethod: any,10 formId: string11}> {12 render() {13 this.props.article.important = false;14 return (15 <div className="container container-extra">16 <form id="addForm">17 <div className="form-group imageContainer">18 <img src={this.props.article.image} alt="" className="imagePreviewer" />19 </div>20 <div className="form-group">21 <label htmlFor={this.props.formId}>Image URL</label>22 <input23 className="form-control"24 id="imageAdd"25 type="text"26 placeholder="https://..."27 pattern="https?://.+"28 onChange={(event: SyntheticInputEvent<HTMLInputElement>) => {29 if (this.props.article) this.props.article.image = event.target.value;30 }}31 required32 />33 </div>34 <div className="form-group">35 <label htmlFor="titleAdd">Title</label>36 <input37 className="form-control"38 id="titleAdd"39 type="text"40 placeholder="Title"41 maxLength="100"42 onChange={(event: SyntheticInputEvent<HTMLInputElement>) => {43 if (this.props.article) this.props.article.title = event.target.value;44 }}45 required46 />47 </div>48 <div className="form-group">49 <label htmlFor="bodyAdd">Body</label>50 <textarea51 className="form-control"52 id="bodyAdd"53 type="text"54 placeholder="Enter article body here.."55 cols="30"56 rows="10"57 onChange={(event: SyntheticInputEvent<HTMLInputElement>) => {58 if (this.props.article) this.props.article.body = event.target.value;59 }}60 required61 />62 </div>63 <div className="form-group">64 <div className="input-group mb-3">65 <div className="input-group-prepend">66 <label className="input-group-text" htmlFor="categoryAdd">67 Category68 </label>69 </div>70 <select71 className="custom-select"72 id="categoryAdd"73 onChange={(event: SyntheticInputEvent<HTMLSelectElement>) => {74 if (this.props.article) this.props.article.category = event.target.value;75 }}76 required77 >78 <option selected value="">79 Choose...80 </option>81 {this.props.categories.map(category => (82 <option value={category.category} key={category.category}>83 {category.category}84 </option>85 ))}86 </select>87 </div>88 </div>89 <div className="form-group">90 <label className="form-check-label" htmlFor="importantAdd">91 Front page92 </label>93 <input94 className="form-control"95 id="importantAdd"96 type="checkbox"97 onChange={() => {98 if (this.props.article) this.props.article.important = !this.props.article.important;99 }}100 />101 </div>102 <div className="form-group">103 <input type="submit" className="form-control" value="Save changes" onClick={this.props.addMethod} />104 </div>105 </form>106 </div>107 );108 }...
edithArticle.js
Source:edithArticle.js
1//@flow2import * as React from 'react';3import {Alert, Card} from "./widgets";4import {InputCard} from "./widgets";5import {Component } from 'react-simplified';6import {Article, articleService} from "./article";7import { createHashHistory } from 'history';8const history = createHashHistory();9export class EdithArticle extends Component<{ match: { params: { id_article: number } } }>{10 article : Article = null;11 render() {12 if (!this.article) {13 return null14 } else {15 return (16 <Card>17 <InputCard>18 <input19 type="text"20 className="form-control"21 value={this.article.title}22 onChange={(event: SyntheticInputEvent<HTMLInputElement>) => {23 if (this.article) this.article.title = event.target.value;24 }}25 />26 </InputCard>27 <InputCard>28 <textarea29 type="text"30 className="form-control"31 value={this.article.inngress}32 onChange={(event: SyntheticInputEvent<HTMLInputElement>) => {33 if (this.article) this.article.inngress = event.target.value;34 }}35 />36 </InputCard>37 <InputCard>38 <textarea39 type="text"40 className="form-control"41 value={this.article.text}42 onChange={(event: SyntheticInputEvent<HTMLInputElement>) => {43 if (this.article) this.article.text = event.target.value;44 }}45 />46 </InputCard>47 <InputCard>48 <input49 type="text"50 value={this.article.picture}51 className="form-control"52 onChange={(event: SyntheticInputEvent<HTMLInputElement>) => {53 if (this.article) this.article.picture = event.target.value;54 }}55 />56 </InputCard>57 <InputCard>58 <button type="button" className="btn btn-primary btn-lg" onClick={this.save}>Lagre59 </button>60 </InputCard>61 </Card>62 );63 }64 }65 mounted() {66 console.log(this.props.match.params.id_article);67 articleService68 .getOneArticle(this.props.match.params.id_article)69 .then(article => (this.article = article))70 .catch((error: Error) => console.error(error.message));71 }72 save() {73 console.log(this.article);74 articleService75 .updateArticle(this.article)76 .then(() => {77 history.push("/");78 Alert.success("Sak oppdatert.");79 })80 .catch((error: Error) => Alert.danger(error.message));81 }...
SyntheticInputEvent.js
Source:SyntheticInputEvent.js
...24 * @param {string} dispatchMarker Marker identifying the event target.25 * @param {object} nativeEvent Native browser event.26 * @extends {SyntheticUIEvent}27 */28function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {29 SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);30}31SyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface);...
Form.flow.js
Source:Form.flow.js
1// @flow2/**3 * Type definitions for Form EventHandling4 */5export type Form = {|6 /**7 * Handle Change Event8 */9 +onChange?: (event: SyntheticInputEvent<*>) => mixed,10 /**11 * Handle Input Event12 */13 +onInput?: (event: SyntheticInputEvent<*>) => mixed,14 /**15 * Handle Invalid Input Event16 */17 +onInvalid?: (event: SyntheticInputEvent<*>) => mixed,18 /**19 * Handle Form Submit Event20 */21 +onSubmit?: Function,...
Using AI Code Generation
1const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');2const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');3const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');4const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');5const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');6const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');7const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');8const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');9const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');10const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');11const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');12const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');13const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');14const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');15const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');
Using AI Code Generation
1const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');2const { SyntheticInputEvent } = require('playwright/lib/server/syntheticInputEvents');3const { SyntheticInputEvent } = require('playwright-chromium/lib/server/syntheticInputEvents');4const { SyntheticInputEvent } = require('playwright-firefox/lib/server/syntheticInputEvents');5const { SyntheticInputEvent } = require('playwright-webkit/lib/server/syntheticInputEvents');6const { SyntheticInputEvent } = require('playwright/lib/server/syntheticInputEvents');7const { SyntheticInputEvent } = require('playwright-chromium/lib/server/syntheticInputEvents');8const { SyntheticInputEvent } = require('playwright-firefox/lib/server/syntheticInputEvents');9const { SyntheticInputEvent } = require('playwright-webkit/lib/server/syntheticInputEvents');10const { SyntheticInputEvent } = require('playwright/lib/server/syntheticInputEvents');11const { SyntheticInputEvent } = require('playwright-chromium/lib/server/syntheticInputEvents');12const { SyntheticInputEvent } = require('playwright-firefox/lib/server/syntheticInputEvents');13const { SyntheticInputEvent } = require('playwright-webkit/lib/server/syntheticInputEvents');14const { SyntheticInputEvent } = require('playwright/lib/server/syntheticInputEvents');15const { SyntheticInputEvent } = require('playwright-chromium/lib/server/syntheticInputEvents');16const { SyntheticInputEvent } = require('playwright-fire
Using AI Code Generation
1const { SyntheticInputEvent } = require('playwright/lib/input');2const { devices } = require('playwright/lib/server/deviceDescriptors');3const { chromium } = require('playwright');4(async () => {5 const browser = await chromium.launch();6 const page = await browser.newPage();7 const input = await page.$('input[name="q"]');8 await input.focus();9 await page.dispatchEvent(input, 'input', { value: 'hello world' });10 await browser.close();11})();12const { devices } = require('playwright/lib/server/deviceDescriptors');13const { chromium } = require('playwright');14(async () => {15 const browser = await chromium.launch();16 const page = await browser.newPage();17 const input = await page.$('input[name="q"]');18 await input.focus();19 await input.type('hello world');20 await browser.close();21})();22const { devices } = require('playwright');23const { chromium } = require('playwright');24(async () => {25 const browser = await chromium.launch();26 const page = await browser.newPage();27 const input = await page.$('input[name="q"]');28 await input.focus();29 await input.type('hello world');30 await browser.close();31})();
Using AI Code Generation
1const { SyntheticInputEvent } = require('playwright/lib/webkit/webkit');2const { WebKit } = require('playwright/lib/webkit/webkit');3const { WebKitBrowser } = require('playwright/lib/webkit/webkit');4const webkit = new WebKit();5const browser = await webkit.launch();6const context = await browser.newContext();7const page = await context.newPage();8const event = new SyntheticInputEvent({9 timestamp: Date.now(),10});11await page.dispatchEvent('input', event);12await browser.close();13const { SyntheticInputEvent } = require('playwright/lib/webkit/webkit');14const { WebKit } = require('playwright/lib/webkit/webkit');15const { WebKitBrowser } = require('playwright/lib/webkit/webkit');16const webkit = new WebKit();17const browser = await webkit.launch();18const context = await browser.newContext();19const page = await context.newPage();20const event = new SyntheticInputEvent({21 timestamp: Date.now(),
Using AI Code Generation
1const { SyntheticInputEvent } = require('playwright/lib/server/syntheticInputEvents');2const { Mouse } = require('playwright/lib/server/input');3const { Page } = require('playwright/lib/server/page');4const page = new Page();5const mouse = new Mouse(page);6const event = new SyntheticInputEvent();7const event2 = new SyntheticInputEvent();8event.move(0, 0, 0, 0, 0, 0, 0, 0);9event.down(0, 0, 0, 0, 0, 0, 0, 0);10event.up(0, 0, 0, 0, 0, 0, 0, 0);11event2.move(100, 100, 0, 0, 0, 0, 0, 0);12event2.down(100, 100, 0, 0, 0, 0, 0, 0);13event2.up(100, 100, 0, 0, 0, 0, 0, 0);14mouse.dispatchEvent(event);15mouse.dispatchEvent(event2);16page.close();17browser.close();18browser.close();
Using AI Code Generation
1const { SyntheticInputEvent } = require('@playwright/test/lib/synthetic-input-event');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch({ headless: false });5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.click('input');
Using AI Code Generation
1const { SyntheticInputEvent } = require('playwright/lib/internal/keyboard');2const { Keyboard } = require('playwright/lib/server/input');3const keyboard = new Keyboard();4const event = new SyntheticInputEvent({5 timestamp: Date.now(),6});7keyboard._dispatchEvent(event);8keyboard._dispatchEvent(new SyntheticInputEvent({ type: 'keyup', modifiers: 0, timestamp: Date.now() }));9{10 "scripts": {11 },12 "dependencies": {13 }14}15const { chromium } = require('playwright');16(async () => {17 const browser = await chromium.launch();18 const context = await browser.newContext();19 const page = await context.newPage();20 await page.keyboard.press('a');21 await browser.close();22})();23const { chromium } = require('playwright');24(async () => {25 const browser = await chromium.launch();26 const context = await browser.newContext();27 const page = await context.newPage();28 await page.keyboard.down('a');29 await browser.close();30})();31const { chromium } = require('playwright');32(async () => {33 const browser = await chromium.launch();34 const context = await browser.newContext();
Using AI Code Generation
1const { SyntheticInputEvent } = require('playwright-core/lib/server/syntheticInputEvents');2const { devices } = require('playwright-core');3const { chromium } = require('playwright-core');4const path = require('path');5const { assert } = require('console');6(async () => {7 const browser = await chromium.launch({8 });9 const context = await browser.newContext({10 });11 const page = await context.newPage();12 await page.waitForSelector('input[name="q"]');13 await page.click('input[name="q"]');14 const input = await page.$('input[name="q"]');15 const inputBox = await input.boundingBox();16 const x = (inputBox.x + inputBox.width / 2);17 const y = (inputBox.y + inputBox.height / 2);18 await page.mouse.move(x, y);19 await page.mouse.down();20 await page.mouse.move(x + 10, y + 10);21 await page.mouse.up();22 await page.mouse.click(x, y);23 await page.keyboard.type('test');24 await page.keyboard.press('Enter');25 await page.waitForNavigation();26 await page.screenshot({ path: path.join(__dirname, 'screenshot.png') });27 await browser.close();28})();
Using AI Code Generation
1const { SyntheticInputEvent } = require('playwright/lib/internal/syntheticInputEvents');2const { DeviceDescriptors } = require('playwright/lib/internal/deviceDescriptors');3const { WebKit } = require('playwright/lib/server/webkit/webkit');4const { WebKitBrowser } = require('playwright/lib/server/webkit/webkitBrowser');5const { WebKitBrowserContext } = require('playwright/lib/server/webkit/webkitBrowserContext');6const { WebKitPage } = require('playwright/lib/server/webkit/webkitPage');7const { WebKit } = require('playwright/lib/server/webkit/webkit');8const browser = new WebKitBrowser(webkit);9const browserContext = new WebKitBrowserContext(browser, '123');10const page = new WebKitPage(browserContext, '123');11const event = new SyntheticInputEvent(page, 'pointerdown', {12});13await event.dispatch();14const { Touchscreen } = require('playwright/lib/server/webkit/webkitTouchscreen');15const { WebKit } = require('playwright/lib/server/webkit/webkit');16const { WebKitBrowser } = require('playwright/lib/server/webkit/webkitBrowser');17const { WebKitBrowserContext } = require('playwright/lib/server/webkit/webkitBrowserContext');18const { WebKitPage } = require('playwright/lib/server/webkit/webkitPage');19const { WebKit } = require('playwright/lib/server/webkit/webkit');20const browser = new WebKitBrowser(webkit);21const browserContext = new WebKitBrowserContext(browser, '123');22const page = new WebKitPage(browserContext, '123');23const touchscreen = new Touchscreen(page);24await touchscreen.tap(10, 10);25const { WebKitInput } = require('playwright/lib/server/webkit/webkitInput');26const { WebKit }
Using AI Code Generation
1const { SyntheticInputEvent } = require('playwright/lib/internal/syntheticEvents');2const { Page } = require('playwright/lib/page');3const { BrowserContext } = require('playwright/lib/browserContext');4const { Browser } = require('playwright/lib/browser');5const { BrowserType } = require('playwright/lib/browserType');6const { DeviceDescriptors } = require('playwright/lib/deviceDescriptors');7const browser = await BrowserType.launch({8 });9 const context = await browser.newContext({10 viewport: {11 },12 });13 const page = await context.newPage();14 const handle = await page.$('input[name="q"]');15 const event = new SyntheticInputEvent(handle, {16 });17 await event.send(page);18 await browser.close();19const { SyntheticInputEvent } = require('playwright/lib/internal/syntheticEvents');20const { Page } = require('playwright/lib/page');21const { BrowserContext } = require('playwright/lib/browserContext');22const { Browser } = require('playwright/lib/browser');23const { BrowserType } = require('playwright/lib/browserType');24const { DeviceDescriptors } = require('playwright/lib/deviceDescriptors');25const browser = await BrowserType.launch({
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!