배경 작업을 위해 모든 웹 뷰의 제한을 계속 풀어 두면 메모리와 전력 정책이 흔들릴 수 있다. 반대로 제한을 한 번도 풀지 않으면 사이트가 네이티브 입력 뒤 프레임에서 결과를 반영하지 못할 수 있다. 북극성에서는 입력하는 짧은 구간을 거래처럼 다뤄 이전 설정을 기억하고 돌려놓았다.
켜야 할 상태를 추측하지 않고 먼저 읽는다
act는 현재 getBackgroundThrottling 값을 읽는다. 작업 전에 check를 통과한 뒤 throttling을 잠시 false로 두고 페이지 focus emulation을 켠다. 원래 값이 true라고 가정해 마지막에 무조건 true를 쓰는 방식이 아니다. 호출 전 상태를 실제로 읽었기 때문에 다른 설정으로 시작한 경우도 그 값으로 돌아갈 수 있다.
포커스 모방은 운영체제 창을 활성화하는 동작과 다르다. 사용자가 다른 앱에서 작업하고 있어도 기존 브라우저 창을 앞으로 뺏어 오는 기능을 추가하지 않았다. 하지만 이 예외가 어떤 페이지든 입력할 권한을 만드는 것은 아니다. 실제 행동은 actNow의 현재 대상과 문서·가림 검사 안에서 수행한다.
성공 반환 뒤가 아니라 finally에서 정리한다
설정 복원은 finally에 있다. 정상 입력뿐 아니라 actNow의 가림 오류나 취소에서도 지나가야 하는 위치다. emulated가 실제로 켜진 경우에만 해제 요청을 하고 contents가 이미 파괴됐는지도 본다. 더 이상 유효하지 않은 네이티브 객체를 무조건 조작하지 않으려는 순서다.
focus emulation 해제 요청은 실패를 잡아 정리 흐름을 계속하고 원래 throttling 복원을 시도한다. 다만 contents가 사라졌거나 해제 요청이 실패한 모든 경우를 새 상태 조회로 입증한 것은 아니다. finally가 있다는 사실을 어떠한 장애에서도 복원이 인증됐다는 말로 확대하지 않는다. 코드가 시도하는 정리와 확인한 시험을 나눠 설명한다.
사이트 자체의 후속 프레임을 짧게 기다린다
네이티브 입력 직후 사이트가 requestAnimationFrame에서 내용을 확정할 수 있다. 현재 정리는 두 번의 frame 콜백이나 150밀리초 타이머 중 먼저 끝나는 제한된 기다림을 둔다. evaluate 자체에도 제한이 있다. 문서가 이동하거나 프레임이 없어지는 경우에 끝없이 기다리지 않기 위한 조건이다.
이 동작은 숨긴 노드를 CSS로 드러내거나 입력값을 DOM에 몰래 대입하는 방식이 아니다. 사이트가 원래 가진 입력 처리와 화면 갱신이 진행될 짧은 기회를 주는 것이다. 기다림이 끝났다고 서비스 저장까지 완료됐다는 뜻도 아니다. 실제 입력값 확인과 업무 결과는 뒤의 각 검증이 맡는다.
읽기 예외와 입력 예외의 수명도 다르다
verifyField는 실제 입력을 보내는 act 경로의 거래를 건너뛰어 읽기 검사로 처리한다. observe에는 요소가 없지만 대화상자 흔적이 있고 문서 준비가 끝난 경우의 별도 예외가 있다. 짧은 시간 동안 throttling을 풀어 사이트가 그릴 기회를 주고 원래 값으로 돌린다.
관찰을 읽기 위해 추가 클릭이나 휠 이벤트를 보내지 않는다. 입력 예외의 focus emulation과 같은 기능으로 설명해서도 안 된다. 둘 다 잠깐 설정을 바꾸지만 시작 조건·하는 일·복원 위치가 다르다. 나는 예외를 전역 설정으로 넓히지 않고 어떤 수명 안에서 무엇만 허용하는지 읽을 수 있게 했다.
시험에서는 숨김과 설정이 그대로인지도 본다
기존 background 입력 시험은 iframe의 실제 결과와 한 번의 commits를 확인한 뒤 창의 hidden과 throttled 상태를 처음과 비교한다. overlay를 넣어 실패한 경우에도 상태가 같은지 본다. 결과만 맞았지만 사용자 창을 앞으로 띄웠다면 이 계약에서는 보존을 설명할 수 없다.
이번에는 해당 소스와 제어된 시험을 읽었고 원래 창을 숨기거나 실제 입력을 새로 보내지 않았다. 공유 캐시 예제 역시 포커스와 렌더링 거래를 구현하지 않는다. 다른 자동화에 적용할 때 가져갈 것은 무조건 제한을 푸는 설정이 아니라 이전 상태 읽기, 좁은 실행 범위, 성공·실패 공통 정리와 보존 확인의 순서다.