Best JavaScript code snippet using playwright-internal
reconcileChildren.js
Source: reconcileChildren.js
...125 deleteRemainingChildren(returnFiber, child.sibling);126127 // å建ä¸ä¸ªå½åchildçworkInProgress128 var existing = useFiber(child, element.type === REACT_FRAGMENT_TYPE ? element.props.children : element.props, expirationTime);129 existing.ref = coerceRef(returnFiber, child, element);130 existing['return'] = returnFiber;131 {132 existing._debugSource = element._source;133 existing._debugOwner = element._owner;134 }135 return existing;136 } else {137 // keyç¸åï¼typeä¸åï¼æ¸
é¤ææåèç¹138 deleteRemainingChildren(returnFiber, child);139 break;140 }141 } else {142 // å¦ækeyä¸ç¸åï¼ç´æ¥ä»å½åçworkInProgressæ¸
é¤å½åfiberåèç¹ï¼ç»§ç»å¤çä¸ä¸ä¸ªåèç¹143 deleteChild(returnFiber, child);144 }145 child = child.sibling;146 }147148 if (element.type === REACT_FRAGMENT_TYPE) {149 // fragment150 var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);151 created['return'] = returnFiber;152 return created;153 } else {154155 // å建å级 fiber ../Fiber.js156 // æ ¹æ®åç»ä»¶ç±»åå建fiber157 var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);158 // refç¸å
³ææ¶å¿½ç¥159 _created4.ref = coerceRef(returnFiber, currentFirstChild, element);160 // å
³èç¶çº§ fiberï¼æ¨¡æå½æ°æ è°ç¨ï¼å级å½æ°æ§è¡å®æï¼è°ç¨æ è¿åç¶çº§161 _created4['return'] = returnFiber;162 return _created4;163 }164}165166167168// è°åå¤ä¸ªå级fiberçæ´æ°,çç头æè涨æçæç½çç®æ³169// é¦æ¬¡æå
¥çæ¶åï¼ç´æ¥çæåèç¹ï¼æ·»å fiber.index ä¸è§£é170// æ´æ°çæ¶å171// ä»ç¬¬ä¸ä¸ªåèç¹å¼å§å¤çï¼è·æ°çchildListå表ä¸ç第ä¸ä¸ªå
ç´ æ¯è¾ï¼å¦ækeyå¹é
ï¼æ´æ°ï¼å¼å§å¤ç第äºä¸ªèç¹ï¼ä¾æ¬¡ç±»æ¨ï¼ä¸æ¦ä¸å¹é
ï¼è·³åºå¾ªç¯ï¼ä»å½åèç¹å¼å§ååï¼å
¨é¨æ·»å å°Mapå½ä¸ï¼éåmapåå©ä½çchildListï¼åå¨æ¢æ´æ°ï¼ä¸åå¨æ¢æ°å»ºï¼childListéåå®æä¹åï¼å¦æmapå½ä¸è¿åå¨åèç¹ï¼æ·»å å°å é¤å表172function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {173 // This algorithm can't optimize by searching from boths ends since we174 // don't have backpointers on fibers. I'm trying to see how far we can get175 // with that model. If it ends up not being worth the tradeoffs, we can176 // add it later.177178 // Even with a two ended optimization, we'd want to optimize for the case179 // where there are few changes and brute force the comparison instead of180 // going for the Map. It'd like to explore hitting that path first in181 // forward-only mode and only go for the Map once we notice that we need182 // lots of look ahead. This doesn't handle reversal as well as two ended183 // search but that's unusual. Besides, for the two ended optimization to184 // work on Iterables, we'd need to copy the whole set.185186 // In this first iteration, we'll just live with hitting the bad case187 // (adding everything to a Map) in for every insert/move.188189 // If you change this code, also update reconcileChildrenIterator() which190 // uses the same algorithm.191192 {193 // First, validate keys.194 var knownKeys = null;195 for (var i = 0; i < newChildren.length; i++) {196 var child = newChildren[i];197 knownKeys = warnOnInvalidKey(child, knownKeys);198 }199 }200 201 var resultingFirstChild = null;202 var previousNewFiber = null;203204 var oldFiber = currentFirstChild;205 var lastPlacedIndex = 0;206 var newIdx = 0;207 var nextOldFiber = null;208209 // é¦æ¬¡æ¸²æçæ¶å oldFiber为nullï¼å¦å为 returnFiberç第ä¸ä¸ªåèç¹210 // ææfiberæ°å»ºçæ¶å index é½æ¯ 0,åªæå¨ reconcileChildrenArray æ reconcileChildrenIteratorä¹åï¼indexææå¯è½æ´æ¹211 for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {212 // å¦æoldFiberånewFiber index ç¸åæè¾å°ï¼è¯´ææ¯åä¸ä¸ªä½ç½®ï¼ç¸äºæ¯è¾ï¼å¦åè·³åºå¾ªç¯213 if (oldFiber.index > newIdx) {214 nextOldFiber = oldFiber;215 oldFiber = null;216 } else {217 nextOldFiber = oldFiber.sibling;218 }219 // 220 var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);221 if (newFiber === null) {222 // TODO: This breaks on empty slots like null children. That's223 // unfortunate because it triggers the slow path all the time. We need224 // a better way to communicate whether this was a miss or null,225 // boolean, undefined, etc.226 if (oldFiber === null) {227 oldFiber = nextOldFiber;228 }229 break;230 }231 // 232 if (shouldTrackSideEffects) {233 if (oldFiber && newFiber.alternate === null) {234 // We matched the slot, but we didn't reuse the existing fiber, so we235 // need to delete the existing child.236 deleteChild(returnFiber, oldFiber);237 }238 }239 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);240 if (previousNewFiber === null) {241 // TODO: Move out of the loop. This only happens for the first run.242 resultingFirstChild = newFiber;243 } else {244 // TODO: Defer siblings if we're not at the right index for this slot.245 // I.e. if we had null values before, then we want to defer this246 // for each null value. However, we also don't want to call updateSlot247 // with the previous one.248 previousNewFiber.sibling = newFiber;249 }250 previousNewFiber = newFiber;251 oldFiber = nextOldFiber;252 }253254 if (newIdx === newChildren.length) {255 // We've reached the end of the new children. We can delete the rest.256 // å·²ç»å¤çå°æ°çåèç¹æ«å°¾ï¼å°oldFiberååé¢çå
å¼èç¹æ¸
é¤257 deleteRemainingChildren(returnFiber, oldFiber);258 return resultingFirstChild;259 }260261 // 没æåèç¹ï¼æè
oldFiberåå
çå
å¼åèç¹å
¨é¨æ´æ°å®æï¼ä»å½åçnewIndxå¼å§ï¼å°å©ä½çnewChildå
¨é¨æå
¥ï¼å¹¶æç
§å½åçæå
¥é¡ºåºèµå¼ fiber.index262 if (oldFiber === null) {263 // If we don't have any more existing children we can choose a fast path264 // since the rest will all be insertions.265266 // 267 for (; newIdx < newChildren.length; newIdx++) {268 var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);269 if (!_newFiber) {270 continue;271 }272 lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);273 if (previousNewFiber === null) {274 // TODO: Move out of the loop. This only happens for the first run.275 resultingFirstChild = _newFiber;276 } else {277 previousNewFiber.sibling = _newFiber;278 }279 previousNewFiber = _newFiber;280 }281 return resultingFirstChild;282 }283284 // Add all children to a key map for quick lookups.285 var existingChildren = mapRemainingChildren(returnFiber, oldFiber);286287 // Keep scanning and use the map to restore deleted items as moves.288 for (; newIdx < newChildren.length; newIdx++) {289 var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);290 if (_newFiber2) {291 if (shouldTrackSideEffects) {292 if (_newFiber2.alternate !== null) {293 // The new fiber is a work in progress, but if there exists a294 // current, that means that we reused the fiber. We need to delete295 // it from the child list so that we don't add it to the deletion296 // list.297 existingChildren['delete'](_newFiber2.key === null ? newIdx : _newFiber2.key);298 }299 }300 lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);301 if (previousNewFiber === null) {302 resultingFirstChild = _newFiber2;303 } else {304 previousNewFiber.sibling = _newFiber2;305 }306 previousNewFiber = _newFiber2;307 }308 }309310 if (shouldTrackSideEffects) {311 // Any existing children that weren't consumed above were deleted. We need312 // to add them to the deletion list.313 existingChildren.forEach(function (child) {314 return deleteChild(returnFiber, child);315 });316 }317318 return resultingFirstChild;319}320321// ä»mapä¸æ´æ°newChild322function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {323 if (typeof newChild === 'string' || typeof newChild === 'number') {324 // Text nodes don't have keys, so we neither have to check the old nor325 // new node for the key. If both are text nodes, they match.326 var matchedFiber = existingChildren.get(newIdx) || null;327 return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);328 }329330 if (typeof newChild === 'object' && newChild !== null) {331 switch (newChild.$$typeof) {332 case REACT_ELEMENT_TYPE:333 {334 var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;335 if (newChild.type === REACT_FRAGMENT_TYPE) {336 return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);337 }338 return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);339 }340 case REACT_PORTAL_TYPE:341 {342 var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;343 return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime);344 }345 }346347 if (isArray$1(newChild) || getIteratorFn(newChild)) {348 var _matchedFiber3 = existingChildren.get(newIdx) || null;349 return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null);350 }351352 throwOnInvalidObjectType(returnFiber, newChild);353 }354355 {356 if (typeof newChild === 'function') {357 warnOnFunctionType();358 }359 }360361 return null;362 }363364365 // å é¤fiberè°å366 function deleteChild(returnFiber, childToDelete) {367 if (!shouldTrackSideEffects) {368 // Noop.369 return;370 }371 // Deletions are added in reversed order so we add it to the front.372 // At this point, the return fiber's effect list is empty except for373 // deletions, so we can just append the deletion to the list. The remaining374 // effects aren't added until the complete phase. Once we implement375 // resuming, this may not be true.376377 // æå½åçfiberæ·»å å°returnFiberçå¯ä½ç¨é¾æ«å°¾ï¼ç±äºå¨å½åè°åº¦å¨å·¥ä½æ¶é´èç¹ï¼returnFiberçå¯ä½ç¨é¾å°¾ç©ºï¼å¨è°åç»æé¶æ®µï¼å³æ交çåä¸æ¥ï¼æä¼æå©ä½çå¯ä½ç¨æ·»å ï¼å æ¤ï¼å é¤æä½æç»ä¼å¨returnFiberçå¯ä½ç¨é¾é¦é¨378 var last = returnFiber.lastEffect;379 if (last !== null) {380 last.nextEffect = childToDelete;381 returnFiber.lastEffect = childToDelete;382 } else {383 returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;384 }385 childToDelete.nextEffect = null;386 childToDelete.effectTag = Deletion;387 }388389//å建fiberåèç¹390function createChild(returnFiber, newChild, expirationTime) {391 if (typeof newChild === 'string' || typeof newChild === 'number') {392 // Text nodes don't have keys. If the previous node is implicitly keyed393 // we can continue to replace it without aborting even if it is not a text394 // node.395 var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime);396 created['return'] = returnFiber;397 return created;398 }399400 if (typeof newChild === 'object' && newChild !== null) {401 switch (newChild.$$typeof) {402 case REACT_ELEMENT_TYPE:403 {404 var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);405 _created.ref = coerceRef(returnFiber, null, newChild);406 _created['return'] = returnFiber;407 return _created;408 }409 case REACT_PORTAL_TYPE:410 {411 var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);412 _created2['return'] = returnFiber;413 return _created2;414 }415 }416417 if (isArray$1(newChild) || getIteratorFn(newChild)) {418 var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);419 _created3['return'] = returnFiber;420 return _created3;421 }422423 throwOnInvalidObjectType(returnFiber, newChild);424 }425426 {427 if (typeof newChild === 'function') {428 warnOnFunctionType();429 }430 }431432 return null;433}434435// å¤çåfiberçindexï¼æ£ç¡®ä½ç½®ï¼436function placeChild(newFiber, lastPlacedIndex, newIndex) {437 // èµå¼ fiber.index438 newFiber.index = newIndex;439 if (!shouldTrackSideEffects) {440 // ç´æ¥æå
¥ï¼ä¸éè¦ä»»ä½å¤ä½çæä½441 // Noop.442 return lastPlacedIndex;443 }444445 // å¨placeChildæ¹æ³å
ï¼fiberçå建æè
æ´æ°å±æ§é½å·²ç»å®æï¼æ以446 var current = newFiber.alternate;447448 if (current !== null) {449 // æ´æ° currentæ¯ç¨³å®çfiber450451 var oldIndex = current.index;452 if (oldIndex < lastPlacedIndex) {453 // This is a move.454 // éè¦åå移å¨,æ·»å å ä½å¯ä½ç¨455 newFiber.effectTag = Placement;456 return lastPlacedIndex;457 } else {458 // åæ¥ä½ç½®é åï¼ä¸ç¨å¤ç459 // This item can stay in place.460 return oldIndex;461 }462 } else {463 // This is an insertion.464 // æå
¥ 465 newFiber.effectTag = Placement;466 return lastPlacedIndex;467 }468}469470function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {471 // Update the fiber if the keys match, otherwise return null.472473 // å¦ækeyå¹é
ï¼æ´æ°ï¼å
¶ä»æ
åµä¸åå¤ç474475 var key = oldFiber !== null ? oldFiber.key : null;476477 if (typeof newChild === 'string' || typeof newChild === 'number') {478 // Text nodes don't have keys. If the previous node is implicitly keyed479 // we can continue to replace it without aborting even if it is not a text480 // node.481482 // oldFilber åå¨key ï¼å¹¶ä¸ newChild æ¯ææ¬ï¼ç´æ¥è¿åï¼ä¸åå¤ç483 if (key !== null) {484 return null;485 }486 // oldFilber 没ækey ï¼å¹¶ä¸ newChild æ¯ææ¬ï¼ æ´æ°oldFiber487 return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);488 }489490 if (typeof newChild === 'object' && newChild !== null) {491 switch (newChild.$$typeof) {492 // react element493 case REACT_ELEMENT_TYPE:494 {495 // key ç¸åï¼æ´æ°496 if (newChild.key === key) {497 if (newChild.type === REACT_FRAGMENT_TYPE) {498 return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);499 }500 return updateElement(returnFiber, oldFiber, newChild, expirationTime);501 } else {502 // å¦å503 return null;504 }505 }506 case REACT_PORTAL_TYPE:507 {508 if (newChild.key === key) {509 return updatePortal(returnFiber, oldFiber, newChild, expirationTime);510 } else {511 return null;512 }513 }514 }515516 // æ°ç»åèç¹517 if (isArray$1(newChild) || getIteratorFn(newChild)) {518 if (key !== null) {519 return null;520 }521522 return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);523 }524525 throwOnInvalidObjectType(returnFiber, newChild);526 }527528 {529 if (typeof newChild === 'function') {530 warnOnFunctionType();531 }532 }533534 return null;535}536537// æ´æ°fiber538function updateElement(returnFiber, current, element, expirationTime) {539 if (current !== null && current.type === element.type) {540 // Move based on index541 var existing = useFiber(current, element.props, expirationTime);542 existing.ref = coerceRef(returnFiber, current, element);543 existing['return'] = returnFiber;544 {545 existing._debugSource = element._source;546 existing._debugOwner = element._owner;547 }548 return existing;549 } else {550 // Insert551 var created = createFiberFromElement(element, returnFiber.mode, expirationTime);552 created.ref = coerceRef(returnFiber, current, element);553 created['return'] = returnFiber;554 return created;555 }556}557558559function updateTextNode(returnFiber, current, textContent, expirationTime) {560 if (current === null || current.tag !== HostText) {561 // Insert562 var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);563 created['return'] = returnFiber;564 return created;565 } else {566 // Update
...
ReactChildFiber.new.js
Source: ReactChildFiber.new.js
1const isArray = Array.isArray2function coerceRef(3 returnFiber,4 current,5 element,6) {7 const mixedRef = element.ref8 if (9 mixedRef !== null &&10 typeof mixedRef !== 'function' &&11 typeof mixedRef !== 'object'12 ) {13 if (element._owner) {14 const owner = element._owner15 const inst16 if (owner) {17 const ownerFiber = owner18 inst = ownerFiber.stateNode19 }20 const stringRef = '' + mixedRef21 if (22 current !== null &&23 current.ref !== null &&24 typeof current.ref === 'function' &&25 current.ref._stringRef === stringRef26 ) {27 return current.ref28 }29 const ref = function (v) {30 const refs = inst.refs31 if (refs === emptyRefsObject) {32 refs = inst.refs = {}33 }34 if (v === null) {35 delete refs[stringRef]36 } else {37 refs[stringRef] = v38 }39 }40 ref._stringRef = stringRef41 }42 }43 44 return mixedRef45}46function resolveLazy(lazyType) {47 const payload = lazyType._payload48 const init = lazyType._init49 return init(payload)50}51function ChildReconciler(shouldTrackSideEffects) {52 function deleteChild(53 returnFiber,54 childToDelete,55 ) {56 if (!shouldTrackSideEffects) {57 return58 }59 60 const deletions = returnFiber.deletions61 if (deletions === null) {62 returnFiber.deletions = [childToDelete]63 returnFiber.flags |= ChildDeletion64 } else {65 deletions.push(childToDelete)66 }67 }68 function deleteRemainingChildren(69 returnFiber,70 currentFirstChild,71 ) {72 if (!shouldTrackSideEffects) {73 return null74 }75 let childToDelete = currentFirstChild76 while (childToDelete !== null) {77 deleteChild(returnFiber, childToDelete)78 childToDelete = childToDelete.sibling79 }80 return null81 }82 function mapRemainingChildren(83 returnFiber,84 currentFirstChild,85 ) {86 const existingChildren = new Map()87 88 let existingChild = currentFirstChild89 while (existingChild !== null) {90 existingChildren.set(existingChild.key === null ? existingChild.index : existingChild.key)91 existingChild = existingChild.sibling92 }93 return existingChildren94 }95 96 function useFiber(fiber, pendingProps) {97 const clone = createWorkInProgress(fiber, pendingProps)98 clone.index = 099 clone.sibling = null100 return clone101 }102 function placeChild(103 newFiber,104 lastPlacedIndex,105 newIndex,106 ) {107 newFiber.index = newIndex108 if (!shouldTrackSideEffects) {109 return lastPlacedIndex110 }111 const current = newFiber.alternate112 if (current !== null) {113 const oldIndex = current.index114 if (oldIndex < lastPlacedIndex) {115 newFiber.flags |= Placement116 return lastPlacedIndex117 } else {118 return oldIndex119 }120 } else {121 newFiber.flags |= Placement122 return lastPlacedIndex123 }124 }125 function placeSingleChild(126 newFiber,127 ) {128 if (shouldTrackSideEffects && newFiber.alternate === null) {129 newFiber.flags |= Placement130 }131 132 return newFiber133 }134 135 function updateTextNode(136 returnFiber,137 current, // oldFiber138 textContent,139 lanes,140 ) {141 if (current === null || current.tag !== HostText) {142 const created = createFiberFromText(textContent, returnFiber.mode, lanes)143 created.return = returnFiber144 return created145 } else {146 // Update147 const existing = useFiber(current, textContent)148 existing.return = returnFiber149 return existing150 }151 }152 153 function updateElement(154 returnFiber,155 current,156 element,157 lanes,158 ) {159 const elementType = element.type160 161 if (elementType === REACT_FRAGMENT_TYPE) {162 return updateFragment(163 returnFiber,164 current,165 element.props.children,166 lanes,167 element.key,168 )169 }170 171 if (current !== null) {172 if (173 current.elementType === elementType ||174 (enableLazyElements &&175 typeof elementType === 'object' &&176 elementType !== null &&177 elementType.$$typeof === REACT_LAZY_TYPE &&178 resolveLazy(elementType) === current.type)179 ) {180 const existing = useFiber(current, element.props)181 existing.ref = coerceRef(returnFiber, current, element)182 existing.return = returnFiber183 return existing184 }185 }186 187 // Insert188 const created = createFiberFromElement(element, returnFiber.mode, lanes)189 created.ref = coerceRef(returnFiber, current, element)190 created.return = returnFiber191 return created192 }193 194 function updatePortal(195 returnFiber,196 current,197 portal,198 lanes,199 ) {200 if (201 current === null ||202 current.tag !== HostPortal ||203 current.stateNode.containerInfo !== portal.containerInfo ||204 current.stateNode.implementation !== current.stateNode.implementation205 ) {206 // Insert207 const created = createFiberFromPortal(portal, returnFiber.mode, lanes)208 created.return = returnFiber209 return created210 } else {211 // Update212 const existing = useFiber(current, portal.children || [])213 existing.return = returnFiber214 return existing215 }216 }217 function updateFragment(218 returnFiber,219 current,220 fragment,221 lanes,222 key,223 ) {224 if (current === null || current.tag !== Fragment) {225 const created = createFiberFromFragment(226 fragment,227 returnFiber.mode,228 lanes,229 keys,230 )231 created.return = returnFiber232 return created233 } else {234 const existing = useFiber(current, fragment)235 existing.return = returnFiber236 return existing237 }238 }239 240 function updateSlot(241 returnFiber,242 oldFiber,243 newChild,244 lanes,245 ) {246 const key = oldFiber !== null ? oldFiber.key : null;247 248 if (typeof newChild === 'string' || typeof newChild === 'number') {249 // Text nodes don't have keys. If the previous node is implicitly keyed250 // we can continue to replace it without aborting even if it is not a text251 // node.252 253 // implicitly å«èçï¼éå¼ç254 if (key !== null) {255 return null256 }257 return updateTextNode(returnFiber, oldFiber, '' + newChild, lanes)258 }259 260 if (typeof newChild === 'object' && newChild !== null) {261 switch (newChild.$$typeof) {262 case REACT_ELEMENT_TYPE:263 if (newChild.key === key) {264 return updateElement(returnFiber, oldFiber, newChild, lanes)265 } else {266 return null267 }268 case REACT_PORTAL_TYPE:269 if (newChild.key === key) {270 return updatePortal(returnFiber, oldFiber, newChild, lanes)271 } else {272 return null273 }274 case REACT_LAZY_TYPE:275 if (enableLazyElements) {276 const payload = newChild._payload277 const init = newChild._init278 return updateSlot(returnFiber, oldFiber, init(payload), lanes)279 }280 }281 if (isArray(newChild) || getIteratorFn(newChild)) {282 if (key !== null) {283 return null;284 }285 286 return updateFragment(returnFiber, oldFiber, newChild, lanes, null)287 }288 }289 290 return null291 }292 function createChild(293 returnFiber,294 newChild,295 lanes,296 ) {297 if (typeof newChild === 'string' || typeof newChild === 'number') {298 const created = createFiberFromText(299 '' + newChild,300 returnFiber.mode,301 lanes302 )303 created.return = returnFiber304 return created305 }306 if (typeof newChild === 'object' && newChild !== null) {307 switch (newChild.$$typeof) {308 case REACT_ELEMENT_TYPE:309 const created = createFiberFromElement(310 newChild,311 returnFiber.mode,312 lanes,313 )314 created.ref = coerceRef(returnFiber, null, newChild)315 created.return = returnFiber316 return created317 case REACT_FRAGMENT_TYPE:318 const created = createFiberFromFragment(319 newChild,320 returnFiber.mode,321 lanes,322 )323 created.return = returnFiber324 return created325 case REACT_LAZY_TYPE:326 const payload = newChild._payload327 const init = newChild._init328 return createChild(returnFiber, init(payload), lanes)329 }330 }331 if (isArray(newChild) || getIterator(newChild)) {332 const created = createFiberFromFragment(333 newChild,334 returnFiber.mode,335 lanes,336 null337 )338 created.return = returnFiber339 return created340 }341 return null342 }343 function updateFromMap(344 existingChildren,345 returnFiber,346 newIdx,347 newChild,348 lanes,349 ) {350 if (typeof newChild === 'string' || typeof newChild === 'number') {351 const matchedFiber = existingChildren.get(newIdx) || null352 return updateTextNode(returnFiber, matchedFiber, '' + newChild, lanes)353 }354 if (typeof newChild === 'object' && newChild !== null) {355 const matchedFiber = existingChildren.get(356 newChild.key === null ? newIdx : newChild.key,357 ) || null358 359 switch (newChild.$$typeof) {360 case REACT_ELEMENT_TYPE:361 return updateElement(returnFiber, matchedFiber, newChild, lanes)362 case REACT_PORTAL_TYPE:363 return updatePortal(returnFiber, matchedFiber, newChild, lanes,)364 case REACT_LAZY_TYPE:365 if (enableLazyElements) {366 const payload = newChild._payload367 const init = newChild._init368 369 return updateFromMap(370 existingChildren,371 returnFiber,372 newIdx,373 init(payload),374 lanes,375 )376 }377 }378 }379 380 if (isArray(newChild) || getIterator(newChild)) {381 const matchedFiber = existingChildren.get(newIdx) || null382 return updateFragment(returnFiber, matchedFiber, newChild, lanes, null)383 }384 return null385 }386 387 function reconcileChildrenArray(388 returnFiber,389 currentFirstChild, // å¼å¤´ç oldChild 390 newChildren, // æ°ç children391 lanes, // 轨迹392 ) {393 let resultingFirstChild = null // è¿åç Child394 let previousNewFiber = null // ä¹åç newChild395 396 let oldFiber = currentFirstChild // å½åæä½ç oldChild397 let lastPlacedIndex = 0 // æåä¸æ¬¡æä½æ¿æ¢åç index398 let newIdx = 0399 let nextOldFiber = null400 for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {401 if (oldFiber.index > newIdx) {402 nextOldFiber = oldFiber403 oldFiber = null404 } else {405 nextOldFiber = oldFiber.sibling406 }407 const newFiber = updateSlot(408 returnFiber,409 oldFiber,410 newChildren[newIdx],411 lanes412 )413 if (newFiber === null) {414 if (oldFiber === null) {415 oldFiber = nextOldFiber416 }417 418 break419 }420 if (shouldTrackSideEffects) {421 if (oldFiber && newFiber.alternate === null) {422 deleteChild(returnFiber, oldFiber)423 }424 }425 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx)426 if (previousNewFiber === null) {427 resultingFirstChild = newFiber428 } else {429 previousNewFiber.sibling = newFiber430 }431 previousNewFiber = newFiber432 oldFiber = nextOldFiber433 }434 435 if (newIdx === newChildren.length) {436 deleteRemainingChildren(returnFiber, oldFiber)437 return resultingFirstChild438 }439 if (oldFiber === null) {440 for (; newIdx < newChildren.length; newIdx++) {441 const newFiber = createChild(returnFiber, newChildren[newIdx], lanes)442 if (newFiber === null) {443 continue444 }445 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx)446 if (previousNewFiber === null) {447 resultingFirstChild = newFiber448 } else {449 previousNewFiber.sibling = newFiber450 }451 previousNewFiber = newFiber452 }453 return resultingFirstChild454 }455 456 const existingChildren = mapRemainingChildren(returnFiber, oldFiber)457 for (; newIdx < newChildren.length; newIdx++) {458 const newFiber = updateFromMap(459 existingChildren,460 returnFiber,461 newIdx,462 newChildren[newIdx],463 lanes,464 )465 if (newFiber === null) {466 if (shouldTrackSideEffects) {467 if (newFiber.alternate !== null) {468 existingChildren.delete(newFiber.key === null ? newIdx : newFiber.key)469 }470 }471 }472 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx)473 if (previousNewFiber === null) {474 resultingFirstChild = newFiber475 } else {476 previousNewFiber.sibling = newFiber477 }478 previousNewFiber = newFiber479 }480 481 if (shouldTrackSideEffects) {482 existingChildren.forEach(child => deleteChild(returnFiber, child))483 }484 485 return resultingFirstChild486 }487 function reconcileChildrenIterator(488 returnFiber,489 currentFirstChild,490 newChildrenIterable,491 lanes,492 ) {493 const iteratorFn = getIteratorFn(newChildrenIterable)494 const newChildren = iteratorFn.call(newChildrenIterable)495 // ...496 }497 function reconcileSingleTextNode(498 returnFiber,499 currentFirstChild,500 textContent,501 lanes,502 ) {503 if (currentFirstChild !== null && currentFirstChild.tag === HostText) {504 deleteRemainingChildren(returnFiber, currentFirstChild.sibling)505 const existing = useFiber(currentFirstChild, textContent)506 existing.return = returnFiber507 return existing508 }509 deleteRemainingChildren(returnFiber, currentFirstChild)510 const created = createFiberFromText(textContent, returnFiber.mode, lanes)511 created.return = returnFiber512 return created513 }514 function reconcileSingleElement(515 returnFiber,516 currentFirstChild,517 element,518 lanes,519 ) {520 const key = element.key521 let child = currentFirstChild522 while (child !== null) {523 const elementType = element.type;524 if (child.key === key) {525 const elementType = element.type526 if (elementType === REACT_FRAGMENT_TYPE) {527 if (child.tag === Fragment) {528 deleteRemainingChildren(returnFiber, child.sibling)529 const existing = useFiber(child, element.props.children)530 existing.return = returnFiber531 return existing532 }533 } else {534 if (535 child.elementType === elementType ||536 (537 enableLazyElements &&538 elementType !== null &&539 element.$$typeof === REACT_LAZY_TYPE &&540 resolveLazy(elementType).type === child.type541 )542 ) {543 deleteRemainingChildren(returnFiber, child.sibling)544 const existing = useFiber(child, element.props)545 existing.ref = coerceRef(returnFiber, child, element)546 existing.return = returnFiber547 return existing548 }549 }550 deleteRemainingChildren(returnFiber, child)551 break552 } else {553 deleteChild(returnFiber, child) 554 }555 }556 if (element.type === REACT_FRAGMENT_TYPE) {557 const created = createFiberFromFragment(558 element.props.children,559 returnFiber.mode,560 lanes,561 element.key,562 )563 created.return = returnFiber564 return created565 } else {566 const created = createFiberFromElement(567 element,568 returnFiber.mode,569 lanes,570 )571 created.ref = coerceRef(returnFiber, currentFirstChild, element)572 created.return = returnFiber573 return created574 }575 }576 function reconcileSinglePortal(577 returnFiber,578 currentFirstChild,579 portal,580 lanes,581 ) {582 const key = portal.key583 let child = currentFirstChild584 while (child !== null) {585 if (child.key === key) {...
ReactChildFiber.js
Source: ReactChildFiber.js
...158 default: {159 if (child.elementType === element.type) {160 deleteRemainingChildren(returnFiber, child.sibling);161 const existing = useFiber(child, element.props);162 existing.ref = coerceRef(returnFiber, child, element);163 existing.return = returnFiber;164 return existing;165 }166 break;167 }168 }169 deleteRemainingChildren(returnFiber, child);170 break;171 } else {172 deleteChild(returnFiber, child);173 }174 child = child.sibling;175 }176 if (element.type === REACT_FRAGMENT_TYPE) {177 const created = createFiberFromFragment(178 element.props.children,179 returnFiber.mode,180 lanes,181 element.key182 );183 created.return = returnFiber;184 return created;185 } else {186 const created = createFiberFromElement(element, returnFiber.mode, lanes);187 created.ref = coerceRef(returnFiber, currentFirstChild, element);188 created.return = returnFiber;189 return created;190 }191 };192 const reconcileSingleTextNode = (193 returnFiber,194 currentFirstChild,195 textContent,196 lanes197 ) => {198 if (currentFirstChild !== null && currentFirstChild.tag === HostText) {199 deleteRemainingChildren(returnFiber, currentFirstChild.sibling);200 const existing = useFiber(currentFirstChild, textContent);201 existing.return = returnFiber;202 return existing;203 }204 deleteRemainingChildren(returnFiber, currentFirstChild);205 const created = createFiberFromText(textContent, returnFiber.mode, lanes);206 created.return = returnFiber;207 return created;208 };209 const updateTextNode = (returnFiber, current, textContent, lanes) => {210 if (current === null || current.tag !== HostText) {211 const created = createFiberFromText(textContent, returnFiber.mode, lanes);212 created.return = returnFiber;213 return created;214 } else {215 const existing = useFiber(current, textContent);216 existing.return = returnFiber;217 return existing;218 }219 };220 const updateFragment = (returnFiber, current, fragment, lanes, key) => {221 if (current === null || current.tag !== Fragment) {222 const created = createFiberFromFragment(223 fragment,224 returnFiber.mode,225 lanes,226 key227 );228 created.return = returnFiber;229 return created;230 } else {231 const existing = useFiber(current, fragment);232 existing.return = returnFiber;233 return existing;234 }235 };236 const updateSlot = (returnFiber, oldFiber, newChild, lanes) => {237 const key = oldFiber !== null ? oldFiber.key : null;238 if (typeof newChild === 'string' || typeof newChild === 'number') {239 if (key !== null) {240 return null;241 }242 return updateTextNode(returnFiber, oldFiber, '' + newChild, lanes);243 }244 if (typeof newChild === 'object' && newChild !== null) {245 switch (newChild.$$typeof) {246 case REACT_ELEMENT_TYPE: {247 if (newChild.key === key) {248 if (newChild.type === REACT_FRAGMENT_TYPE) {249 return updateFragment(250 returnFiber,251 oldFiber,252 newChild.props.children,253 lanes,254 key255 );256 }257 return updateElement(returnFiber, oldFiber, newChild, lanes);258 } else {259 return null;260 }261 }262 case REACT_LAZY_TYPE: {263 const payload = newChild._payload;264 const init = newChild._init;265 return updateSlot(returnFiber, oldFiber, init(payload), lanes);266 }267 }268 if (Array.isArray(newChild) || getIteratorFn(newChild)) {269 if (key !== null) return null;270 return updateFragment(returnFiber, oldFiber, newChild, lanes, null);271 }272 }273 return null;274 };275 const placeChild = (newFiber, lastPlacedIndex, newIndex) => {276 newFiber.index = newIndex;277 if (!shouldTrackSideEffects) return lastPlacedIndex;278 const current = newFiber.alternate;279 if (current !== null) {280 const oldIndex = current.index;281 if (oldIndex < lastPlacedIndex) {282 newFiber.flags = Placement;283 return lastPlacedIndex;284 } else {285 return oldIndex;286 }287 } else {288 newFiber.flags = Placement;289 return lastPlacedIndex;290 }291 };292 const createChild = (returnFiber, newChild, lanes) => {293 if (typeof newChild === 'string' || typeof newChild === 'number') {294 const created = createFiberFromText(295 '' + newChild,296 returnFiber.mode,297 lanes298 );299 created.return = returnFiber;300 return created;301 }302 if (typeof newChild === 'object' && newChild !== null) {303 switch (newChild.$$typeof) {304 case REACT_ELEMENT_TYPE: {305 const created = createFiberFromElement(306 newChild,307 returnFiber.mode,308 lanes309 );310 created.ref = coerceRef(returnFiber, null, newChild);311 created.return = returnFiber;312 return created;313 }314 case REACT_LAZY_TYPE: {315 const payload = newChild._payload;316 const init = newChild._init;317 return createChild(returnFiber, init(payload), lanes);318 }319 }320 if (Array.isArray(newChild) || getIteratorFn(newChild)) {321 const created = createFiberFromFragment(322 newChild,323 returnFiber.mode,324 lanes,325 null326 );327 created.return = returnFiber;328 return created;329 }330 }331 return null;332 };333 const mapRemainingChildren = (returnFiber, currentFirstChild) => {334 const existingChildren = new Map();335 let existingChild = currentFirstChild;336 while (existingChild !== null) {337 if (existingChild.key !== null) {338 existingChildren.set(existingChild.key, existingChild);339 } else {340 existingChildren.set(existingChild.index, existingChild);341 }342 existingChild = existingChild.sibling;343 }344 return existingChildren;345 };346 const reconcileChildrenArray = (347 returnFiber,348 currentFirstChild,349 newChildren,350 lanes351 ) => {352 let resultingFirstChild = null;353 let previousNewFiber = null;354 let oldFiber = currentFirstChild;355 let lastPlacedIndex = 0;356 let newIdx = 0;357 let nextOldFiber = null;358 for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {359 if (oldFiber.index > newIdx) {360 nextOldFiber = oldFiber;361 oldFiber = null;362 } else {363 nextOldFiber = oldFiber.sibling;364 }365 const newFiber = updateSlot(366 returnFiber,367 oldFiber,368 newChildren[newIdx],369 lanes370 );371 if (newFiber === null) {372 if (oldFiber === null) {373 oldFiber = nextOldFiber;374 }375 break;376 }377 if (shouldTrackSideEffects) {378 if (oldFiber && newFiber.alternate === null) {379 deleteChild(returnFiber, oldFiber);380 }381 }382 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);383 if (previousNewFiber === null) {384 resultingFirstChild = newFiber;385 } else {386 previousNewFiber.sibling = newFiber;387 }388 previousNewFiber = newFiber;389 oldFiber = nextOldFiber;390 }391 if (newIdx === newChildren.length) {392 deleteRemainingChildren(returnFiber, oldFiber);393 return resultingFirstChild;394 }395 if (oldFiber === null) {396 for (; newIdx < newChildren.length; newIdx++) {397 const newFiber = createChild(returnFiber, newChildren[newIdx], lanes);398 if (newFiber === null) {399 continue;400 }401 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);402 if (previousNewFiber === null) {403 resultingFirstChild = newFiber;404 } else {405 previousNewFiber.sibling = newFiber;406 }407 previousNewFiber = newFiber;408 }409 return resultingFirstChild;410 }411 const existingChildren = mapRemainingChildren(returnFiber, oldFiber);412 for (; newIdx < newChildren.length; newIdx++) {413 const newFiber = updateFromMap(414 existingChildren,415 returnFiber,416 newIdx,417 newChildren[newIdx],418 lanes419 );420 if (newFiber !== null) {421 if (shouldTrackSideEffects) {422 if (newFiber.alternate !== null) {423 existingChildren.delete(424 newFiber.key === null ? newIdx : newFiber.key425 );426 }427 }428 lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);429 if (previousNewFiber === null) {430 resultingFirstChild = newFiber;431 } else {432 previousNewFiber.sibling = newFiber;433 }434 previousNewFiber = newFiber;435 }436 }437 if (shouldTrackSideEffects) {438 existingChildren.forEach((child) => deleteChild(returnFiber, child));439 }440 return resultingFirstChild;441 };442 const updateElement = (returnFiber, current, element, lanes) => {443 if (current !== null) {444 if (current.elementType === element.type) {445 const existing = useFiber(current, element.props);446 existing.ref = coerceRef(returnFiber, current, element);447 existing.return = returnFiber;448 return existing;449 }450 }451 const created = createFiberFromElement(element, returnFiber.mode, lanes);452 created.ref = coerceRef(returnFiber, current, element);453 created.return = returnFiber;454 return created;455 };456 const updateFromMap = (457 existingChildren,458 returnFiber,459 newIdx,460 newChild,461 lanes462 ) => {463 if (typeof newChild === 'string' || typeof newChild === 'number') {464 const matchedFiber = existingChildren.get(newIdx) || null;465 return updateTextNode(returnFiber, matchedFiber, '' + newChild, lanes);466 }...
react-diff.js
Source: react-diff.js
...18 deleteRemainingChildren(returnFiber, child.sibling);19 // å¤ç¨childèç¹20 const existing = useFiber(child, newChild.props);21 // æ´æ°å¤ç¨èç¹çrefåreturn22 existing.ref = coerceRef(returnFiber, child, newChild);23 existing.return = returnFiber;24 return existing;25 } else {26 deleteRemainingChildren(returnFiber, child);27 break;28 }29 } else {30 // keyä¸åçæ
åµï¼å é¤child31 deleteChild(returnFiber, child);32 }33 child = child.sibling;34 }35 // åèç¹ä¸æ²¡æç¸åèç¹çæ
åµ36 const created = createFiberFromElement(newChild, returnFiber.mode);37 created.ref = coerceRef(returnFiber, currentFirstChild, newChild);38 created.return = returnFiber;39 return created;40}41// æ°å
ç´ ä¸ºææ¬èç¹42function reconcileSingleTextNode(returnFiber, currentFirstChild, textConent) {43 if (currentFirstChild !== null && currentFirstChild.tag === HostText) {44 deleteRemainingChildren(returnFiber, currentFirstChild.sibling);45 // å¤ç¨ç¬¬ä¸ä¸ªèç¹46 const existing = useFiber(currentFirstChild, textConent);47 existing.return = returnFiber;48 return existing;49 }50 deleteRemainingChildren(returnFiber, currentFirstChild);51 const created = createFiberFromText(textConent, returnFiber.mode);52 created.return = returnFiber;53 return created;54}55function placeChild(newFiber, lastPlacedIndex, newIdx) {56 newFiber.index = newIndex;57 if (!shouldTrackSideEffects) {58 return lastPlacedIndex;59 }60 const current = newFiber.alternate; // current== null,该èç¹ä¸ºæ°å¢èç¹61 if (current !== null) {62 // current !== null 表示æ´æ°ï¼åå¨å·²æèç¹63 const oldIndex = current.index;64 if (oldIndex < lastPlacedIndex) {65 newFiber.flags = Placement;66 return lastPlacedIndex;67 } else {68 // 该项ä¾ç¶çå¨èä½ç½®69 return oldIndex;70 }71 } else {72 newFiber.flags = Placement;73 return lastPlacedIndex;74 }75}76function updateTextNode(returnFiber, current, textContent) {77 // currentèç¹ä¸æ¯å¯å¤ç¨çææ¬èç¹78 if (current === null || current.tag !== HostText) {79 // éè¿textContentå建ææ¬èç¹Fiber80 const created = createFiberFromText(textContent, returnFiber.mode);81 created.return = returnFiber;82 return created;83 } else {84 // æ¾å°å¯å¤ç¨çææ¬èç¹äºï¼åå¤ç¨85 const existing = useFiber(current, textContent); // å¤ç¨ææ¬èç¹86 existing.return = returnFiber;87 return existing;88 }89}90function updateElement(returnFiber, current, element) {91 if (current !== null) {92 if (current.elementType === element.type) {93 const existing = useFiber(current, element.props); // å¤ç¨èç¹94 existing.ref = coerceRef(returnFiber, current, element);95 existing.return = returnFiber;96 return existing;97 }98 }99 // æ°èç¹100 const created = createFiberFromElement(element, returnFiber.mode);101 created.ref = coerceRef(returnFiber, current, element);102 created.return = returnFiber;103 return created;104}105// å°ææèèç¹æ·»å å°Map对象ä¸106function mapRemainingChildren(returnFiber, currentFirstChild) {107 const existingChildren = new Map();108 let existingChild = currentFirstChild;109 while (existingChild !== null) {110 // key ä¸ä¸ºnull å
ç´ èç¹111 if (existingChild.key !== null) {112 existingChildren.set(existingChild.key, existingChild);113 } else {114 // ä¸åå¨key å使ç¨index代æ¿115 existingChildren.set(existingChild.index, existingChild);116 }117 existingChild = existingChild.sibling;118 }119 return existingChildren;120}121function updateFromMap(existingChildren, returnFiber, newIdx, newChild) {122 // æ°èç¹æ¯ææ¬èç¹123 if (typeof newChild === 'string' || typeof newChild === 'number') {124 const matchedFiber = existingChildren.get(newIdx) || null; // æ¾indexç¸åçèç¹å¤ç¨125 return updateTextNode(returnFiber, matchedFiber, '' + newChild);126 }127 // newChildæ¯å
ç´ èç¹çæ
åµ128 if (typeof newChild === 'object' && newChild !== null) {129 if (newChild.$$typeof === REACT_ELEMENT_TYPE) {130 const matchedFiber =131 existingChildren.get(newChild.key ? newChild.key : newChild.index) ||132 null;133 // è¿åæ´æ°åçå
ç´ èç¹134 return updateElement(returnFiber, matchedFiber, newChild);135 }136 }137 return null;138}139function createChild(returnFiber, newChild) {140 // å¤çææ¬èç¹141 if (typeof newChild === 'string' || typeof newChild === 'number') {142 const created = createFiberFromText('' + newChild, returnFiber.mode);143 created.return = returnFiber;144 return created;145 }146 // å¤çå
ç´ èç¹147 if (typeof newChild === 'object' && newChild !== null) {148 if (newChild.$$typeof === REACT_ELEMENT_TYPE) {149 const created = createFiberFromElement(newChild, returnFiber.mode);150 created.ref = coerceRef(returnFiber, null, newChild);151 created.return = returnFiber;152 return created;153 }154 }155 return null;156}157function createFiberFromText(content, mode) {158 const fiber = createFiber(HostText, content, null);159 return fiber;160}161function createFiberFromElement(element, mode) {162 let owner = null;163 const type = element.type;164 const key = element.key;165 const pendingProps = element.props;166 const fiber = createFiberFromTypeAndProps(167 type,168 key,169 pendingProps,170 owner,171 mode172 );173 return fiber;174}175function coerceRef(returnFiber, current, element) {176 return element.ref;177}178// æ°èç¹æ¯å
å«å¤ä¸ªèç¹çæ°ç»179function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren) {180 let resultingFirstChild = null;181 let previousNewFiber = null;182 let oldFiber = currentFirstChild;183 let lastPlacedIndex = 0;184 let newIdx = 0;185 let nextOldFiber = null;186 // 第ä¸æ¬¡éåï¼å¯¹æ¯åä½ç½®çèç¹æ¯å¦ä¸æ ·187 for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {188 if (oldFiber.index > newIdx) {189 nextOldFiber = oldFiber;...
defaults.js
Source: defaults.js
...32 var gdMock = {_fullLayout: fullLayout};33 for(var i = 0; i < 2; i++) {34 var axLetter = axLetters[i];35 // xref, yref36 var axRef = Axes.coerceRef(annIn, annOut, gdMock, axLetter, '', 'paper');37 if(axRef !== 'paper') {38 var ax = Axes.getFromId(gdMock, axRef);39 ax._annIndices.push(annOut._index);40 }41 // x, y42 Axes.coercePosition(annOut, gdMock, coerce, axRef, axLetter, 0.5);43 if(showArrow) {44 var arrowPosAttr = 'a' + axLetter;45 // axref, ayref46 var aaxRef = Axes.coerceRef(annIn, annOut, gdMock, arrowPosAttr, 'pixel');47 // for now the arrow can only be on the same axis or specified as pixels48 // TODO: sometime it might be interesting to allow it to be on *any* axis49 // but that would require updates to drawing & autorange code and maybe more50 if(aaxRef !== 'pixel' && aaxRef !== axRef) {51 aaxRef = annOut[arrowPosAttr] = 'pixel';52 }53 // ax, ay54 var aDflt = (aaxRef === 'pixel') ? arrowPosDflt[i] : 0.4;55 Axes.coercePosition(annOut, gdMock, coerce, aaxRef, arrowPosAttr, aDflt);56 }57 // xanchor, yanchor58 coerce(axLetter + 'anchor');59 // xshift, yshift60 coerce(axLetter + 'shift');...
annotation_defaults.js
Source: annotation_defaults.js
...27 gdMock = {_fullLayout: fullLayout};28 for(var i = 0; i < 2; i++) {29 var axLetter = axLetters[i];30 // xref, yref31 var axRef = Axes.coerceRef(annIn, annOut, gdMock, axLetter, '', 'paper');32 // x, y33 Axes.coercePosition(annOut, gdMock, coerce, axRef, axLetter, 0.5);34 if(showArrow) {35 var arrowPosAttr = 'a' + axLetter,36 // axref, ayref37 aaxRef = Axes.coerceRef(annIn, annOut, gdMock, arrowPosAttr, 'pixel');38 // for now the arrow can only be on the same axis or specified as pixels39 // TODO: sometime it might be interesting to allow it to be on *any* axis40 // but that would require updates to drawing & autorange code and maybe more41 if(aaxRef !== 'pixel' && aaxRef !== axRef) {42 aaxRef = annOut[arrowPosAttr] = 'pixel';43 }44 // ax, ay45 var aDflt = (aaxRef === 'pixel') ? arrowPosDflt[i] : 0.4;46 Axes.coercePosition(annOut, gdMock, coerce, aaxRef, arrowPosAttr, aDflt);47 }48 // xanchor, yanchor49 coerce(axLetter + 'anchor');50 // xshift, yshift51 coerce(axLetter + 'shift');...
singleNode.js
Source: singleNode.js
...34 deleteRemainingChildren(returnFiber, child.sibling);35 36 //* å¤ç¨èç¹ 37 const existing = useFiber(child, element.props);38 existing.ref = coerceRef(returnFiber, child, element);39 existing.return = returnFiber;40 return existing;41 }42 // * key ç¸å typeä¸å æ 记该èç¹ä»¥åå
¶å
å¼èç¹ å é¤43 deleteRemainingChildren(returnFiber, child);44 break;45 } else {46 // * key ä¸å ç´æ¥æ è®°å æ该èç¹47 deleteChild(returnFiber, child);48 }49 // ?TODO è¿ç§åèç¹çå
å¼èç¹åºæ¯ ï¼50 child = child.sibling;51 }52 // å建æ°Fiber53 const created = createFiberFromElement(element, returnFiber.mode, lanes);54 created.ref = coerceRef(returnFiber, currentFirstChild, element);55 created.return = returnFiber;56 return created;...
reconciler.js
Source: reconciler.js
...20 21 return created;22 } else {23 const created = createFiberFromElement(element, returnFiber.mode);24 created.ref = coerceRef(returnFiber, currentFirstFiber, element);25 created.return = returnFiber;26 return created;27 }28}29function deleteChild () {...
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch({ headless: false });4 const context = await browser.newContext();5 const page = await context.newPage();6 const element = await page.$('text=Get started');7 const elementHandle = await element.asElement();8 const internalApi = page._delegate;9 const ref = await internalApi.coerceRef(elementHandle);10 console.log(ref);11 await browser.close();12})();13{ type: 'node', objectId: '0x1' }14const { chromium } = require('playwright');15(async () => {16 const browser = await chromium.launch({ headless: false });17 const context = await browser.newContext();18 const page = await context.newPage();19 const element = await page.$('text=Get started');20 const elementHandle = await element.asElement();21 const internalApi = page._delegate;22 const ref = await internalApi.coerceRef(elementHandle);23 const boundingBox = await internalApi.getBoundingBox(ref);24 console.log(boundingBox);25 await browser.close();26})();27{28}29const { chromium } = require('playwright');30(async () => {31 const browser = await chromium.launch({ headless: false });32 const context = await browser.newContext();33 const page = await context.newPage();
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 const page = await context.newPage();6 const elementHandle = await page.$('text=Submit');7 const element = await elementHandle.asElement();8 const ref = await element._page._delegate.coerceRef(element._elementHandle);9 console.log(ref);10 await browser.close();11})();12const { chromium } = require('playwright');13(async () => {14 const browser = await chromium.launch();15 const context = await browser.newContext();16 const page = await context.newPage();17 const elementHandle = await page.$('text=Submit');18 const element = await elementHandle.asElement();19 const ref = await element._page._delegate.coerceRef(element._elementHandle);20 console.log(ref);21 await browser.close();22})();
Using AI Code Generation
1const { chromium } = require('playwright');2const { coerceRef } = require('playwright/lib/client/transport');3(async () => {4 const browser = await chromium.launch();5 const page = await browser.newPage();6 const elementHandle = await page.$('text=Get started');7 const ref = coerceRef(elementHandle);8 console.log(ref);9 await browser.close();10})();11{12 _initializer: {13 _context: {14 },15 }16}17const { chromium } = require('playwright');18const { coerceRef } = require('playwright/lib/client/transport');19(async () => {20 const browser = await chromium.launch();21 const page = await browser.newPage();22 const elementHandle = await page.$('text=Get started');23 const ref = coerceRef(elementHandle);24 console.log(ref);25 const parentElementHandle = await ref._page.$('text=Learn more');26 console.log(parentElementHandle);27 await browser.close();28})();29{30 _initializer: {31 _context: {32 },33 }34}35ElementHandle {36 _page: Page {37 _browserContext: BrowserContext {
Using AI Code Generation
1const { chromium } = require('playwright');2const { coerceRef } = require('playwright/lib/protocol/protocol');3(async () => {4 const browser = await chromium.launch();5 const page = await browser.newPage();6 await page.waitForSelector('text=Get started');7 await page.click('text=Get started');8 await page.waitForSelector('text=Quick Start');9 await page.click('text=Quick Start');10 await page.waitForSelector('text=Install Node.js');11 await page.click('text=Install Node.js');12 let element = await page.$('text=Install Node.js');13 let ref = coerceRef(element);14 console.log(ref);15 await browser.close();16})();17{ __symbolic: 'reference',18 path: [ 'playwright', 'chromium', 'browserContext', 'page', 'frame' ] }
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const page = await browser.newPage();5 const elementHandle = await page.$('text=Hello World');6 const elementHandle2 = await page.$('text=Hello World');7 console.log(elementHandle.coerceRef(elementHandle2));8 await browser.close();9})();
Using AI Code Generation
1const { BrowserType } = require('playwright/lib/server/browserType');2const { Page } = require('playwright/lib/server/page');3const { ElementHandle } = require('playwright/lib/server/elementHandler');4const { Frame } = require('playwright/lib/server/frame');5const { JSHandle } = require('playwright/lib/server/jsHandle');6const { helper } = require('playwright/lib/helper');7const { createJSHandle } = require('playwright/lib/server/frames');8const { createHandle } = require('playwright/lib/server/injected/injectedScript');9const { serializeArgument } = require('playwright/lib/server/frames');10const { serializeResult } = require('playwright/lib/server/frames');11const { createHandleForElement } = require('playwright/lib/server/frames');12const { getExceptionMessage } = require('playwright/lib/server/frames');13const { getExceptionDetails } = require('playwright/lib/server/frames');14const { getExceptionValue } = require('playwright/lib/server/frames');15const { getExceptionValueAsync } = require('playwright/lib/server/frames');16const { getExceptionValueSync } = require('playwright/lib/server/frames');17const { getExceptionValueHandle } = require('playwright/lib/server/frames');18const { getExceptionValueString } = require('playwright/lib/server/frames');19const { getExceptionValueValue } = require('playwright/lib/server/frames');20const { getExceptionValuePreview } = require('playwright/lib/server/frames');21const { getExceptionValueDescription } = require('playwright/lib/server/frames');22const { getExceptionValueObjectId } = require('playwright/lib/server/frames');23const { getExceptionValueSubtype } = require('playwright/lib/server/frames');24const { getExceptionValueClassName } = require('playwright/lib/server/frames');25const { getExceptionValueUnserializableValue } = require('playwright/lib/server/frames');26const { getExceptionValueCustomPreview } = require('playwright/lib/server/frames');27const { getExceptionValueCustomPreviewHeader } = require('playwright/lib/server/frames');28const { getExceptionValueCustomPreviewBody } = require('playwright/lib/server/frames');29const { getExceptionValueCustomPreviewChildren } = require('playwright/lib/server/frames');30const { getExceptionValueCustomPreviewProperties } = require('playwright/lib/server/frames');
Using AI Code Generation
1const { chromium } = require('playwright');2const { Page, Frame } = require('playwright/lib/client/page');3const { ElementHandle } = require('playwright/lib/client/elementHandler');4async function main() {5 const browser = await chromium.launch();6 const context = await browser.newContext();7 const page = await context.newPage();8 const searchInput = await page.$('input[name="q"]');9 const searchInput2 = await page.$('input[name="q"]');10 const frame = await page.frames()[0];11 const searchInput3 = await frame.$('input[name="q"]');12 const searchInput4 = await page.evaluateHandle((el) => el, searchInput);13 const searchInput5 = await page.evaluateHandle((el) => el, searchInput2);14 const searchInput6 = await page.evaluateHandle((el) => el, searchInput3);15 await browser.close();16}17main();
Using AI Code Generation
1const { chromium } = require('playwright');2const { coerceRef } = require('playwright/lib/server/chromium/crConnection');3const { chromiumLauncher } = require('playwright/lib/server/chromium/chromiumLauncher');4(async () => {5 const browserServer = await chromiumLauncher.launchServer({6 });7 const url = browserServer.wsEndpoint();8 const browser = await chromium.connect({ wsEndpoint: url });9 const page = await browser.newPage();10 const pageId = coerceRef(page);11 console.log(pageId);12 await browser.close();13})();14const { chromium } = require('playwright');15const { coerceRef } = require('playwright/lib/server/chromium/crConnection');16const { chromiumLauncher } = require('playwright/lib/server/chromium/chromiumLauncher');17(async () => {18 const browserServer = await chromiumLauncher.launchServer({19 });20 const url = browserServer.wsEndpoint();21 const browser = await chromium.connect({ wsEndpoint: url });22 const page = await browser.newPage();
Using AI Code Generation
1const {chromium, firefox, webkit, devices, _electron, _android, _ios, _chromium, _firefox, _webkit, _devices, _electron, _android, _ios} = require('playwright');2const browser = await chromium.launch({headless: false});3const context = await browser.newContext();4const page = await context.newPage();5const element = await page.coerceRef('input[name=q]');6await element.type('Hello World');7await browser.close();8const {chromium, firefox, webkit, devices, _electron, _android, _ios, _chromium, _firefox, _webkit, _devices, _electron, _android, _ios} = require('playwright');9const browser = await chromium.launch({headless: false});10const context = await browser.newContext();11const page = await context.newPage();12const element = await page.coerceRef('input[name=q]');13await element.type('Hello World');14await browser.close();15const {chromium, firefox, webkit, devices, _electron, _android, _ios, _chromium, _firefox, _webkit, _devices, _electron, _android, _ios} = require('playwright');16const browser = await chromium.launch({headless: false});17const context = await browser.newContext();18const page = await context.newPage();19const element = await page.coerceRef('input[name=q]');20await element.type('Hello World');21await browser.close();22const {chromium, firefox, webkit, devices, _electron, _android, _ios, _chromium, _firefox, _webkit, _devices, _electron, _android, _ios} = require('playwright');23const browser = await chromium.launch({headless: false});
Using AI Code Generation
1const {coerceRef} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');2coerceRef('myLocator');3const {coerceRef} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');4coerceRef('myLocator');5const {coerceRef} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');6coerceRef('myLocator');7const {coerceRef} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');8coerceRef('myLocator');9const {coerceRef} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');10coerceRef('myLocator');11const {coerceRef} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');12coerceRef('myLocator');13const {coerceRef} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');14coerceRef('myLocator');15const {coerceRef} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');16coerceRef('myLocator');17const {coerceRef} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');18coerceRef('myLocator');19const {coerceRef} = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');20coerceRef('myLocator');21const {coerceRef} = require('playwright-core/lib/server/supplements
Jest + Playwright - Test callbacks of event-based DOM library
firefox browser does not start in playwright
Is it possible to get the selector from a locator object in playwright?
How to run a list of test suites in a single file concurrently in jest?
Running Playwright in Azure Function
firefox browser does not start in playwright
This question is quite close to a "need more focus" question. But let's try to give it some focus:
Does Playwright has access to the cPicker object on the page? Does it has access to the window object?
Yes, you can access both cPicker and the window object inside an evaluate call.
Should I trigger the events from the HTML file itself, and in the callbacks, print in the DOM the result, in some dummy-element, and then infer from that dummy element text that the callbacks fired?
Exactly, or you can assign values to a javascript variable:
const cPicker = new ColorPicker({
onClickOutside(e){
},
onInput(color){
window['color'] = color;
},
onChange(color){
window['result'] = color;
}
})
And then
it('Should call all callbacks with correct arguments', async() => {
await page.goto(`http://localhost:5000/tests/visual/basic.html`, {waitUntil:'load'})
// Wait until the next frame
await page.evaluate(() => new Promise(requestAnimationFrame))
// Act
// Assert
const result = await page.evaluate(() => window['color']);
// Check the value
})
Check out the latest blogs from LambdaTest on this topic:
Native apps are developed specifically for one platform. Hence they are fast and deliver superior performance. They can be downloaded from various app stores and are not accessible through browsers.
One of the essential parts when performing automated UI testing, whether using Selenium or another framework, is identifying the correct web elements the tests will interact with. However, if the web elements are not located correctly, you might get NoSuchElementException in Selenium. This would cause a false negative result because we won’t get to the actual functionality check. Instead, our test will fail simply because it failed to interact with the correct element.
Smartphones have changed the way humans interact with technology. Be it travel, fitness, lifestyle, video games, or even services, it’s all just a few touches away (quite literally so). We only need to look at the growing throngs of smartphone or tablet users vs. desktop users to grasp this reality.
As part of one of my consulting efforts, I worked with a mid-sized company that was looking to move toward a more agile manner of developing software. As with any shift in work style, there is some bewilderment and, for some, considerable anxiety. People are being challenged to leave their comfort zones and embrace a continuously changing, dynamic working environment. And, dare I say it, testing may be the most ‘disturbed’ of the software roles in agile development.
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!!