diff options
Diffstat (limited to 'Source/WebInspectorUI/UserInterface/Views/ContentView.js')
-rw-r--r-- | Source/WebInspectorUI/UserInterface/Views/ContentView.js | 431 |
1 files changed, 431 insertions, 0 deletions
diff --git a/Source/WebInspectorUI/UserInterface/Views/ContentView.js b/Source/WebInspectorUI/UserInterface/Views/ContentView.js new file mode 100644 index 000000000..4d5afa8f4 --- /dev/null +++ b/Source/WebInspectorUI/UserInterface/Views/ContentView.js @@ -0,0 +1,431 @@ +/* + * Copyright (C) 2013, 2015 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 INC. 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 INC. 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. + */ + +WebInspector.ContentView = class ContentView extends WebInspector.View +{ + constructor(representedObject, extraArguments) + { + // Concrete object instantiation. + console.assert(!representedObject || WebInspector.ContentView.isViewable(representedObject), representedObject); + + super(); + + this._representedObject = representedObject; + + this.element.classList.add("content-view"); + + this._parentContainer = null; + } + + // Static + + static createFromRepresentedObject(representedObject, extraArguments) + { + console.assert(representedObject); + + if (representedObject instanceof WebInspector.Frame) + return new WebInspector.ResourceClusterContentView(representedObject.mainResource, extraArguments); + + if (representedObject instanceof WebInspector.Resource) + return new WebInspector.ResourceClusterContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.Script) + return new WebInspector.ScriptContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.TimelineRecording) + return new WebInspector.TimelineRecordingContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.Timeline) { + var timelineType = representedObject.type; + if (timelineType === WebInspector.TimelineRecord.Type.Network) + return new WebInspector.NetworkTimelineView(representedObject, extraArguments); + + if (timelineType === WebInspector.TimelineRecord.Type.Layout) + return new WebInspector.LayoutTimelineView(representedObject, extraArguments); + + if (timelineType === WebInspector.TimelineRecord.Type.Script) + return new WebInspector.ScriptClusterTimelineView(representedObject, extraArguments); + + if (timelineType === WebInspector.TimelineRecord.Type.RenderingFrame) + return new WebInspector.RenderingFrameTimelineView(representedObject, extraArguments); + + if (timelineType === WebInspector.TimelineRecord.Type.Memory) + return new WebInspector.MemoryTimelineView(representedObject, extraArguments); + + if (timelineType === WebInspector.TimelineRecord.Type.HeapAllocations) + return new WebInspector.HeapAllocationsTimelineView(representedObject, extraArguments); + } + + if (representedObject instanceof WebInspector.Breakpoint || representedObject instanceof WebInspector.IssueMessage) { + if (representedObject.sourceCodeLocation) + return WebInspector.ContentView.createFromRepresentedObject(representedObject.sourceCodeLocation.displaySourceCode, extraArguments); + } + + if (representedObject instanceof WebInspector.DOMStorageObject) + return new WebInspector.DOMStorageContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.CookieStorageObject) + return new WebInspector.CookieStorageContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.DatabaseTableObject) + return new WebInspector.DatabaseTableContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.DatabaseObject) + return new WebInspector.DatabaseContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.IndexedDatabaseObjectStore) + return new WebInspector.IndexedDatabaseObjectStoreContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.IndexedDatabaseObjectStoreIndex) + return new WebInspector.IndexedDatabaseObjectStoreContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.ApplicationCacheFrame) + return new WebInspector.ApplicationCacheFrameContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.DOMTree) + return new WebInspector.FrameDOMTreeContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.DOMSearchMatchObject) { + var resultView = new WebInspector.FrameDOMTreeContentView(WebInspector.frameResourceManager.mainFrame.domTree, extraArguments); + resultView.restoreFromCookie({nodeToSelect: representedObject.domNode}); + return resultView; + } + + if (representedObject instanceof WebInspector.SourceCodeSearchMatchObject) { + var resultView; + if (representedObject.sourceCode instanceof WebInspector.Resource) + resultView = new WebInspector.ResourceClusterContentView(representedObject.sourceCode, extraArguments); + else if (representedObject.sourceCode instanceof WebInspector.Script) + resultView = new WebInspector.ScriptContentView(representedObject.sourceCode, extraArguments); + else + console.error("Unknown SourceCode", representedObject.sourceCode); + + var textRangeToSelect = representedObject.sourceCodeTextRange.formattedTextRange; + var startPosition = textRangeToSelect.startPosition(); + resultView.restoreFromCookie({lineNumber: startPosition.lineNumber, columnNumber: startPosition.columnNumber}); + + return resultView; + } + + if (representedObject instanceof WebInspector.LogObject) + return new WebInspector.LogContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.ContentFlow) + return new WebInspector.ContentFlowDOMTreeContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.CallingContextTree) + return new WebInspector.ProfileView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.HeapSnapshotProxy || representedObject instanceof WebInspector.HeapSnapshotDiffProxy) + return new WebInspector.HeapSnapshotClusterContentView(representedObject, extraArguments); + + if (representedObject instanceof WebInspector.Collection) + return new WebInspector.CollectionContentView(representedObject, extraArguments); + + if (typeof representedObject === "string" || representedObject instanceof String) + return new WebInspector.TextContentView(representedObject, extraArguments); + + console.assert(!WebInspector.ContentView.isViewable(representedObject)); + + throw new Error("Can't make a ContentView for an unknown representedObject of type: " + representedObject.constructor.name); + } + + static contentViewForRepresentedObject(representedObject, onlyExisting, extraArguments) + { + console.assert(representedObject); + + // Some represented objects attempt to resolve a better represented object. + // This may result in null, for example a Breakpoint which doesn't have a SourceCode. + let resolvedRepresentedObject = WebInspector.ContentView.resolvedRepresentedObjectForRepresentedObject(representedObject); + if (!resolvedRepresentedObject) + return null; + + let existingContentView = resolvedRepresentedObject[WebInspector.ContentView.ContentViewForRepresentedObjectSymbol]; + console.assert(!existingContentView || existingContentView instanceof WebInspector.ContentView); + if (existingContentView) + return existingContentView; + + if (onlyExisting) + return null; + + let newContentView = WebInspector.ContentView.createFromRepresentedObject(representedObject, extraArguments); + console.assert(newContentView instanceof WebInspector.ContentView); + if (!newContentView) + return null; + + console.assert(newContentView.representedObject === resolvedRepresentedObject, "createFromRepresentedObject and resolvedRepresentedObjectForRepresentedObject are out of sync for type", representedObject.constructor.name); + newContentView.representedObject[WebInspector.ContentView.ContentViewForRepresentedObjectSymbol] = newContentView; + return newContentView; + } + + static closedContentViewForRepresentedObject(representedObject) + { + let resolvedRepresentedObject = WebInspector.ContentView.resolvedRepresentedObjectForRepresentedObject(representedObject); + resolvedRepresentedObject[WebInspector.ContentView.ContentViewForRepresentedObjectSymbol] = null; + } + + static resolvedRepresentedObjectForRepresentedObject(representedObject) + { + if (representedObject instanceof WebInspector.Frame) + return representedObject.mainResource; + + if (representedObject instanceof WebInspector.Breakpoint || representedObject instanceof WebInspector.IssueMessage) { + if (representedObject.sourceCodeLocation) + return representedObject.sourceCodeLocation.displaySourceCode; + } + + if (representedObject instanceof WebInspector.DOMSearchMatchObject) + return WebInspector.frameResourceManager.mainFrame.domTree; + + if (representedObject instanceof WebInspector.SourceCodeSearchMatchObject) + return representedObject.sourceCode; + + return representedObject; + } + + static isViewable(representedObject) + { + if (representedObject instanceof WebInspector.Frame) + return true; + if (representedObject instanceof WebInspector.Resource) + return true; + if (representedObject instanceof WebInspector.Script) + return true; + if (representedObject instanceof WebInspector.TimelineRecording) + return true; + if (representedObject instanceof WebInspector.Timeline) + return true; + if (representedObject instanceof WebInspector.Breakpoint || representedObject instanceof WebInspector.IssueMessage) + return representedObject.sourceCodeLocation; + if (representedObject instanceof WebInspector.DOMStorageObject) + return true; + if (representedObject instanceof WebInspector.CookieStorageObject) + return true; + if (representedObject instanceof WebInspector.DatabaseTableObject) + return true; + if (representedObject instanceof WebInspector.DatabaseObject) + return true; + if (representedObject instanceof WebInspector.IndexedDatabaseObjectStore) + return true; + if (representedObject instanceof WebInspector.IndexedDatabaseObjectStoreIndex) + return true; + if (representedObject instanceof WebInspector.ApplicationCacheFrame) + return true; + if (representedObject instanceof WebInspector.DOMTree) + return true; + if (representedObject instanceof WebInspector.DOMSearchMatchObject) + return true; + if (representedObject instanceof WebInspector.SourceCodeSearchMatchObject) + return true; + if (representedObject instanceof WebInspector.LogObject) + return true; + if (representedObject instanceof WebInspector.ContentFlow) + return true; + if (representedObject instanceof WebInspector.CallingContextTree) + return true; + if (representedObject instanceof WebInspector.HeapSnapshotProxy || representedObject instanceof WebInspector.HeapSnapshotDiffProxy) + return true; + if (representedObject instanceof WebInspector.Collection) + return true; + if (typeof representedObject === "string" || representedObject instanceof String) + return true; + return false; + } + + // Public + + get representedObject() + { + return this._representedObject; + } + + get navigationItems() + { + // Navigation items that will be displayed by the ContentBrowser instance, + // meant to be subclassed. Implemented by subclasses. + return []; + } + + get parentContainer() + { + return this._parentContainer; + } + + get visible() + { + return this._visible; + } + + set visible(flag) + { + this._visible = flag; + } + + get scrollableElements() + { + // Implemented by subclasses. + return []; + } + + get shouldKeepElementsScrolledToBottom() + { + // Implemented by subclasses. + return false; + } + + get selectionPathComponents() + { + // Implemented by subclasses. + return []; + } + + get supplementalRepresentedObjects() + { + // Implemented by subclasses. + return []; + } + + get supportsSplitContentBrowser() + { + // Implemented by subclasses. + return WebInspector.dockedConfigurationSupportsSplitContentBrowser(); + } + + shown() + { + // Implemented by subclasses. + } + + hidden() + { + // Implemented by subclasses. + } + + closed() + { + // Implemented by subclasses. + } + + saveToCookie(cookie) + { + // Implemented by subclasses. + } + + restoreFromCookie(cookie) + { + // Implemented by subclasses. + } + + canGoBack() + { + // Implemented by subclasses. + return false; + } + + canGoForward() + { + // Implemented by subclasses. + return false; + } + + goBack() + { + // Implemented by subclasses. + } + + goForward() + { + // Implemented by subclasses. + } + + get supportsSearch() + { + // Implemented by subclasses. + return false; + } + + get supportsCustomFindBanner() + { + // Implemented by subclasses. + return false; + } + + showCustomFindBanner() + { + // Implemented by subclasses. + } + + get numberOfSearchResults() + { + // Implemented by subclasses. + return null; + } + + get hasPerformedSearch() + { + // Implemented by subclasses. + return false; + } + + set automaticallyRevealFirstSearchResult(reveal) + { + // Implemented by subclasses. + } + + performSearch(query) + { + // Implemented by subclasses. + } + + searchCleared() + { + // Implemented by subclasses. + } + + searchQueryWithSelection() + { + // Implemented by subclasses. + return null; + } + + revealPreviousSearchResult(changeFocus) + { + // Implemented by subclasses. + } + + revealNextSearchResult(changeFocus) + { + // Implemented by subclasses. + } +}; + +WebInspector.ContentView.Event = { + SelectionPathComponentsDidChange: "content-view-selection-path-components-did-change", + SupplementalRepresentedObjectsDidChange: "content-view-supplemental-represented-objects-did-change", + NumberOfSearchResultsDidChange: "content-view-number-of-search-results-did-change", + NavigationItemsDidChange: "content-view-navigation-items-did-change" +}; + +WebInspector.ContentView.ContentViewForRepresentedObjectSymbol = Symbol("content-view-for-represented-object"); |