Best JavaScript code snippet using playwright-internal
ReactFiberWorkLoop.new.js
Source:ReactFiberWorkLoop.new.js
...629 // Check if any lanes are being starved by other work. If so, mark them as630 // expired so we know to work on those next.631 markStarvedLanesAsExpired(root, currentTime);632 // Determine the next lanes to work on, and their priority.633 const nextLanes = getNextLanes(634 root,635 root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes,636 );637 // This returns the priority level computed during the `getNextLanes` call.638 const newCallbackPriority = returnNextLanesPriority();639 if (nextLanes === NoLanes) {640 // Special case: There's nothing to work on.641 if (existingCallbackNode !== null) {642 cancelCallback(existingCallbackNode);643 root.callbackNode = null;644 root.callbackPriority = NoLanePriority;645 }646 return;647 }648 // Check if there's an existing task. We may be able to reuse it.649 if (existingCallbackNode !== null) {650 const existingCallbackPriority = root.callbackPriority;651 if (existingCallbackPriority === newCallbackPriority) {652 // The priority hasn't changed. We can reuse the existing task. Exit.653 return;654 }655 // The priority changed. Cancel the existing callback. We'll schedule a new656 // one below.657 cancelCallback(existingCallbackNode);658 }659 // Schedule a new callback.660 let newCallbackNode;661 if (newCallbackPriority === SyncLanePriority) {662 // Special case: Sync React callbacks are scheduled on a special663 // internal queue664 newCallbackNode = scheduleSyncCallback(665 performSyncWorkOnRoot.bind(null, root),666 );667 } else if (newCallbackPriority === SyncBatchedLanePriority) {668 newCallbackNode = scheduleCallback(669 ImmediateSchedulerPriority,670 performSyncWorkOnRoot.bind(null, root),671 );672 } else {673 const schedulerPriorityLevel = lanePriorityToSchedulerPriority(674 newCallbackPriority,675 );676 newCallbackNode = scheduleCallback(677 schedulerPriorityLevel,678 performConcurrentWorkOnRoot.bind(null, root),679 );680 }681 root.callbackPriority = newCallbackPriority;682 root.callbackNode = newCallbackNode;683}684// This is the entry point for every concurrent task, i.e. anything that685// goes through Scheduler.686function performConcurrentWorkOnRoot(root) {687 // Since we know we're in a React event, we can clear the current688 // event time. The next update will compute a new event time.689 currentEventTime = NoTimestamp;690 currentEventWipLanes = NoLanes;691 currentEventPendingLanes = NoLanes;692 invariant(693 (executionContext & (RenderContext | CommitContext)) === NoContext,694 'Should not already be working.',695 );696 // Flush any pending passive effects before deciding which lanes to work on,697 // in case they schedule additional work.698 const originalCallbackNode = root.callbackNode;699 const didFlushPassiveEffects = flushPassiveEffects();700 if (didFlushPassiveEffects) {701 // Something in the passive effect phase may have canceled the current task.702 // Check if the task node for this root was changed.703 if (root.callbackNode !== originalCallbackNode) {704 // The current task was canceled. Exit. We don't need to call705 // `ensureRootIsScheduled` because the check above implies either that706 // there's a new task, or that there's no remaining work on this root.707 return null;708 } else {709 // Current task was not canceled. Continue.710 }711 }712 // Determine the next expiration time to work on, using the fields stored713 // on the root.714 let lanes = getNextLanes(715 root,716 root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes,717 );718 if (lanes === NoLanes) {719 // Defensive coding. This is never expected to happen.720 return null;721 }722 let exitStatus = renderRootConcurrent(root, lanes);723 if (724 includesSomeLane(725 workInProgressRootIncludedLanes,726 workInProgressRootUpdatedLanes,727 )728 ) {729 // The render included lanes that were updated during the render phase.730 // For example, when unhiding a hidden tree, we include all the lanes731 // that were previously skipped when the tree was hidden. That set of732 // lanes is a superset of the lanes we started rendering with.733 //734 // So we'll throw out the current work and restart.735 prepareFreshStack(root, NoLanes);736 } else if (exitStatus !== RootIncomplete) {737 if (exitStatus === RootErrored) {738 executionContext |= RetryAfterError;739 // If an error occurred during hydration,740 // discard server response and fall back to client side render.741 if (root.hydrate) {742 root.hydrate = false;743 clearContainer(root.containerInfo);744 }745 // If something threw an error, try rendering one more time. We'll render746 // synchronously to block concurrent data mutations, and we'll includes747 // all pending updates are included. If it still fails after the second748 // attempt, we'll give up and commit the resulting tree.749 lanes = getLanesToRetrySynchronouslyOnError(root);750 if (lanes !== NoLanes) {751 exitStatus = renderRootSync(root, lanes);752 }753 }754 if (exitStatus === RootFatalErrored) {755 const fatalError = workInProgressRootFatalError;756 prepareFreshStack(root, NoLanes);757 markRootSuspended(root, lanes);758 ensureRootIsScheduled(root, now());759 throw fatalError;760 }761 // We now have a consistent tree. The next step is either to commit it,762 // or, if something suspended, wait to commit it after a timeout.763 const finishedWork: Fiber = (root.current.alternate: any);764 root.finishedWork = finishedWork;765 root.finishedLanes = lanes;766 finishConcurrentRender(root, exitStatus, lanes);767 }768 ensureRootIsScheduled(root, now());769 if (root.callbackNode === originalCallbackNode) {770 // The task node scheduled for this root is the same one that's771 // currently executed. Need to return a continuation.772 return performConcurrentWorkOnRoot.bind(null, root);773 }774 return null;775}776function finishConcurrentRender(root, exitStatus, lanes) {777 switch (exitStatus) {778 case RootIncomplete:779 case RootFatalErrored: {780 invariant(false, 'Root did not complete. This is a bug in React.');781 }782 // Flow knows about invariant, so it complains if I add a break783 // statement, but eslint doesn't know about invariant, so it complains784 // if I do. eslint-disable-next-line no-fallthrough785 case RootErrored: {786 // We should have already attempted to retry this tree. If we reached787 // this point, it errored again. Commit it.788 commitRoot(root);789 break;790 }791 case RootSuspended: {792 markRootSuspended(root, lanes);793 // We have an acceptable loading state. We need to figure out if we794 // should immediately commit it or wait a bit.795 if (796 includesOnlyRetries(lanes) &&797 // do not delay if we're inside an act() scope798 !shouldForceFlushFallbacksInDEV()799 ) {800 // This render only included retries, no updates. Throttle committing801 // retries so that we don't show too many loading states too quickly.802 const msUntilTimeout =803 globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now();804 // Don't bother with a very short suspense time.805 if (msUntilTimeout > 10) {806 const nextLanes = getNextLanes(root, NoLanes);807 if (nextLanes !== NoLanes) {808 // There's additional work on this root.809 break;810 }811 const suspendedLanes = root.suspendedLanes;812 if (!isSubsetOfLanes(suspendedLanes, lanes)) {813 // We should prefer to render the fallback of at the last814 // suspended level. Ping the last suspended level to try815 // rendering it again.816 // FIXME: What if the suspended lanes are Idle? Should not restart.817 const eventTime = requestEventTime();818 markRootPinged(root, suspendedLanes, eventTime);819 break;820 }821 // The render is suspended, it hasn't timed out, and there's no822 // lower priority work to do. Instead of committing the fallback823 // immediately, wait for more data to arrive.824 root.timeoutHandle = scheduleTimeout(825 commitRoot.bind(null, root),826 msUntilTimeout,827 );828 break;829 }830 }831 // The work expired. Commit immediately.832 commitRoot(root);833 break;834 }835 case RootSuspendedWithDelay: {836 markRootSuspended(root, lanes);837 if (includesOnlyTransitions(lanes)) {838 // This is a transition, so we should exit without committing a839 // placeholder and without scheduling a timeout. Delay indefinitely840 // until we receive more data.841 break;842 }843 if (!shouldForceFlushFallbacksInDEV()) {844 // This is not a transition, but we did trigger an avoided state.845 // Schedule a placeholder to display after a short delay, using the Just846 // Noticeable Difference.847 // TODO: Is the JND optimization worth the added complexity? If this is848 // the only reason we track the event time, then probably not.849 // Consider removing.850 const mostRecentEventTime = getMostRecentEventTime(root, lanes);851 const eventTimeMs = mostRecentEventTime;852 const timeElapsedMs = now() - eventTimeMs;853 const msUntilTimeout = jnd(timeElapsedMs) - timeElapsedMs;854 // Don't bother with a very short suspense time.855 if (msUntilTimeout > 10) {856 // Instead of committing the fallback immediately, wait for more data857 // to arrive.858 root.timeoutHandle = scheduleTimeout(859 commitRoot.bind(null, root),860 msUntilTimeout,861 );862 break;863 }864 }865 // Commit the placeholder.866 commitRoot(root);867 break;868 }869 case RootCompleted: {870 // The work completed. Ready to commit.871 commitRoot(root);872 break;873 }874 default: {875 invariant(false, 'Unknown root exit status.');876 }877 }878}879function markRootSuspended(root, suspendedLanes) {880 // When suspending, we should always exclude lanes that were pinged or (more881 // rarely, since we try to avoid it) updated during the render phase.882 // TODO: Lol maybe there's a better way to factor this besides this883 // obnoxiously named function :)884 suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes);885 suspendedLanes = removeLanes(suspendedLanes, workInProgressRootUpdatedLanes);886 markRootSuspended_dontCallThisOneDirectly(root, suspendedLanes);887}888// This is the entry point for synchronous tasks that don't go889// through Scheduler890function performSyncWorkOnRoot(root) {891 invariant(892 (executionContext & (RenderContext | CommitContext)) === NoContext,893 'Should not already be working.',894 );895 flushPassiveEffects();896 let lanes;897 let exitStatus;898 if (899 root === workInProgressRoot &&900 includesSomeLane(root.expiredLanes, workInProgressRootRenderLanes)901 ) {902 // There's a partial tree, and at least one of its lanes has expired. Finish903 // rendering it before rendering the rest of the expired work.904 lanes = workInProgressRootRenderLanes;905 exitStatus = renderRootSync(root, lanes);906 if (907 includesSomeLane(908 workInProgressRootIncludedLanes,909 workInProgressRootUpdatedLanes,910 )911 ) {912 // The render included lanes that were updated during the render phase.913 // For example, when unhiding a hidden tree, we include all the lanes914 // that were previously skipped when the tree was hidden. That set of915 // lanes is a superset of the lanes we started rendering with.916 //917 // Note that this only happens when part of the tree is rendered918 // concurrently. If the whole tree is rendered synchronously, then there919 // are no interleaved events.920 lanes = getNextLanes(root, lanes);921 exitStatus = renderRootSync(root, lanes);922 }923 } else {924 lanes = getNextLanes(root, NoLanes);925 exitStatus = renderRootSync(root, lanes);926 }927 if (root.tag !== LegacyRoot && exitStatus === RootErrored) {928 executionContext |= RetryAfterError;929 // If an error occurred during hydration,930 // discard server response and fall back to client side render.931 if (root.hydrate) {932 root.hydrate = false;933 clearContainer(root.containerInfo);934 }935 // If something threw an error, try rendering one more time. We'll render936 // synchronously to block concurrent data mutations, and we'll includes937 // all pending updates are included. If it still fails after the second938 // attempt, we'll give up and commit the resulting tree....
ReactFiberWorkLoop.old.js
Source:ReactFiberWorkLoop.old.js
...298 function ensureRootIsScheduled(root, currentTime) {299 var existingCallbackNode = root.callbackNode; // Check if any lanes are being starved by other work. If so, mark them as300 // expired so we know to work on those next.301 markStarvedLanesAsExpired(root, currentTime); // Determine the next lanes to work on, and their priority.302 var nextLanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes); // This returns the priority level computed during the `getNextLanes` call.303 var newCallbackPriority = returnNextLanesPriority();304 if (nextLanes === NoLanes) {305 // Special case: There's nothing to work on.306 if (existingCallbackNode !== null) {307 cancelCallback(existingCallbackNode);308 root.callbackNode = null;309 root.callbackPriority = NoLanePriority;310 }311 return;312 } // Check if there's an existing task. We may be able to reuse it.313 if (existingCallbackNode !== null) {314 var existingCallbackPriority = root.callbackPriority;315 if (existingCallbackPriority === newCallbackPriority) {316 // The priority hasn't changed. We can reuse the existing task. Exit.317 return;318 } // The priority changed. Cancel the existing callback. We'll schedule a new319 // one below.320 cancelCallback(existingCallbackNode);321 } // Schedule a new callback.322 var newCallbackNode;323 if (newCallbackPriority === SyncLanePriority) {324 // Special case: Sync React callbacks are scheduled on a special325 // internal queue326 newCallbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));327 } else if (newCallbackPriority === SyncBatchedLanePriority) {328 newCallbackNode = scheduleCallback(ImmediatePriority$1, performSyncWorkOnRoot.bind(null, root));329 } else {330 var schedulerPriorityLevel = lanePriorityToSchedulerPriority(newCallbackPriority);331 newCallbackNode = scheduleCallback(schedulerPriorityLevel, performConcurrentWorkOnRoot.bind(null, root));332 }333 root.callbackPriority = newCallbackPriority;334 root.callbackNode = newCallbackNode;335 } // This is the entry point for every concurrent task, i.e. anything that336 // goes through Scheduler.337 function performConcurrentWorkOnRoot(root) {338 // Since we know we're in a React event, we can clear the current339 // event time. The next update will compute a new event time.340 currentEventTime = NoTimestamp;341 currentEventWipLanes = NoLanes;342 currentEventPendingLanes = NoLanes;343 if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {344 {345 throw Error( "Should not already be working." );346 }347 } // Flush any pending passive effects before deciding which lanes to work on,348 // in case they schedule additional work.349 var originalCallbackNode = root.callbackNode;350 var didFlushPassiveEffects = flushPassiveEffects();351 if (didFlushPassiveEffects) {352 // Something in the passive effect phase may have canceled the current task.353 // Check if the task node for this root was changed.354 if (root.callbackNode !== originalCallbackNode) {355 // The current task was canceled. Exit. We don't need to call356 // `ensureRootIsScheduled` because the check above implies either that357 // there's a new task, or that there's no remaining work on this root.358 return null;359 }360 } // Determine the next expiration time to work on, using the fields stored361 // on the root.362 var lanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes);363 if (lanes === NoLanes) {364 // Defensive coding. This is never expected to happen.365 return null;366 }367 var exitStatus = renderRootConcurrent(root, lanes);368 if (includesSomeLane(workInProgressRootIncludedLanes, workInProgressRootUpdatedLanes)) {369 // The render included lanes that were updated during the render phase.370 // For example, when unhiding a hidden tree, we include all the lanes371 // that were previously skipped when the tree was hidden. That set of372 // lanes is a superset of the lanes we started rendering with.373 //374 // So we'll throw out the current work and restart.375 prepareFreshStack(root, NoLanes);376 } else if (exitStatus !== RootIncomplete) {377 if (exitStatus === RootErrored) {378 executionContext |= RetryAfterError; // If an error occurred during hydration,379 // discard server response and fall back to client side render.380 if (root.hydrate) {381 root.hydrate = false;382 clearContainer(root.containerInfo);383 } // If something threw an error, try rendering one more time. We'll render384 // synchronously to block concurrent data mutations, and we'll includes385 // all pending updates are included. If it still fails after the second386 // attempt, we'll give up and commit the resulting tree.387 lanes = getLanesToRetrySynchronouslyOnError(root);388 if (lanes !== NoLanes) {389 exitStatus = renderRootSync(root, lanes);390 }391 }392 if (exitStatus === RootFatalErrored) {393 var fatalError = workInProgressRootFatalError;394 prepareFreshStack(root, NoLanes);395 markRootSuspended$1(root, lanes);396 ensureRootIsScheduled(root, now());397 throw fatalError;398 } // We now have a consistent tree. The next step is either to commit it,399 // or, if something suspended, wait to commit it after a timeout.400 var finishedWork = root.current.alternate;401 root.finishedWork = finishedWork;402 root.finishedLanes = lanes;403 finishConcurrentRender(root, exitStatus, lanes);404 }405 ensureRootIsScheduled(root, now());406 if (root.callbackNode === originalCallbackNode) {407 // The task node scheduled for this root is the same one that's408 // currently executed. Need to return a continuation.409 return performConcurrentWorkOnRoot.bind(null, root);410 }411 return null;412 }413 function finishConcurrentRender(root, exitStatus, lanes) {414 switch (exitStatus) {415 case RootIncomplete:416 case RootFatalErrored:417 {418 {419 {420 throw Error( "Root did not complete. This is a bug in React." );421 }422 }423 }424 // Flow knows about invariant, so it complains if I add a break425 // statement, but eslint doesn't know about invariant, so it complains426 // if I do. eslint-disable-next-line no-fallthrough427 case RootErrored:428 {429 // We should have already attempted to retry this tree. If we reached430 // this point, it errored again. Commit it.431 commitRoot(root);432 break;433 }434 case RootSuspended:435 {436 markRootSuspended$1(root, lanes); // We have an acceptable loading state. We need to figure out if we437 // should immediately commit it or wait a bit.438 if (includesOnlyRetries(lanes) && // do not delay if we're inside an act() scope439 !shouldForceFlushFallbacksInDEV()) {440 // This render only included retries, no updates. Throttle committing441 // retries so that we don't show too many loading states too quickly.442 var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time.443 if (msUntilTimeout > 10) {444 var nextLanes = getNextLanes(root, NoLanes);445 if (nextLanes !== NoLanes) {446 // There's additional work on this root.447 break;448 }449 var suspendedLanes = root.suspendedLanes;450 if (!isSubsetOfLanes(suspendedLanes, lanes)) {451 // We should prefer to render the fallback of at the last452 // suspended level. Ping the last suspended level to try453 // rendering it again.454 // FIXME: What if the suspended lanes are Idle? Should not restart.455 var eventTime = requestEventTime();456 markRootPinged(root, suspendedLanes);457 break;458 } // The render is suspended, it hasn't timed out, and there's no459 // lower priority work to do. Instead of committing the fallback460 // immediately, wait for more data to arrive.461 root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout);462 break;463 }464 } // The work expired. Commit immediately.465 commitRoot(root);466 break;467 }468 case RootSuspendedWithDelay:469 {470 markRootSuspended$1(root, lanes);471 if (includesOnlyTransitions(lanes)) {472 // This is a transition, so we should exit without committing a473 // placeholder and without scheduling a timeout. Delay indefinitely474 // until we receive more data.475 break;476 }477 if (!shouldForceFlushFallbacksInDEV()) {478 // This is not a transition, but we did trigger an avoided state.479 // Schedule a placeholder to display after a short delay, using the Just480 // Noticeable Difference.481 // TODO: Is the JND optimization worth the added complexity? If this is482 // the only reason we track the event time, then probably not.483 // Consider removing.484 var mostRecentEventTime = getMostRecentEventTime(root, lanes);485 var eventTimeMs = mostRecentEventTime;486 var timeElapsedMs = now() - eventTimeMs;487 var _msUntilTimeout = jnd(timeElapsedMs) - timeElapsedMs; // Don't bother with a very short suspense time.488 if (_msUntilTimeout > 10) {489 // Instead of committing the fallback immediately, wait for more data490 // to arrive.491 root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout);492 break;493 }494 } // Commit the placeholder.495 commitRoot(root);496 break;497 }498 case RootCompleted:499 {500 // The work completed. Ready to commit.501 commitRoot(root);502 break;503 }504 default:505 {506 {507 {508 throw Error( "Unknown root exit status." );509 }510 }511 }512 }513 }514 function markRootSuspended$1(root, suspendedLanes) {515 // When suspending, we should always exclude lanes that were pinged or (more516 // rarely, since we try to avoid it) updated during the render phase.517 // TODO: Lol maybe there's a better way to factor this besides this518 // obnoxiously named function :)519 suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes);520 suspendedLanes = removeLanes(suspendedLanes, workInProgressRootUpdatedLanes);521 markRootSuspended(root, suspendedLanes);522 } // This is the entry point for synchronous tasks that don't go523 // through Scheduler524 function performSyncWorkOnRoot(root) {525 if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {526 {527 throw Error( "Should not already be working." );528 }529 }530 flushPassiveEffects();531 var lanes;532 var exitStatus;533 if (root === workInProgressRoot && includesSomeLane(root.expiredLanes, workInProgressRootRenderLanes)) {534 // There's a partial tree, and at least one of its lanes has expired. Finish535 // rendering it before rendering the rest of the expired work.536 lanes = workInProgressRootRenderLanes;537 exitStatus = renderRootSync(root, lanes);538 if (includesSomeLane(workInProgressRootIncludedLanes, workInProgressRootUpdatedLanes)) {539 // The render included lanes that were updated during the render phase.540 // For example, when unhiding a hidden tree, we include all the lanes541 // that were previously skipped when the tree was hidden. That set of542 // lanes is a superset of the lanes we started rendering with.543 //544 // Note that this only happens when part of the tree is rendered545 // concurrently. If the whole tree is rendered synchronously, then there546 // are no interleaved events.547 lanes = getNextLanes(root, lanes);548 exitStatus = renderRootSync(root, lanes);549 }550 } else {551 lanes = getNextLanes(root, NoLanes);552 exitStatus = renderRootSync(root, lanes);553 }554 if (root.tag !== LegacyRoot && exitStatus === RootErrored) {555 executionContext |= RetryAfterError; // If an error occurred during hydration,556 // discard server response and fall back to client side render.557 if (root.hydrate) {558 root.hydrate = false;559 clearContainer(root.containerInfo);560 } // If something threw an error, try rendering one more time. We'll render561 // synchronously to block concurrent data mutations, and we'll includes562 // all pending updates are included. If it still fails after the second563 // attempt, we'll give up and commit the resulting tree.564 lanes = getLanesToRetrySynchronouslyOnError(root);565 if (lanes !== NoLanes) {...
ReactFiberWorkLoop.js
Source:ReactFiberWorkLoop.js
...350}351function ensureRootIsScheduled(root, currentTime) {352 const existingCallbackNode = root.callbackNode;353 markStarvedLanesAsExpired(root, currentTime);354 const nextLanes = getNextLanes(355 root,356 root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes357 );358 359 const newCallbackPriority = returnNextLanesPriority();360 if(nextLanes === NoLanes) {361 if(existingCallbackNode !== null) {362 cancelCallback(existingCallbackNode);363 root.callbackNode = null;364 root.callbackPriority = NoLanePriority;365 }366 return;367 }368 if(existingCallbackNode !== null) {369 const existingCallbackPriority = root.callbackPriority;370 if(existingCallbackPriority === newCallbackPriority) {371 return;372 }373 cancelCallback(existingCallbackNode);374 }375 let newCallbackNode;376 if(newCallbackPriority === SyncLanePriority) {377 newCallbackNode = scheduleSyncCallback(378 performSyncWorkOnRoot.bind(null, root)379 );380 } else if(newCallbackPriority === SyncBatchedLanePriority) {381 newCallbackNode = scheduleCallback(382 ImmediateSchedulerPriority,383 performSyncWorkOnRoot.bind(null, root)384 )385 } else {386 // concurrent387 }388 root.callbackPriority = newCallbackPriority;389 root.callbackNode = newCallbackNode;390}391export function markSkippedUpdateLanes(lane) {392 workInProgressRootSkippedLanes = mergeLanes(393 lane,394 workInProgressRootSkippedLanes395 );396}397export function schedulePassiveEffectCallback() {398 if(!rootDoseHavePassiveEffects) {399 rootDoseHavePassiveEffects = true;400 scheduleCallback(401 NormalSchedulerPriority,402 () => {403 flushPassiveEffects();404 return null;405 }406 );407 }408}409function commitBeforeMutationEffects(firstChild) {410 let fiber = firstChild;411 // éå½å¤çfiber412 while(fiber !== null) {413 // if(fiber.deletions !== null) {414 // commitBeforeMutationEffectsDeletions(fiber.deletions);415 // }416 if(fiber.child !== null) {417 const primarySubtreeFlags = fiber.subtreeFlags & BeforeMutationMask;418 if(primarySubtreeFlags !== NoFlags) {419 commitBeforeMutationEffects(fiber.child);420 }421 }422 try {423 commitBeforeMutationEffectsImpl(fiber);424 } catch(e) {425 426 }427 fiber = fiber.sibling;428 }429}430// function commitBeforeMutationEffects() {431// while(nextEffect !== null) {432// const current = nextEffect.alternate;433// const flags = nextEffect.flags;434// if((flags & Snapshot) !== NoFlags) {435// commitBeforeMutationEffectOnFiber(current, nextEffect);436// }437// if((flags & Passive) !== NoFlags) {438// if(!rootDoseHavePassiveEffects) {439// rootDoseHavePassiveEffects = true;440// scheduleCallback(441// NormalSchedulerPriority,442// () => {443// flushPassiveEffects();444// return null;445// }446// );447// }448// }449// nextEffect = nextEffect.nextEffect;450// }451// }452function commitBeforeMutationEffectsImpl(fiber) {453 const current = fiber.alternate;454 const flags = fiber.flags;455 if((flags & Snapshot) !== NoFlags) {456 commitBeforeMutationEffectsOnFiber(current, fiber);457 } 458 if((flags & Passive) !== NoFlags) {459 if(!rootDoseHavePassiveEffects) {460 rootDoseHavePassiveEffects = true;461 scheduleCallback(462 NormalSchedulerPriority,463 () => {464 flushPassiveEffects();465 return null;466 }467 );468 }469 }470}471function commitMutationEffects(firstChild, root, renderPriorityLevel) {472 let fiber = firstChild;473 while(fiber !== null) {474 if(fiber.child !== null) {475 const mutationFlags = fiber.subtreeFlags & MutationMask;476 if(mutationFlags !== NoFlags) {477 commitMutationEffects(fiber.child, root, renderPriorityLevel);478 }479 }480 try{481 commitMutationEffectsImpl(fiber, root, renderPriorityLevel);482 } catch(e) {483 }484 fiber = fiber.sibling;485 }486}487function commitMutationEffectsImpl(fiber, root, renderPriorityLevel) {488 const flags = fiber.flags;489 const primaryFlags = flags & (Placement | Update);490 switch(primaryFlags) {491 case Placement:492 commitPlacement(fiber);493 fiber.flags &= ~Placement;494 break;495 case PlacementAndUpdate:496 {497 commitPlacement(fiber);498 fiber.flags &= ~Placement;499 const current = fiber.alternate;500 commitWork(current, fiber);501 break;502 }503 case Update: {504 const current = fiber.alternate;505 commitWork(current, fiber);506 break;507 }508 }509}510function commitLayoutEffects(root, committedLanes) {511 while(nextEffect !== null) {512 const flags = nextEffect.flags;513 if(flags & (Update | Callback)) {514 const current = nextEffect.alternate;515 commitLayoutEffectOnFiber(root, current, nextEffect, committedLanes);516 }517 nextEffect = nextEffect.nextEffect;518 }519}520// function commitBeforeMutationEffectsDeletions(deletions) {521// for(let i = 0; i < deletions.length; i++) {522// const fiber = deletions[i];523// }524// }525function performSyncWorkOnRoot(root) {526 flushPassiveEffects();527 let lanes;528 let existStatus;529 if(530 root === workInProgressRoot531 && includesSomeLane(root.exporedLanes, workInProgressRootRenderLanes)532 ) {533 lanes = workInProgressRootRenderLanes;534 existStatus = renderRootSync(root, lanes);535 if(includesSomeLane(536 workInProgressRootIncludedLanes,537 workInProgressRootUpdatedLanes538 )) {539 lanes = getNextLanes(root, lanes);540 existStatus = renderRootSync(root, lanes);541 }542 } else {543 lanes = getNextLanes(root, NoLanes);544 existStatus = renderRootSync(root, lanes);545 }546 const finishedWork = root.current.alternate;547 root.finishedWork = finishedWork;548 root.finishedLanes = lanes;549 console.log("====>>>>beforeCommitRoot", root);550 commitRoot(root);551 ensureRootIsScheduled(root, now());552 return null;553}554function scheduleUpdateOnFiber(fiber, lane, eventTime) {555 const root = markUpdateLaneFromFiberToRoot(fiber, lane);556 markRootUpdated(root, lane, eventTime);557 if(root === workInProgressRoot) {...
ReactFiberLane.js
Source:ReactFiberLane.js
...186 // We can always overwrite an existing timestamp because we prefer the most187 // recent event, and we assume time is monotonically increasingï¼åè°éå¢ï¼.188 eventTimes[index] = eventTime;189}190export function getNextLanes(root, wipLanes) {191 // é¦æ¬¡æ¸²ææ¶ï¼ å¨æ¬æ件27è¡ï¼ 设置äºrootä¸çpendingLanes为1192 const pendingLanes = root.pendingLanes;193 // Early bailout if there's no pending work left.194 if (pendingLanes === NoLanes) {195 return_highestLanePriority = NoLanePriority;196 return NoLanes;197 }198 let nextLanes = NoLanes;199 let nextLanePriority = NoLanePriority;200 // å次渲ææ¶ï¼ 以ä¸å 个laneså为0201 const expiredLanes = root.expiredLanes;202 const suspendedLanes = root.suspendedLanes;203 const pingedLanes = root.pingedLanes;204 // Check if any work has expired....
FiberWorkLoop.js
Source:FiberWorkLoop.js
...111}112function ensureRootIsScheduled(root, currentTime){113 // update root.expirationTime. 114 markStarvedLanesAsExpired(root, currentTime);115 const nextLanes = getNextLanes(116 root, 117 root === wipRoot ? wipRootRenderLanes : NoLanes,118 );119 if (nextLanes === NoLanes){120 return;121 }122 const newCallbackPriority = getHighestPriorityLane(nextLanes);123 // Reuse existing task with the same priority.124 const existingCallbackPriority = root.callbackPriority;125 if (existingCallbackPriority === newCallbackPriority){126 return;127 }128 let newCallbackNode = scheduleCallback(129 performConcurrentWorkOnRoot.bind(null, root),130 );131 root.callbackPriority = newCallbackPriority;132 root.callbackNode = newCallbackNode;133}134// Entry point for every concurrent task, i.e. anything that135// goes through Scheduler.136function performConcurrentWorkOnRoot(root){137 currentEventTime = NoTimestamp;138 const originalCallbackNode = root.callbackNode;139 let lanes = getNextLanes(140 root,141 root === wipRoot ? wipRootRenderLanes : NoLanes,142 )143 let exitStatus = renderRootConcurrent(root, lanes); 144 if(exitStatus !== RootIncomplete){145 if(exitStatus === RootErrored){146 executionContext |= RootErrored;147 return null;148 }149 // now we have a consistent tree and ready to commit.150 const finishedWork = root.current.alternate151 root.finishedWork = finishedWork;152 root.finishedLanes = lanes;153 finishConcurrentRender(root, exitStatus, lanes);...
custom-reconciler.js
Source:custom-reconciler.js
...208 } else {209 // æ£æ¥æ¯å¦æå
¶ä»lane被å¦å¤çwork starvedï¼å¦ææ è®°ä»ä»¬è¿æï¼å¯ä»¥ä¸ä¸æ¬¡210 markStarbedLanesAsExpired(root, eventTime);211 // ä¸ä¸ä¸ªæ´æ°çlaneåæé212 let nextLanes = getNextLanes(root, NoLane);213 }214 }215}216function markStarbedLanesAsExpired(root, currentTime) {217 let pendingLanes = root.pendingLanes;218 let suspendedLanes = root.suspendedLanes;219 let pingedLanes = root.pingedLanes;220 let expirationTimes = root.expirationTimes;221 // æ£æ¥pending lanes æ¯å¦å·²ç»å°è¾¾äºä»ä»¬çç»æ¢æ¶é´ï¼222 let lanes = pendingLanes;223 while (lanes > 0) {224 let index = TotalLanes - Math.clz32(lanes);225 let lane = 1 << index;226 let expirationTime = expirationTimes[index];227 if (expirationTime === NoTimestamp) {228 if (229 (lane & suspendedLanes) === NoLane ||230 (lane & pingedLanes) !== NoLane231 ) {232 expirationTimes[index] = computeExpirationTime(lane, currentTime);233 }234 }235 }236}237let return_highestLanePriority = DefaultLanePriority;238function getHighestPriorityLanes(lane) {239 if ((SyncLane & lane) !== NoLane) {240 return_highestLanePriority = SyncLanePriority;241 return SyncLane;242 }243 if ((SyncBatchedLane & lane) !== NoLane) {244 return_highestLanePriority = SyncBatchedLanePriority;245 return SyncBatchedLane;246 }247 if ((InputDiscreteHydrationLane & lane) !== NoLane) {248 return_highestLanePriority = InputDiscreteHydrationLanePriority;249 return InputDiscreteHydrationLane;250 }251 if ((InputDiscreteLanes & lane) !== NoLane) {252 return_highestLanePriority = InputDiscreteLanePriority;253 return_InputDiscreteLanes = NoLanePriority;254 }255 // TODO ...256 return lane;257}258function getNextLanes(root, workInProgressLanes) {259 if (root.pendingLanes === NoLane) {260 return_highestLanePriority = NoLanePriority;261 }262}263function computeExpirationTime(lane, currentTime) {264 getHighestPriorityLanes(lane);265 if (return_highestLanePriority >= InputContinuousLanePriority) {266 return currentTime + 250;267 } else if (return_highestLanePriority >= TransitionPriority) {268 return currentTime + 5000;269 } else {270 return NoTimestamp;271 }272}...
FiberLane.js
Source:FiberLane.js
...29 console.error('Unknown lanes found:',lanes);30 return DefaultLane31 }32}33export function getNextLanes(root, wipLanes){34 const pendingLanes = root.pendingLanes;35 if (pendingLanes === NoLanes){36 return NoLanes;37 }38 if(root.suspendedLanes !== 0 || root.pingedLanes !== 0){39 console.error('suspendedLanes or pingedLanes Found:', root);40 }41 42 let nextLanes = getHighestPriorityLanes(pendingLanes);43 if(wipLanes !== nextLanes && wipLanes !== NoLanes){44 throw Error('New lanes found during Render Phase')45 }46 47 return nextLanes;...
index.js
Source:index.js
...11 performUnitOfWork(workInProgress);12 }13}14function performSyncWorkOnRoot() {15 const lanes = getNextLanes(root, NoLanes)16}17function begineWork(current, workInProgress) {18 if (current !== null) {19 // å½ current ä¸ä¸º null æ¶ï¼è¯´æ该èç¹å·²ç»æè½½ï¼æ大å¯è½å°å¤ç¨æ§èç¹æ°æ®20 return bailoutOnAlreadyFinishedWork(21 current,22 workInProgress,23 renderLanes,24 );25 } else {26 didReceiveUpdate = false;27 }28 switch (workInProgress.tag) {29 }...
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 lanes = await page.evaluate(() => {7 const { getNextLanes } = require('playwright-core/lib/server/supplements/recorder/recorderSupplement');8 const lanes = getNextLanes();9 return lanes;10 });11 console.log(lanes);12 await browser.close();13})();14const { chromium } = require('playwright');15(async () => {16 const browser = await chromium.launch();17 const context = await browser.newContext();18 const page = await context.newPage();19 const lanes = await page.evaluate(() => {20 const { getNextLanes } = require('playwright-core/lib/server/supplements/recorder/recorderSupplement');21 const lanes = getNextLanes();22 return lanes;23 });24 console.log(lanes);25 await browser.close();26})();27 at ExecutionContext._evaluateInternal (/home/ashish/.npm-global/lib/node_modules/playwright/node_modules/playwright-core/lib/server/frames.js:1337:19)28 at processTicksAndRejections (internal/process/task_queues.js:97:5)29 at async ExecutionContext.evaluate (/home/ashish/.npm-global/lib/node_modules/playwright/node_modules/playwright-core/lib/server/frames.js:1312:16)30 at async Object.<anonymous> (/home/ashish/Desktop/Playwright/test.js:12:19)
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 lanes = await page._delegate.getNextLanes();7 console.log(lanes);8 await browser.close();9})();10[ Lane {
Using AI Code Generation
1const { Playwright } = require('playwright-core');2const { chromium } = Playwright;3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const frame = page.mainFrame();7 const nextLanes = await frame.getNextLanes();8 console.log(nextLanes);9 await browser.close();10})();11const { Playwright } = require('playwright-core');12const { chromium } = Playwright;13(async () => {14 const browser = await chromium.launch();15 const context = await browser.newContext();16 const frame = page.mainFrame();17 const nextLanes = await frame.getNextLanes();18 console.log(nextLanes);19 await browser.close();20})();21const { Playwright } = require('playwright-core');22const { chromium } = Playwright;23(async () => {24 const browser = await chromium.launch();25 const context = await browser.newContext();26 const frame = page.mainFrame();27 const nextLanes = await frame.getNextLanes();28 console.log(nextLanes);29 await browser.close();30})();31const { Playwright } = require('playwright-core');32const { chromium } = Playwright;
Using AI Code Generation
1const {chromium} = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const page = await browser.newPage();5 const nextLanes = await page._delegate.getNextLanes();6 console.log(nextLanes);7 await browser.close();8})();9 {10 {11 },12 {13 }14 }15const nextLanes = await page._delegate.getNextLanes();16const navigationLane = nextLanes.find(lane => lane.name === 'navigation');17const nextLanes = await page._delegate.getNextLanes();18const navigationLane = nextLanes.find(lane => lane.name === 'navigation');
Using AI Code Generation
1const { chromium } = require('playwright');2const { getNextLanes } = require('playwright/lib/client/frames');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.click('text=Get started');8 const frames = await page.frames();9 const frame = frames.find(f => f.url().includes('docs'));10 const lanes = await getNextLanes(frame);11 console.log(lanes);12 await browser.close();13})();14 {15 },16 {17 }
Using AI Code Generation
1const { chromium } = require('playwright');2const { getNextLanes } = require('playwright/lib/protocol/channels');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 const [frame] = await page.frames();8 const lanes = await getNextLanes(frame);9 console.log(lanes);10 await browser.close();11})();12[ { id: '0', name: 'default', frames: [ [Object] ] } ]
Using AI Code Generation
1const { chromium } = require('playwright');2const { getNextLanes } = require('playwright/lib/server/supplements/recorder/recorderSupplement');3(async () => {4 const browser = await chromium.launch();5 const page = await browser.newPage();6 const lanes = await getNextLanes(page);7 console.log(lanes);8 await browser.close();9})();10 {11 {12 args: { selector: '[aria-label="Google apps"]' },13 {14 args: { selector: 'text=Google apps' },15 }16 },17 {18 args: { selector: 'text=Google apps' },19 }20 }21SyntaxError: Cannot use import statement outside a module22const { chromium } = require('playwright');23(async () => {24 const browser = await chromium.launch();25 const page = await browser.newPage();26 await page.screenshot({ path: `example.png` });27 await browser.close();28})();29SyntaxError: Cannot use import statement outside a module30const { chromium } = require('playwright');
Using AI Code Generation
1const { getNextLanes } = require('playwright/lib/protocol/protocol');2const { chromium } = require('playwright');3const fs = require('fs');4const path = require('path');5(async () => {6 const browser = await chromium.launch();7 const context = await browser.newContext();8 const page = await context.newPage();9 await page.waitForTimeout(2000);10 const cdpSession = await page.context().newCDPSession(page);11 const { lanes } = await cdpSession.send('Network.getNextLanes', {12 });13 fs.writeFileSync(14 path.join(__dirname, 'lanes.json'),15 JSON.stringify(lanes, null, 2)16 );17 await browser.close();18})();19 {20 "data": {21 "request": {22 "headers": {23 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/89.0.4389.0 Safari/537.36",24 "Accept-Language": "en-US,en;q=0.9",25 },26 },27 "initiator": {28 },29 "timing": {
Using AI Code Generation
1const { getNextLanes } = require('playwright/lib/traceViewer/traceModel');2const model = new TraceModel(traceEvents);3const lanes = getNextLanes(model, 0);4console.log(lanes);5const { getNextLanes } = require('playwright/lib/traceViewer/traceModel');6const model = new TraceModel(traceEvents);7const lanes = getNextLanes(model, 1);8console.log(lanes);9const { getNextLanes } = require('playwright/lib/traceViewer/traceModel');10const model = new TraceModel(traceEvents);11const lanes = getNextLanes(model, 2);12console.log(lanes);13const { getNextLanes } = require('playwright/lib/traceViewer/traceModel');14const model = new TraceModel(traceEvents);15const lanes = getNextLanes(model, 3);16console.log(lanes);17const { getNextLanes } = require('playwright/lib/traceViewer/traceModel');18const model = new TraceModel(traceEvents);19const lanes = getNextLanes(model, 4);20console.log(lanes);21const { getNextLanes } = require('playwright/lib/traceViewer/traceModel');22const model = new TraceModel(traceEvents);23const lanes = getNextLanes(model, 5);24console.log(lanes);
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!!