/* * Copyright (C) 2012 Google Inc. All rights reserved. * Copyright (C) 2013-2017 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include "CSSComputedStyleDeclaration.h" #include "ContextDestructionObserver.h" #include "ExceptionOr.h" #include "PageConsoleClient.h" #include #if ENABLE(MEDIA_SESSION) #include "MediaSessionInterruptionProvider.h" #endif namespace WebCore { class AudioContext; class ClientRect; class ClientRectList; class DOMURL; class DOMWindow; class Document; class Element; class File; class Frame; class GCObservation; class HTMLImageElement; class HTMLInputElement; class HTMLLinkElement; class HTMLMediaElement; class HTMLSelectElement; class InspectorStubFrontend; class InternalSettings; class MallocStatistics; class MediaSession; class MemoryInfo; class MockCDMFactory; class MockContentFilterSettings; class MockPageOverlay; class NodeList; class Page; class Range; class RenderedDocumentMarker; class RTCPeerConnection; class SerializedScriptValue; class SourceBuffer; class StyleSheet; class TimeRanges; class TypeConversions; class XMLHttpRequest; class Internals final : public RefCounted, private ContextDestructionObserver { public: static Ref create(Document&); virtual ~Internals(); static void resetToConsistentState(Page&); ExceptionOr elementRenderTreeAsText(Element&); bool hasPausedImageAnimations(Element&); String address(Node&); bool nodeNeedsStyleRecalc(Node&); String styleChangeType(Node&); String description(JSC::JSValue); bool isPreloaded(const String& url); bool isLoadingFromMemoryCache(const String& url); String xhrResponseSource(XMLHttpRequest&); bool isSharingStyleSheetContents(HTMLLinkElement&, HTMLLinkElement&); bool isStyleSheetLoadingSubresources(HTMLLinkElement&); enum class CachePolicy { UseProtocolCachePolicy, ReloadIgnoringCacheData, ReturnCacheDataElseLoad, ReturnCacheDataDontLoad }; void setOverrideCachePolicy(CachePolicy); ExceptionOr setCanShowModalDialogOverride(bool allow); enum class ResourceLoadPriority { ResourceLoadPriorityVeryLow, ResourceLoadPriorityLow, ResourceLoadPriorityMedium, ResourceLoadPriorityHigh, ResourceLoadPriorityVeryHigh }; void setOverrideResourceLoadPriority(ResourceLoadPriority); void setStrictRawResourceValidationPolicyDisabled(bool); void clearMemoryCache(); void pruneMemoryCacheToSize(unsigned size); unsigned memoryCacheSize() const; unsigned imageFrameIndex(HTMLImageElement&); void setImageFrameDecodingDuration(HTMLImageElement&, float duration); void resetImageAnimation(HTMLImageElement&); void clearPageCache(); unsigned pageCacheSize() const; void disableTileSizeUpdateDelay(); Ref computedStyleIncludingVisitedInfo(Element&) const; Node* ensureUserAgentShadowRoot(Element& host); Node* shadowRoot(Element& host); ExceptionOr shadowRootType(const Node&) const; String shadowPseudoId(Element&); void setShadowPseudoId(Element&, const String&); // CSS Deferred Parsing Testing unsigned deferredStyleRulesCount(StyleSheet&); unsigned deferredGroupRulesCount(StyleSheet&); unsigned deferredKeyframesRulesCount(StyleSheet&); // DOMTimers throttling testing. ExceptionOr isTimerThrottled(int timeoutId); bool isRequestAnimationFrameThrottled() const; bool areTimersThrottled() const; enum EventThrottlingBehavior { Responsive, Unresponsive }; void setEventThrottlingBehaviorOverride(std::optional); std::optional eventThrottlingBehaviorOverride() const; // Spatial Navigation testing. ExceptionOr lastSpatialNavigationCandidateCount() const; // CSS Animation testing. unsigned numberOfActiveAnimations() const; ExceptionOr animationsAreSuspended() const; ExceptionOr suspendAnimations() const; ExceptionOr resumeAnimations() const; ExceptionOr pauseAnimationAtTimeOnElement(const String& animationName, double pauseTime, Element&); ExceptionOr pauseAnimationAtTimeOnPseudoElement(const String& animationName, double pauseTime, Element&, const String& pseudoId); // CSS Transition testing. ExceptionOr pauseTransitionAtTimeOnElement(const String& propertyName, double pauseTime, Element&); ExceptionOr pauseTransitionAtTimeOnPseudoElement(const String& property, double pauseTime, Element&, const String& pseudoId); Node* treeScopeRootNode(Node&); Node* parentTreeScope(Node&); String visiblePlaceholder(Element&); void selectColorInColorChooser(HTMLInputElement&, const String& colorValue); ExceptionOr> formControlStateOfPreviousHistoryItem(); ExceptionOr setFormControlStateOfPreviousHistoryItem(const Vector&); ExceptionOr> absoluteCaretBounds(); Ref boundingBox(Element&); ExceptionOr> inspectorHighlightRects(); ExceptionOr inspectorHighlightObject(); ExceptionOr markerCountForNode(Node&, const String&); ExceptionOr> markerRangeForNode(Node&, const String& markerType, unsigned index); ExceptionOr markerDescriptionForNode(Node&, const String& markerType, unsigned index); ExceptionOr dumpMarkerRects(const String& markerType); void addTextMatchMarker(const Range&, bool isActive); ExceptionOr setMarkedTextMatchesAreHighlighted(bool); void invalidateFontCache(); ExceptionOr setScrollViewPosition(int x, int y); ExceptionOr> layoutViewportRect(); ExceptionOr> visualViewportRect(); ExceptionOr setViewBaseBackgroundColor(const String& colorValue); ExceptionOr setPagination(const String& mode, int gap, int pageLength); ExceptionOr setPaginationLineGridEnabled(bool); ExceptionOr configurationForViewport(float devicePixelRatio, int deviceWidth, int deviceHeight, int availableWidth, int availableHeight); ExceptionOr wasLastChangeUserEdit(Element& textField); bool elementShouldAutoComplete(HTMLInputElement&); void setEditingValue(HTMLInputElement&, const String&); void setAutofilled(HTMLInputElement&, bool enabled); enum class AutoFillButtonType { AutoFillButtonTypeNone, AutoFillButtonTypeContacts, AutoFillButtonTypeCredentials }; void setShowAutoFillButton(HTMLInputElement&, AutoFillButtonType); ExceptionOr scrollElementToRect(Element&, int x, int y, int w, int h); ExceptionOr autofillFieldName(Element&); ExceptionOr paintControlTints(); RefPtr rangeFromLocationAndLength(Element& scope, int rangeLocation, int rangeLength); unsigned locationFromRange(Element& scope, const Range&); unsigned lengthFromRange(Element& scope, const Range&); String rangeAsText(const Range&); Ref subrange(Range&, int rangeLocation, int rangeLength); ExceptionOr> rangeForDictionaryLookupAtLocation(int x, int y); RefPtr rangeOfStringNearLocation(const Range&, const String&, unsigned); ExceptionOr setDelegatesScrolling(bool enabled); ExceptionOr lastSpellCheckRequestSequence(); ExceptionOr lastSpellCheckProcessedSequence(); Vector userPreferredLanguages() const; void setUserPreferredLanguages(const Vector&); Vector userPreferredAudioCharacteristics() const; void setUserPreferredAudioCharacteristic(const String&); ExceptionOr wheelEventHandlerCount(); ExceptionOr touchEventHandlerCount(); ExceptionOr> nodesFromRect(Document&, int x, int y, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping, bool allowShadowContent, bool allowChildFrameContent) const; String parserMetaData(JSC::JSValue = JSC::JSValue::JSUndefined); void updateEditorUINowIfScheduled(); bool hasSpellingMarker(int from, int length); bool hasGrammarMarker(int from, int length); bool hasAutocorrectedMarker(int from, int length); void setContinuousSpellCheckingEnabled(bool); void setAutomaticQuoteSubstitutionEnabled(bool); void setAutomaticLinkDetectionEnabled(bool); void setAutomaticDashSubstitutionEnabled(bool); void setAutomaticTextReplacementEnabled(bool); void setAutomaticSpellingCorrectionEnabled(bool); void handleAcceptedCandidate(const String& candidate, unsigned location, unsigned length); bool isOverwriteModeEnabled(); void toggleOverwriteModeEnabled(); ExceptionOr> rangeOfString(const String&, RefPtr&&, const Vector& findOptions); ExceptionOr countMatchesForText(const String&, const Vector& findOptions, const String& markMatches); ExceptionOr countFindMatches(const String&, const Vector& findOptions); unsigned numberOfScrollableAreas(); ExceptionOr isPageBoxVisible(int pageNumber); static const char* internalsId; InternalSettings* settings() const; unsigned workerThreadCount() const; bool areSVGAnimationsPaused() const; ExceptionOr setDeviceProximity(const String& eventType, double value, double min, double max); enum { // Values need to be kept in sync with Internals.idl. LAYER_TREE_INCLUDES_VISIBLE_RECTS = 1, LAYER_TREE_INCLUDES_TILE_CACHES = 2, LAYER_TREE_INCLUDES_REPAINT_RECTS = 4, LAYER_TREE_INCLUDES_PAINTING_PHASES = 8, LAYER_TREE_INCLUDES_CONTENT_LAYERS = 16, LAYER_TREE_INCLUDES_ACCELERATES_DRAWING = 32, }; ExceptionOr layerTreeAsText(Document&, unsigned short flags) const; ExceptionOr repaintRectsAsText() const; ExceptionOr scrollingStateTreeAsText() const; ExceptionOr mainThreadScrollingReasons() const; ExceptionOr> nonFastScrollableRects() const; ExceptionOr setElementUsesDisplayListDrawing(Element&, bool usesDisplayListDrawing); ExceptionOr setElementTracksDisplayListReplay(Element&, bool isTrackingReplay); enum { // Values need to be kept in sync with Internals.idl. DISPLAY_LIST_INCLUDES_PLATFORM_OPERATIONS = 1, }; ExceptionOr displayListForElement(Element&, unsigned short flags); ExceptionOr replayDisplayListForElement(Element&, unsigned short flags); ExceptionOr garbageCollectDocumentResources() const; void beginSimulatedMemoryPressure(); void endSimulatedMemoryPressure(); bool isUnderMemoryPressure(); ExceptionOr insertAuthorCSS(const String&) const; ExceptionOr insertUserCSS(const String&) const; unsigned numberOfLiveNodes() const; unsigned numberOfLiveDocuments() const; RefPtr openDummyInspectorFrontend(const String& url); void closeDummyInspectorFrontend(); ExceptionOr setInspectorIsUnderTest(bool); String counterValue(Element&); int pageNumber(Element&, float pageWidth = 800, float pageHeight = 600); Vector shortcutIconURLs() const; int numberOfPages(float pageWidthInPixels = 800, float pageHeightInPixels = 600); ExceptionOr pageProperty(const String& propertyName, int pageNumber) const; ExceptionOr pageSizeAndMarginsInPixels(int pageNumber, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft) const; ExceptionOr pageScaleFactor() const; ExceptionOr setPageScaleFactor(float scaleFactor, int x, int y); ExceptionOr setPageZoomFactor(float); ExceptionOr setTextZoomFactor(float); ExceptionOr setUseFixedLayout(bool); ExceptionOr setFixedLayoutSize(int width, int height); ExceptionOr setViewExposedRect(float left, float top, float width, float height); void setHeaderHeight(float); void setFooterHeight(float); void setTopContentInset(float); #if ENABLE(FULLSCREEN_API) void webkitWillEnterFullScreenForElement(Element&); void webkitDidEnterFullScreenForElement(Element&); void webkitWillExitFullScreenForElement(Element&); void webkitDidExitFullScreenForElement(Element&); #endif WEBCORE_TESTSUPPORT_EXPORT void setApplicationCacheOriginQuota(unsigned long long); void registerURLSchemeAsBypassingContentSecurityPolicy(const String& scheme); void removeURLSchemeRegisteredAsBypassingContentSecurityPolicy(const String& scheme); void registerDefaultPortForProtocol(unsigned short port, const String& protocol); Ref mallocStatistics() const; Ref typeConversions() const; Ref memoryInfo() const; Vector getReferencedFilePaths() const; ExceptionOr startTrackingRepaints(); ExceptionOr stopTrackingRepaints(); ExceptionOr startTrackingLayerFlushes(); ExceptionOr layerFlushCount(); ExceptionOr startTrackingStyleRecalcs(); ExceptionOr styleRecalcCount(); unsigned lastStyleUpdateSize() const; ExceptionOr startTrackingCompositingUpdates(); ExceptionOr compositingUpdateCount(); ExceptionOr updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(Node*); unsigned layoutCount() const; Ref serializeObject(const RefPtr&) const; Ref deserializeBuffer(ArrayBuffer&) const; bool isFromCurrentWorld(JSC::JSValue) const; void setUsesOverlayScrollbars(bool); void setUsesMockScrollAnimator(bool); ExceptionOr getCurrentCursorInfo(); String markerTextForListItem(Element&); String toolTipFromElement(Element&) const; void forceReload(bool endToEnd); void enableAutoSizeMode(bool enabled, int minimumWidth, int minimumHeight, int maximumWidth, int maximumHeight); #if ENABLE(LEGACY_ENCRYPTED_MEDIA) void initializeMockCDM(); #endif #if ENABLE(ENCRYPTED_MEDIA) Ref registerMockCDM(); #endif #if ENABLE(SPEECH_SYNTHESIS) void enableMockSpeechSynthesizer(); #endif #if ENABLE(MEDIA_STREAM) void setMockMediaCaptureDevicesEnabled(bool); #endif #if ENABLE(WEB_RTC) void enableMockMediaEndpoint(); void enableMockRTCPeerConnectionHandler(); void emulateRTCPeerConnectionPlatformEvent(RTCPeerConnection&, const String& action); void useMockRTCPeerConnectionFactory(const String&); #endif String getImageSourceURL(Element&); #if ENABLE(VIDEO) void simulateAudioInterruption(HTMLMediaElement&); ExceptionOr mediaElementHasCharacteristic(HTMLMediaElement&, const String&); #endif bool isSelectPopupVisible(HTMLSelectElement&); ExceptionOr captionsStyleSheetOverride(); ExceptionOr setCaptionsStyleSheetOverride(const String&); ExceptionOr setPrimaryAudioTrackLanguageOverride(const String&); ExceptionOr setCaptionDisplayMode(const String&); #if ENABLE(VIDEO) Ref createTimeRanges(Float32Array& startTimes, Float32Array& endTimes); double closestTimeToTimeRanges(double time, TimeRanges&); #endif ExceptionOr> selectionBounds(); #if ENABLE(VIBRATION) bool isVibrating(); #endif ExceptionOr isPluginUnavailabilityIndicatorObscured(Element&); bool isPluginSnapshotted(Element&); #if ENABLE(MEDIA_SOURCE) WEBCORE_TESTSUPPORT_EXPORT void initializeMockMediaSource(); Vector bufferedSamplesForTrackID(SourceBuffer&, const AtomicString&); Vector enqueuedSamplesForTrackID(SourceBuffer&, const AtomicString&); void setShouldGenerateTimestamps(SourceBuffer&, bool); #endif #if ENABLE(VIDEO) ExceptionOr beginMediaSessionInterruption(const String&); void endMediaSessionInterruption(const String&); void applicationDidEnterForeground() const; void applicationWillEnterBackground() const; ExceptionOr setMediaSessionRestrictions(const String& mediaType, const String& restrictions); ExceptionOr mediaSessionRestrictions(const String& mediaType) const; void setMediaElementRestrictions(HTMLMediaElement&, const String& restrictions); ExceptionOr postRemoteControlCommand(const String&, float argument); bool elementIsBlockingDisplaySleep(HTMLMediaElement&) const; #endif #if ENABLE(MEDIA_SESSION) void sendMediaSessionStartOfInterruptionNotification(MediaSessionInterruptingCategory); void sendMediaSessionEndOfInterruptionNotification(MediaSessionInterruptingCategory); String mediaSessionCurrentState(MediaSession&) const; double mediaElementPlayerVolume(HTMLMediaElement&) const; enum class MediaControlEvent { PlayPause, NextTrack, PreviousTrack }; void sendMediaControlEvent(MediaControlEvent); #endif #if ENABLE(WIRELESS_PLAYBACK_TARGET) void setMockMediaPlaybackTargetPickerEnabled(bool); ExceptionOr setMockMediaPlaybackTargetPickerState(const String& deviceName, const String& deviceState); #endif #if ENABLE(WEB_AUDIO) void setAudioContextRestrictions(AudioContext&, const String& restrictions); #endif void simulateSystemSleep() const; void simulateSystemWake() const; enum class PageOverlayType { View, Document }; ExceptionOr> installMockPageOverlay(PageOverlayType); ExceptionOr pageOverlayLayerTreeAsText(unsigned short flags) const; void setPageMuted(const String&); String pageMediaState(); void setPageDefersLoading(bool); RefPtr createFile(const String&); void queueMicroTask(int); bool testPreloaderSettingViewport(); #if ENABLE(CONTENT_FILTERING) MockContentFilterSettings& mockContentFilterSettings(); #endif #if ENABLE(CSS_SCROLL_SNAP) ExceptionOr scrollSnapOffsets(Element&); void setPlatformMomentumScrollingPredictionEnabled(bool); #endif ExceptionOr pathStringWithShrinkWrappedRects(const Vector& rectComponents, double radius); String getCurrentMediaControlsStatusForElement(HTMLMediaElement&); String userVisibleString(const DOMURL&); void setShowAllPlugins(bool); String resourceLoadStatisticsForOrigin(const String& origin); void setResourceLoadStatisticsEnabled(bool); #if ENABLE(READABLE_STREAM_API) bool isReadableStreamDisturbed(JSC::ExecState&, JSC::JSValue); #endif String composedTreeAsText(Node&); bool isProcessingUserGesture(); RefPtr observeGC(JSC::JSValue); enum class UserInterfaceLayoutDirection { LTR, RTL }; void setUserInterfaceLayoutDirection(UserInterfaceLayoutDirection); bool userPrefersReducedMotion() const; void reportBacktrace(); enum class BaseWritingDirection { Natural, Ltr, Rtl }; void setBaseWritingDirection(BaseWritingDirection); #if ENABLE(POINTER_LOCK) bool pageHasPendingPointerLock() const; bool pageHasPointerLock() const; #endif Vector accessKeyModifiers() const; #if PLATFORM(IOS) void setQuickLookPassword(const String&); #endif void setAsRunningUserScripts(Document&); private: explicit Internals(Document&); Document* contextDocument() const; Frame* frame() const; ExceptionOr markerAt(Node&, const String& markerType, unsigned index); std::unique_ptr m_inspectorFrontend; }; } // namespace WebCore