/* * Copyright (C) 2012 Google Inc. All rights reserved. * Copyright (C) 2013, 2014 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. */ #ifndef Internals_h #define Internals_h #include "CSSComputedStyleDeclaration.h" #include "ContextDestructionObserver.h" #include "ExceptionCodePlaceholder.h" #include "NodeList.h" #include "PageConsoleClient.h" #include #include #include #include #include #include namespace WebCore { class AudioContext; class ClientRect; class ClientRectList; class DOMPath; class DOMStringList; class DOMWindow; class Document; class Element; class File; class Frame; class HTMLMediaElement; class InspectorFrontendChannelDummy; class InspectorFrontendClientDummy; class InternalSettings; class MallocStatistics; class MediaSession; class MemoryInfo; class Node; class Page; class Range; class RenderedDocumentMarker; class ScriptExecutionContext; class SerializedScriptValue; class SourceBuffer; class TimeRanges; class TypeConversions; class XMLHttpRequest; #if ENABLE(CONTENT_FILTERING) class MockContentFilterSettings; #endif typedef int ExceptionCode; class Internals : public RefCounted , public ContextDestructionObserver { public: static PassRefPtr create(Document*); virtual ~Internals(); static void resetToConsistentState(Page*); String elementRenderTreeAsText(Element*, ExceptionCode&); bool hasPausedImageAnimations(Element*, ExceptionCode&); String address(Node*); bool nodeNeedsStyleRecalc(Node*, ExceptionCode&); String description(Deprecated::ScriptValue); bool isPreloaded(const String& url); bool isLoadingFromMemoryCache(const String& url); String xhrResponseSource(XMLHttpRequest*); bool isSharingStyleSheetContents(Element* linkA, Element* linkB); bool isStyleSheetLoadingSubresources(Element* link); void setOverrideCachePolicy(const String&); void setOverrideResourceLoadPriority(const String&); void clearMemoryCache(); void pruneMemoryCacheToSize(unsigned size); unsigned memoryCacheSize() const; void clearPageCache(); unsigned pageCacheSize() const; PassRefPtr computedStyleIncludingVisitedInfo(Node*, ExceptionCode&) const; Node* ensureShadowRoot(Element* host, ExceptionCode&); Node* ensureUserAgentShadowRoot(Element* host, ExceptionCode&); Node* createShadowRoot(Element* host, ExceptionCode&); Node* shadowRoot(Element* host, ExceptionCode&); String shadowRootType(const Node*, ExceptionCode&) const; Element* includerFor(Node*, ExceptionCode&); String shadowPseudoId(Element*, ExceptionCode&); void setShadowPseudoId(Element*, const String&, ExceptionCode&); // DOMTimers throttling testing. bool isTimerThrottled(int timeoutId, ExceptionCode&); bool isRequestAnimationFrameThrottled() const; bool areTimersThrottled() const; // Spatial Navigation testing. unsigned lastSpatialNavigationCandidateCount(ExceptionCode&) const; // CSS Animation testing. unsigned numberOfActiveAnimations() const; bool animationsAreSuspended(ExceptionCode&) const; void suspendAnimations(ExceptionCode&) const; void resumeAnimations(ExceptionCode&) const; bool pauseAnimationAtTimeOnElement(const String& animationName, double pauseTime, Element*, ExceptionCode&); bool pauseAnimationAtTimeOnPseudoElement(const String& animationName, double pauseTime, Element*, const String& pseudoId, ExceptionCode&); // CSS Transition testing. bool pauseTransitionAtTimeOnElement(const String& propertyName, double pauseTime, Element*, ExceptionCode&); bool pauseTransitionAtTimeOnPseudoElement(const String& property, double pauseTime, Element*, const String& pseudoId, ExceptionCode&); Node* treeScopeRootNode(Node*, ExceptionCode&); Node* parentTreeScope(Node*, ExceptionCode&); bool attached(Node*, ExceptionCode&); String visiblePlaceholder(Element*); #if ENABLE(INPUT_TYPE_COLOR) void selectColorInColorChooser(Element*, const String& colorValue); #endif Vector formControlStateOfPreviousHistoryItem(ExceptionCode&); void setFormControlStateOfPreviousHistoryItem(const Vector&, ExceptionCode&); Ref absoluteCaretBounds(ExceptionCode&); Ref boundingBox(Element*, ExceptionCode&); Ref inspectorHighlightRects(ExceptionCode&); String inspectorHighlightObject(ExceptionCode&); unsigned markerCountForNode(Node*, const String&, ExceptionCode&); PassRefPtr markerRangeForNode(Node*, const String& markerType, unsigned index, ExceptionCode&); String markerDescriptionForNode(Node*, const String& markerType, unsigned index, ExceptionCode&); void addTextMatchMarker(const Range*, bool isActive); void setMarkedTextMatchesAreHighlighted(bool, ExceptionCode&); void invalidateFontCache(); void setScrollViewPosition(long x, long y, ExceptionCode&); void setViewBaseBackgroundColor(const String& colorValue, ExceptionCode&); void setPagination(const String& mode, int gap, ExceptionCode& ec) { setPagination(mode, gap, 0, ec); } void setPagination(const String& mode, int gap, int pageLength, ExceptionCode&); String configurationForViewport(float devicePixelRatio, int deviceWidth, int deviceHeight, int availableWidth, int availableHeight, ExceptionCode&); bool wasLastChangeUserEdit(Element* textField, ExceptionCode&); bool elementShouldAutoComplete(Element* inputElement, ExceptionCode&); void setEditingValue(Element* inputElement, const String&, ExceptionCode&); void setAutofilled(Element*, bool enabled, ExceptionCode&); void setShowAutoFillButton(Element*, bool enabled, ExceptionCode&); void scrollElementToRect(Element*, long x, long y, long w, long h, ExceptionCode&); void paintControlTints(ExceptionCode&); PassRefPtr rangeFromLocationAndLength(Element* scope, int rangeLocation, int rangeLength, ExceptionCode&); unsigned locationFromRange(Element* scope, const Range*, ExceptionCode&); unsigned lengthFromRange(Element* scope, const Range*, ExceptionCode&); String rangeAsText(const Range*, ExceptionCode&); PassRefPtr subrange(Range* range, int rangeLocation, int rangeLength, ExceptionCode&); RefPtr rangeForDictionaryLookupAtLocation(int x, int y, ExceptionCode&); void setDelegatesScrolling(bool enabled, ExceptionCode&); int lastSpellCheckRequestSequence(ExceptionCode&); int lastSpellCheckProcessedSequence(ExceptionCode&); Vector userPreferredLanguages() const; void setUserPreferredLanguages(const Vector&); Vector userPreferredAudioCharacteristics() const; void setUserPreferredAudioCharacteristic(const String&); unsigned wheelEventHandlerCount(ExceptionCode&); unsigned touchEventHandlerCount(ExceptionCode&); PassRefPtr nodesFromRect(Document*, int x, int y, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping, bool allowShadowContent, bool allowChildFrameContent, ExceptionCode&) const; String parserMetaData(Deprecated::ScriptValue = Deprecated::ScriptValue()); void updateEditorUINowIfScheduled(); bool hasSpellingMarker(int from, int length, ExceptionCode&); bool hasGrammarMarker(int from, int length, ExceptionCode&); bool hasAutocorrectedMarker(int from, int length, ExceptionCode&); void setContinuousSpellCheckingEnabled(bool enabled, ExceptionCode&); void setAutomaticQuoteSubstitutionEnabled(bool enabled, ExceptionCode&); void setAutomaticLinkDetectionEnabled(bool enabled, ExceptionCode&); void setAutomaticDashSubstitutionEnabled(bool enabled, ExceptionCode&); void setAutomaticTextReplacementEnabled(bool enabled, ExceptionCode&); void setAutomaticSpellingCorrectionEnabled(bool enabled, ExceptionCode&); bool isOverwriteModeEnabled(ExceptionCode&); void toggleOverwriteModeEnabled(ExceptionCode&); unsigned countMatchesForText(const String&, unsigned findOptions, const String& markMatches, ExceptionCode&); unsigned numberOfScrollableAreas(ExceptionCode&); bool isPageBoxVisible(int pageNumber, ExceptionCode&); static const char* internalsId; InternalSettings* settings() const; unsigned workerThreadCount() const; void setBatteryStatus(const String& eventType, bool charging, double chargingTime, double dischargingTime, double level, ExceptionCode&); void setDeviceProximity(const String& eventType, double value, double min, double max, ExceptionCode&); 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 }; String layerTreeAsText(Document*, unsigned flags, ExceptionCode&) const; String layerTreeAsText(Document*, ExceptionCode&) const; String repaintRectsAsText(ExceptionCode&) const; String scrollingStateTreeAsText(ExceptionCode&) const; String mainThreadScrollingReasons(ExceptionCode&) const; RefPtr nonFastScrollableRects(ExceptionCode&) const; void garbageCollectDocumentResources(ExceptionCode&) const; void allowRoundingHacks() const; void insertAuthorCSS(const String&, ExceptionCode&) const; void insertUserCSS(const String&, ExceptionCode&) const; const ProfilesArray& consoleProfiles() const; unsigned numberOfLiveNodes() const; unsigned numberOfLiveDocuments() const; Vector consoleMessageArgumentCounts() const; PassRefPtr openDummyInspectorFrontend(const String& url); void closeDummyInspectorFrontend(); void setJavaScriptProfilingEnabled(bool enabled, ExceptionCode&); void setInspectorIsUnderTest(bool isUnderTest, ExceptionCode&); String counterValue(Element*); int pageNumber(Element*, float pageWidth = 800, float pageHeight = 600); Vector shortcutIconURLs() const; int numberOfPages(float pageWidthInPixels = 800, float pageHeightInPixels = 600); String pageProperty(String, int, ExceptionCode& = ASSERT_NO_EXCEPTION) const; String pageSizeAndMarginsInPixels(int, int, int, int, int, int, int, ExceptionCode& = ASSERT_NO_EXCEPTION) const; void setPageScaleFactor(float scaleFactor, int x, int y, ExceptionCode&); void setPageZoomFactor(float zoomFactor, ExceptionCode&); void setUseFixedLayout(bool useFixedLayout, ExceptionCode&); void setFixedLayoutSize(int width, int height, ExceptionCode&); 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); PassRefPtr mallocStatistics() const; PassRefPtr typeConversions() const; PassRefPtr memoryInfo() const; Vector getReferencedFilePaths() const; void startTrackingRepaints(ExceptionCode&); void stopTrackingRepaints(ExceptionCode&); void startTrackingLayerFlushes(ExceptionCode&); unsigned long layerFlushCount(ExceptionCode&); void startTrackingStyleRecalcs(ExceptionCode&); unsigned long styleRecalcCount(ExceptionCode&); void startTrackingCompositingUpdates(ExceptionCode&); unsigned long compositingUpdateCount(ExceptionCode&); void updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(ExceptionCode&); void updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(Node*, ExceptionCode&); unsigned layoutCount() const; PassRefPtr serializeObject(PassRefPtr) const; PassRefPtr deserializeBuffer(PassRefPtr) const; bool isFromCurrentWorld(Deprecated::ScriptValue) const; void setUsesOverlayScrollbars(bool enabled); String getCurrentCursorInfo(ExceptionCode&); String markerTextForListItem(Element*, ExceptionCode&); String toolTipFromElement(Element*, ExceptionCode&) const; void forceReload(bool endToEnd); #if ENABLE(ENCRYPTED_MEDIA_V2) void initializeMockCDM(); #endif #if ENABLE(SPEECH_SYNTHESIS) void enableMockSpeechSynthesizer(); #endif #if ENABLE(MEDIA_STREAM) void enableMockRTCPeerConnectionHandler(); #endif String getImageSourceURL(Element*, ExceptionCode&); #if ENABLE(VIDEO) void simulateAudioInterruption(Node*); bool mediaElementHasCharacteristic(Node*, const String&, ExceptionCode&); #endif bool isSelectPopupVisible(Node*); String captionsStyleSheetOverride(ExceptionCode&); void setCaptionsStyleSheetOverride(const String&, ExceptionCode&); void setPrimaryAudioTrackLanguageOverride(const String&, ExceptionCode&); void setCaptionDisplayMode(const String&, ExceptionCode&); #if ENABLE(VIDEO) PassRefPtr createTimeRanges(Float32Array* startTimes, Float32Array* endTimes); double closestTimeToTimeRanges(double time, TimeRanges*); #endif Ref selectionBounds(ExceptionCode&); #if ENABLE(VIBRATION) bool isVibrating(); #endif bool isPluginUnavailabilityIndicatorObscured(Element*, ExceptionCode&); bool isPluginSnapshotted(Element*, ExceptionCode&); #if ENABLE(MEDIA_SOURCE) WEBCORE_TESTSUPPORT_EXPORT void initializeMockMediaSource(); Vector bufferedSamplesForTrackID(SourceBuffer*, const AtomicString&); #endif #if ENABLE(VIDEO) void beginMediaSessionInterruption(); void endMediaSessionInterruption(const String&); void applicationWillEnterForeground() const; void applicationWillEnterBackground() const; void setMediaSessionRestrictions(const String& mediaType, const String& restrictions, ExceptionCode&); void setMediaElementRestrictions(HTMLMediaElement*, const String& restrictions, ExceptionCode&); void postRemoteControlCommand(const String&, ExceptionCode&); bool elementIsBlockingDisplaySleep(Element*) const; #endif #if ENABLE(MEDIA_SESSION) void sendMediaSessionStartOfInterruptionNotification(const String&); void sendMediaSessionEndOfInterruptionNotification(const String&); String mediaSessionCurrentState(MediaSession*) const; #endif #if ENABLE(WEB_AUDIO) void setAudioContextRestrictions(AudioContext*, const String& restrictions, ExceptionCode&); #endif void simulateSystemSleep() const; void simulateSystemWake() const; void installMockPageOverlay(const String& overlayType, ExceptionCode&); String pageOverlayLayerTreeAsText(ExceptionCode&) const; void setPageMuted(bool); bool isPagePlayingAudio(); RefPtr createFile(const String&); void queueMicroTask(int); bool testPreloaderSettingViewport(); #if ENABLE(CONTENT_FILTERING) MockContentFilterSettings& mockContentFilterSettings(); #endif #if ENABLE(CSS_SCROLL_SNAP) String scrollSnapOffsets(Element*, ExceptionCode&); #endif String pathStringWithShrinkWrappedRects(Vector rectComponents, double radius, ExceptionCode&); private: explicit Internals(Document*); Document* contextDocument() const; Frame* frame() const; RenderedDocumentMarker* markerAt(Node*, const String& markerType, unsigned index, ExceptionCode&); RefPtr m_frontendWindow; std::unique_ptr m_frontendClient; std::unique_ptr m_frontendChannel; }; } // namespace WebCore #endif