Contents

window 下的 api 分类整理笔记

Contents

window 下的 api 主要分为 ECMAScript API、DOM API、HTML API(其实很多 API 都算是包含在 HTML API 里的,只不过被细分出来,比如 DOM API)、CSSOM 相关的 API,以及剩余的占绝大多数的 Web api(有被纳入规范的和未被纳入规范的,这些 API 都是为浏览器提供特定的功能,比如音视频相关、蓝牙相关等)。这些 Web API 由可能最先由某个组织(比如 W3C、WHATWG、WICG 等)提出,然后被浏览器厂商实现(不一定被纳入标准)。

CSSOM View API 为 DOM 的 element 扩展了一些与 view 相关的(比如距离、长宽之类)的属性和方法。

// appVersion: "5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36"

;(function f() {
  const allPropsNames = {
    ecma: [
      'Object',
      'Function',
      'Array',
      'Number',
      'parseFloat',
      'parseInt',
      'Infinity',
      'NaN',
      'undefined',
      'Boolean',
      'String',
      'Symbol',
      'Date',
      'Promise',
      'RegExp',
      'Error',
      'EvalError',
      'RangeError',
      'ReferenceError',
      'SyntaxError',
      'TypeError',
      'URIError',
      'AggregateError',
      'globalThis',
      'JSON',
      'Math',
      'Intl',
      'ArrayBuffer',
      'Uint8Array',
      'Int8Array',
      'Uint16Array',
      'Int16Array',
      'Uint32Array',
      'Int32Array',
      'Float32Array',
      'Float64Array',
      'Uint8ClampedArray',
      'BigUint64Array',
      'BigInt64Array',
      'DataView',
      'Map',
      'BigInt',
      'Set',
      'WeakMap',
      'WeakSet',
      'Proxy',
      'Reflect',
      'Atomics',
      'FinalizationRegistry',
      'WeakRef',
      'decodeURI',
      'decodeURIComponent',
      'encodeURI',
      'encodeURIComponent',
      'escape',
      'unescape',
      'eval',
      'isFinite',
      'isNaN'
    ],
    dom: [
      'Event',
      'CustomEvent',
      'EventTarget',
      'AbortController',
      'AbortSignal',
      'NodeList',
      'HTMLCollection',
      'MutationObserver',
      'MutationRecord',
      'Node',
      'Document',
      'DOMImplementation',
      'DocumentType',
      'DocumentFragment',
      'ShadowRoot',
      'Element',
      'NamedNodeMap',
      'Attr',
      'CharacterData',
      'Text',
      'CDATASection',
      'ProcessingInstruction',
      'Comment',
      'AbstractRange',
      'StaticRange',
      'Range',
      'NodeIterator',
      'TreeWalker',
      'NodeFilter',
      'DOMTokenList',
      'XPathResult',
      'XPathExpression',
      'XPathEvaluator',
      'XSLTProcessor',
      'DOMError',
      'XMLDocument'
    ],
    html: [
      'BarProp',
      'BeforeUnloadEvent',
      'BroadcastChannel',
      'CanvasGradient',
      'CanvasPattern',
      'CanvasRenderingContext2D',
      'CloseEvent',
      'CustomElementRegistry',
      'DOMParser',
      'DOMStringList',
      'DOMStringMap',
      'DataTransfer',
      'DataTransferItem',
      'DataTransferItemList',
      'DragEvent',
      'ElementInternals',
      'ErrorEvent',
      'EventSource',
      'External',
      'FormDataEvent',
      'HTMLDocument',
      'HTMLAllCollection',
      'HTMLAnchorElement',
      'HTMLAreaElement',
      'HTMLAudioElement',
      'HTMLBRElement',
      'HTMLBaseElement',
      'HTMLBodyElement',
      'HTMLButtonElement',
      'HTMLCanvasElement',
      'HTMLDListElement',
      'HTMLDataElement',
      'HTMLDataListElement',
      'HTMLDetailsElement',
      'HTMLDialogElement',
      'HTMLDirectoryElement',
      'HTMLDivElement',
      'HTMLElement',
      'HTMLEmbedElement',
      'HTMLFieldSetElement',
      'HTMLFontElement',
      'HTMLFormControlsCollection',
      'HTMLFormElement',
      'HTMLFrameElement',
      'HTMLFrameSetElement',
      'HTMLHRElement',
      'HTMLHeadElement',
      'HTMLHeadingElement',
      'HTMLHtmlElement',
      'HTMLIFrameElement',
      'HTMLImageElement',
      'HTMLInputElement',
      'HTMLLIElement',
      'HTMLLabelElement',
      'HTMLLegendElement',
      'HTMLLinkElement',
      'HTMLMapElement',
      'HTMLMarqueeElement',
      'HTMLMediaElement',
      'HTMLMenuElement',
      'HTMLMetaElement',
      'HTMLMeterElement',
      'HTMLModElement',
      'HTMLOListElement',
      'HTMLObjectElement',
      'HTMLOptGroupElement',
      'HTMLOptionElement',
      'HTMLOptionsCollection',
      'HTMLOutputElement',
      'HTMLParagraphElement',
      'HTMLParamElement',
      'HTMLPictureElement',
      'HTMLPreElement',
      'HTMLProgressElement',
      'HTMLQuoteElement',
      'HTMLScriptElement',
      'HTMLSelectElement',
      'HTMLSlotElement',
      'HTMLSourceElement',
      'HTMLSpanElement',
      'HTMLStyleElement',
      'HTMLTableCaptionElement',
      'HTMLTableCellElement',
      'HTMLTableColElement',
      'HTMLTableElement',
      'HTMLTableRowElement',
      'HTMLTableSectionElement',
      'HTMLTemplateElement',
      'HTMLTextAreaElement',
      'HTMLTimeElement',
      'HTMLTitleElement',
      'HTMLTrackElement',
      'HTMLUListElement',
      'HTMLUnknownElement',
      'HTMLVideoElement',
      'HashChangeEvent',
      'History',
      'ImageBitmap',
      'ImageBitmapRenderingContext',
      'ImageData',
      'Location',
      'MediaError',
      'MessageChannel',
      'MessageEvent',
      'MessagePort',
      'MimeType',
      'MimeTypeArray',
      'Navigator',
      'OffscreenCanvas',
      'OffscreenCanvasRenderingContext2D',
      'PageTransitionEvent',
      'Path2D',
      'Plugin',
      'PluginArray',
      'PopStateEvent',
      'PromiseRejectionEvent',
      'RadioNodeList',
      'SharedWorker',
      'Storage',
      'StorageEvent',
      'SubmitEvent',
      'TextMetrics',
      'TextTrack',
      'TextTrackCue',
      'TextTrackCueList',
      'TextTrackList',
      'TimeRanges',
      'TrackEvent',
      'ValidityState',
      'WebSocket',
      'Window',
      'Worker',
      'Worklet',
      'Option',
      'Image',
      'Audio'
    ],
    cssom: [
      'MediaList',
      'getComputedStyle',
      'StyleSheet',
      'CSSStyleSheet',
      'StyleSheetList',
      'CSSRuleList',
      'CSSRule',
      'CSSStyleRule',
      'CSSImportRule',
      'CSSGroupingRule',
      'CSSPageRule',
      'CSSNamespaceRule',
      'CSSStyleDeclaration',
      'CSS',
      'CSSMediaRule',
      'CSSConditionRule',
      'CSSSupportsRule',
      'MediaQueryListEvent',
      'MediaQueryList',
      'scroll',
      'screenLeft',
      'screenTop'
    ],
    cssomView: [
      'matchMedia',
      'screen',
      'moveTo',
      'moveBy',
      'scrollTo',
      'scrollBy',
      'resizeTo',
      'resizeBy',
      'innerWidth',
      'innerHeight',
      'scrollX',
      'pageXOffset',
      'scrollY',
      'pageYOffset',
      'screenX',
      'screenY',
      'outerWidth',
      'outerHeight',
      'devicePixelRatio',
      'Screen'
    ],
    xmlHttpRequest: [
      'FormData',
      'XMLHttpRequest',
      'XMLHttpRequestEventTarget',
      'XMLHttpRequestUpload',
      'ProgressEvent'
    ],
    fetch: ['fetch', 'Response', 'Request', 'Headers'],
    webgl: [
      'WebGLBuffer',
      'WebGLFramebuffer',
      'WebGLProgram',
      'WebGLRenderbuffer',
      'WebGLShader',
      'WebGLTexture',
      'WebGLUniformLocation',
      'WebGLActiveInfo',
      'WebGLShaderPrecisionFormat',
      'WebGLRenderingContext',
      'WebGLContextEvent',
      'WebGLQuery',
      'WebGLSampler',
      'WebGLSync',
      'WebGLTransformFeedback',
      'WebGLVertexArrayObject',
      'WebGL2RenderingContext'
    ],
    worker: [
      'ServiceWorker',
      'ServiceWorkerContainer',
      'ServiceWorkerRegistration',
      'NavigationPreloadManager'
    ],
    cssTypedOm: [
      'CSSStyleValue',
      'StylePropertyMapReadOnly',
      'StylePropertyMap',
      'CSSUnparsedValue',
      'CSSVariableReferenceValue',
      'CSSKeywordValue',
      'CSSNumericValue',
      'CSSUnitValue',
      'CSSMathValue',
      'CSSMathSum',
      'CSSMathProduct',
      'CSSMathNegate',
      'CSSMathInvert',
      'CSSMathMin',
      'CSSMathMax',
      'CSSNumericArray',
      'CSSTransformValue',
      'CSSTransformComponent',
      'CSSTranslate',
      'CSSRotate',
      'CSSScale',
      'CSSSkew',
      'CSSSkewX',
      'CSSSkewY',
      'CSSPerspective',
      'CSSMatrixComponent',
      'CSSPositionValue',
      'CSSImageValue'
    ],
    webIdl: ['DOMException'],
    url: ['URL', 'URLSearchParams'],
    streams: [
      'ReadableStream',
      'ReadableStreamDefaultReader',
      'ReadableStreamBYOBReader',
      'ReadableStreamDefaultController',
      'ReadableByteStreamController',
      'ReadableStreamBYOBRequest',
      'WritableStream',
      'WritableStreamDefaultWriter',
      'WritableStreamDefaultController',
      'TransformStream',
      'ByteLengthQueuingStrategy',
      'CountQueuingStrategy'
    ],
    storage: ['StorageManager'],
    notification: ['Notification'],
    encode: [
      'TextDecoder',
      'TextEncoder',
      'TextDecoderStream',
      'TextEncoderStream'
    ],
    backgroundFetch: [
      'BackgroundFetchManager',
      'BackgroundFetchRegistration',
      'BackgroundFetchRecord'
    ],
    backgroundTask: ['IdleDeadline'],
    bluetooth: [
      'Bluetooth',
      'BluetoothCharacteristicProperties',
      'BluetoothDevice',
      'BluetoothRemoteGATTCharacteristic',
      'BluetoothRemoteGATTDescriptor',
      'BluetoothRemoteGATTServer',
      'BluetoothRemoteGATTService',
      'BluetoothUUID'
    ],
    cssRules: [
      'CSSPropertyRule',
      'CSSKeyframesRule',
      'CSSKeyframeRule',
      'CSSFontFaceRule',
      'CSSCounterStyleRule'
    ],
    fontFaceLoad: ['FontFaceSetLoadEvent', 'FontFace'],
    clipboard: ['Clipboard', 'ClipboardItem', 'ClipboardEvent'],
    credential: [
      'Credential',
      'FederatedCredential',
      'PasswordCredential',
      'PublicKeyCredential'
    ],
    encryptedMediaExtensions: [
      'MediaKeys',
      'MediaKeySession',
      'MediaKeyStatusMap',
      'MediaKeySystemAccess',
      'MediaKeyMessageEvent',
      'MediaEncryptedEvent'
    ],
    fileSystemAccess: [
      'FileSystemHandle',
      'FileSystemFileHandle',
      'FileSystemDirectoryHandle',
      'FileSystemWritableFileStream',
      'showOpenFilePicker',
      'showSaveFilePicker',
      'showDirectoryPicker'
    ],
    gamePad: [
      'Gamepad',
      'GamepadButton',
      'GamepadEvent',
      'GamepadHapticActuator'
    ],
    geo: [
      'Geolocation',
      'GeolocationCoordinates',
      'GeolocationPosition',
      'GeolocationPositionError'
    ],
    indexDB: [
      'IDBCursor',
      'IDBCursorWithValue',
      'IDBDatabase',
      'IDBFactory',
      'IDBIndex',
      'IDBKeyRange',
      'IDBObjectStore',
      'IDBOpenDBRequest',
      'IDBRequest',
      'IDBTransaction',
      'IDBVersionChangeEvent'
    ],
    mediaStream: [
      'BlobEvent',
      'MediaDevices',
      'MediaStream',
      'MediaStreamTrack',
      'MediaStreamTrackEvent'
    ],
    webVTT: ['VTTCue'],
    webHID: ['HID', 'HIDDevice', 'HIDInputReportEvent', 'HIDConnectionEvent'],
    webCodecs: [
      'AudioData',
      'AudioDecoder',
      'AudioEncoder',
      'EncodedAudioChunk',
      'EncodedVideoChunk',
      'ImageDecoder',
      'ImageTrack',
      'ImageTrackList',
      'VideoDecoder',
      'VideoEncoder',
      'VideoColorSpace',
      'VideoFrame'
    ],
    webSpeech: [
      'SpeechSynthesisErrorEvent',
      'SpeechSynthesisEvent',
      'SpeechSynthesisUtterance'
    ],
    webMIDI: [
      'MIDIInputMap',
      'MIDIOutputMap',
      'MIDIAccess',
      'MIDIPort',
      'MIDIInput',
      'MIDIOutput',
      'MIDIMessageEvent',
      'MIDIConnectionEvent'
    ],
    webCrypto: ['Crypto', 'CryptoKey', 'SubtleCrypto'],
    webAuth: [
      'CredentialsContainer',
      'AuthenticatorResponse',
      'AuthenticatorAttestationResponse',
      'AuthenticatorAssertionResponse'
    ],
    webAudio: [
      'AnalyserNode',
      'AudioBuffer',
      'AudioBufferSourceNode',
      'AudioContext',
      'AudioDestinationNode',
      'AudioListener',
      'AudioNode',
      'AudioParam',
      'AudioProcessingEvent',
      'AudioScheduledSourceNode',
      'AudioWorklet',
      'AudioWorkletNode',
      'BaseAudioContext',
      'BiquadFilterNode',
      'ChannelMergerNode',
      'ChannelSplitterNode',
      'ConstantSourceNode',
      'ConvolverNode',
      'DelayNode',
      'DynamicsCompressorNode',
      'GainNode',
      'IIRFilterNode',
      'MediaElementAudioSourceNode',
      'MediaStreamAudioDestinationNode',
      'MediaStreamAudioSourceNode',
      'OfflineAudioCompletionEvent',
      'OfflineAudioContext',
      'OscillatorNode',
      'PannerNode',
      'PeriodicWave',
      'WaveShaperNode',
      'StereoPannerNode'
    ],
    webAnimation: [
      'Animation',
      'AnimationEffect',
      'AnimationEvent',
      'AnimationTimeline',
      'AnimationPlaybackEvent',
      'DocumentTimeline',
      'KeyframeEffect'
    ],
    touchEvent: ['Touch', 'TouchEvent', 'TouchList'],
    serviceWorker: [
      'Cache',
      'CacheStorage',
      'PeriodicSyncManager',
      'SyncManager'
    ],
    sensor: [
      'AbsoluteOrientationSensor',
      'Accelerometer',
      'GravitySensor',
      'Gyroscope',
      'LinearAccelerationSensor',
      'OrientationSensor',
      'RelativeOrientationSensor',
      'Sensor',
      'SensorErrorEvent'
    ],
    wakeLock: ['WakeLock', 'WakeLockSentinel'],
    payment: [
      'PaymentAddress',
      'PaymentMethodChangeEvent',
      'PaymentRequest',
      'PaymentRequestUpdateEvent',
      'PaymentResponse',
      'PaymentManager',
      'PaymentInstruments'
    ],
    presentation: [
      'Presentation',
      'PresentationAvailability',
      'PresentationRequest',
      'PresentationConnectionAvailableEvent',
      'PresentationConnection',
      'PresentationConnectionCloseEvent',
      'PresentationReceiver',
      'PresentationConnectionList'
    ],
    geometry: [
      'DOMRectReadOnly',
      'DOMRect',
      'DOMRectList',
      'DOMQuad',
      'DOMMatrixReadOnly',
      'DOMMatrix',
      'DOMPointReadOnly',
      'DOMPoint'
    ],
    trustedType: [
      'TrustedHTML',
      'TrustedScript',
      'TrustedScriptURL',
      'TrustedTypePolicyFactory',
      'TrustedTypePolicy'
    ],
    wasm: ['WebAssembly'],
    file: ['Blob', 'File', 'FileList', 'FileReader'],
    deviceOrientation: [
      'DeviceOrientationEvent',
      'DeviceMotionEventAcceleration',
      'DeviceMotionEventRotationRate',
      'DeviceMotionEvent'
    ],
    push: ['PushManager', 'PushSubscription', 'PushSubscriptionOptions'],
    lqbz: [
      ...['RemotePlayback'],
      ...['ImageCapture'],
      ...['IntersectionObserver', 'IntersectionObserverEntry'],
      ...['LayoutShift', 'LayoutShiftAttribution'],
      ...['PerformanceLongTaskTiming', 'TaskAttributionTiming'],
      ...['MediaCapabilities'],
      ...['MediaMetadata', 'MediaSession'],
      ...[
        'MediaSource',
        'SourceBuffer',
        'SourceBufferList',
        'VideoPlaybackQuality'
      ],
      ...['MediaRecorder'],
      ...['VisualViewport'],
      ...['URLPattern'],
      ...['ScreenOrientation'],
      ...['ResizeObserver', 'ResizeObserverEntry', 'ResizeObserverSize'],
      ...['NetworkInformation'],
      ...['Permissions', 'PermissionStatus'],
      ...['PictureInPictureWindow', 'PictureInPictureEvent'],
      ...['XMLSerializer'],
      ...['TransitionEvent'],
      ...['Selection'],
      ...['SecurityPolicyViolationEvent'],
      ...['ScriptProcessorNode'],
      ...['OverconstrainedError'],
      ...['CSSAnimation', 'CSSTransition'],
      ...['ReportingObserver'],
      ...['MutationEvent'],
      ...['MediaStreamEvent'],
      ...['LargestContentfulPaint'],
      // media-capture
      ...[
        'InputDeviceInfo',
        'InputDeviceCapabilities',
        'CanvasCaptureMediaStreamTrack',
        'MediaDeviceInfo'
      ],
      ...['FeaturePolicy'],
      // w3c community
      ...['DecompressionStream', 'CompressionStream'],
      ...['CookieChangeEvent', 'CookieStore', 'CookieStoreManager'],
      ...['Keyboard', 'KeyboardLayoutMap'],
      ...['NavigatorManagedData'],
      ...['BarcodeDetector'],
      ...['IdleDetector'],
      ...['OTPCredential'],
      ...['CustomStateSet'],
      ...['NavigatorUAData'],
      ...['BatteryManager'],
      ...['BeforeInstallPromptEvent'],
      ...['AudioParamMap'],
      ...['Lock', 'LockManager'],
      ...['VirtualKeyboard']
    ],
    unknown: [
      ...['UserActivation'],
      ...['TaskController', 'TaskPriorityChangeEvent', 'TaskSignal'],
      ...['EventCounts'],
      ...['EyeDropper'],
      ...['FragmentDirective'],
      ...['MediaStreamTrackGenerator', 'MediaStreamTrackProcessor'],
      ...['Profiler'],
      ...['Scheduling'],
      ...['VirtualKeyboardGeometryChangeEvent'],
      ...['DelegatedInkTrailPresenter', 'Ink'], // wicg
      ...['Scheduler'],
      ...['JSCompiler_renameProperty'],
      ...['ShadyCSS'],
      ...[
        'clientInformation',
        'offscreenBuffering',
        'styleMedia',
        'originAgentCluster',
        'trustedTypes',
        'scheduler',
        'openDatabase'
      ]
    ],
    svg: [],
    xr: [],
    webRTC: [],
    performance: [],
    webkit: [],
    usb: [],
    serial: [],
    eventAttr: [],
    uiEvent: [],
    windowProps: []
  }

  let props = Object.getOwnPropertyNames(window)
  Object.keys(allPropsNames).forEach(name => {
    props = filterBFromA(props, allPropsNames[name])
  })

  allPropsNames.svg = props.filter(i => i.startsWith('SVG'))
  props = filterBFromA(props, allPropsNames.svg)

  allPropsNames.xr = props.filter(i => i.startsWith('XR'))
  props = filterBFromA(props, allPropsNames.xr)

  allPropsNames.webkit = props.filter(
    i => i.includes('WebKit') || i.includes('webkit')
  )
  props = filterBFromA(props, allPropsNames.webkit)

  allPropsNames.webRTC = props.filter(i => i.startsWith('RTC'))
  props = filterBFromA(props, allPropsNames.webRTC)

  allPropsNames.usb = props.filter(i => i.startsWith('USB'))
  props = filterBFromA(props, allPropsNames.usb)

  allPropsNames.serial = props.filter(i => i.startsWith('Serial'))
  props = filterBFromA(props, allPropsNames.serial)

  allPropsNames.performance = props.filter(i => i.startsWith('Performance'))
  props = filterBFromA(props, allPropsNames.performance)

  allPropsNames.eventAttr = props.filter(i => i.startsWith('on'))
  props = filterBFromA(props, allPropsNames.eventAttr)

  allPropsNames.uiEvent = props.filter(
    i =>
      i === 'UIEvent' || (window[i] && window[i].prototype instanceof UIEvent)
  )
  props = filterBFromA(props, allPropsNames.uiEvent)

  allPropsNames.windowProps = props.filter(
    n =>
      97 <= n[0].charCodeAt() &&
      n[0].charCodeAt() <= 122 &&
      !Object.keys(console).includes(n) &&
      ![
        'cr',
        'keys',
        'values',
        'undebug',
        'monitor',
        'unmonitor',
        'inspect',
        'copy',
        'queryObjects',
        'getEventListeners',
        'getAccessibleName',
        'getAccessibleRole',
        'monitorEvents',
        'unmonitorEvents'
      ].includes(n)
  )
  props = filterBFromA(props, allPropsNames.windowProps)

  console.log(allPropsNames)

  console.log(props)

  console.log(
    props.length +
      Object.keys(allPropsNames).reduce(
        (acc, cur) => acc + allPropsNames[cur].length,
        0
      )
  )

  function filterBFromA(a, b) {
    return a.filter(i => !b.includes(i))
  }
})()