blob: d96f32c021da8c4841a6c60114cdac24faa965b2 [file] [log] [blame]
/*
* Copyright (C) 2013 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.FrameContentView = function(frame)
{
WebInspector.ClusterContentView.call(this, frame);
this._frame = frame;
function createPathComponent(displayName, className, identifier)
{
var pathComponent = new WebInspector.HierarchicalPathComponent(displayName, className, identifier, false, true);
pathComponent.addEventListener(WebInspector.HierarchicalPathComponent.Event.SiblingWasSelected, this._pathComponentSelected, this);
return pathComponent;
}
this._sourceCodePathComponent = createPathComponent.call(this, WebInspector.UIString("Source Code"), WebInspector.FrameContentView.SourceCodeIconStyleClassName, WebInspector.FrameContentView.SourceCodeIdentifier);
this._domTreePathComponent = createPathComponent.call(this, WebInspector.UIString("DOM Tree"), WebInspector.FrameContentView.DOMTreeIconStyleClassName, WebInspector.FrameContentView.DOMTreeIdentifier);
this._sourceCodePathComponent.nextSibling = this._domTreePathComponent;
this._domTreePathComponent.previousSibling = this._sourceCodePathComponent;
this.element.classList.add(WebInspector.FrameContentView.StyleClassName);
this._currentContentViewSetting = new WebInspector.Setting("frame-current-view-" + this._frame.url.hash, WebInspector.FrameContentView.DOMTreeIdentifier);
};
WebInspector.FrameContentView.StyleClassName = "frame";
WebInspector.FrameContentView.SourceCodeIconStyleClassName = "source-code-icon";
WebInspector.FrameContentView.SourceCodeIdentifier = "source-code";
WebInspector.FrameContentView.DOMTreeIconStyleClassName = "dom-tree-icon";
WebInspector.FrameContentView.DOMTreeIdentifier = "dom-tree";
WebInspector.FrameContentView.prototype = {
constructor: WebInspector.FrameContentView,
// Public
get frame()
{
return this._frame;
},
get selectionPathComponents()
{
if (!this._contentViewContainer.currentContentView)
return [];
// Append the current view's path components to the path component representing the current view.
var components = [this._pathComponentForContentView(this._contentViewContainer.currentContentView)];
return components.concat(this._contentViewContainer.currentContentView.selectionPathComponents);
},
shown: function()
{
WebInspector.ClusterContentView.prototype.shown.call(this);
if (this._shownInitialContent)
return;
this._showContentViewForIdentifier(this._currentContentViewSetting.value);
},
closed: function()
{
WebInspector.ClusterContentView.prototype.closed.call(this);
this._shownInitialContent = false;
},
saveToCookie: function(cookie)
{
cookie.type = WebInspector.ContentViewCookieType.Resource;
cookie.subview = this._currentContentViewSetting.value;
if (!this.representedObject.isMainFrame())
cookie.url = this.representedObject.url;
},
restoreFromCookie: function(cookie)
{
var shownView = this._showContentViewForIdentifier(cookie.subview);
if ("lineNumber" in cookie && "columnNumber" in cookie)
this.showSourceCode(new WebInspector.SourceCodePosition(cookie.lineNumber, cookie.columnNumber));
},
showResource: function()
{
this._shownInitialContent = true;
return this._showContentViewForIdentifier(WebInspector.FrameContentView.SourceCodeIdentifier);
},
showSourceCode: function(positionToReveal, textRangeToSelect, forceUnformatted)
{
var resourceContentView = this.showResource();
console.assert(resourceContentView instanceof WebInspector.ResourceClusterContentView);
if (!resourceContentView)
return null;
return resourceContentView.showResponse(positionToReveal, textRangeToSelect, forceUnformatted);
},
showDOMTree: function(domNodeToSelect, preventFocusChange)
{
this._shownInitialContent = true;
var domTreeContentView = this._showContentViewForIdentifier(WebInspector.FrameContentView.DOMTreeIdentifier);
console.assert(domTreeContentView);
if (!domTreeContentView || !domNodeToSelect)
return null;
domTreeContentView.selectAndRevealDOMNode(domNodeToSelect, preventFocusChange);
return domTreeContentView;
},
// Private
_pathComponentForContentView: function(contentView)
{
console.assert(contentView);
if (!contentView)
return null;
if (contentView.representedObject instanceof WebInspector.Resource)
return this._sourceCodePathComponent;
if (contentView.representedObject instanceof WebInspector.DOMTree)
return this._domTreePathComponent;
console.error("Unknown contentView.");
return null;
},
_identifierForContentView: function(contentView)
{
console.assert(contentView);
if (!contentView)
return null;
if (contentView.representedObject instanceof WebInspector.Resource)
return WebInspector.FrameContentView.SourceCodeIdentifier;
if (contentView.representedObject instanceof WebInspector.DOMTree)
return WebInspector.FrameContentView.DOMTreeIdentifier;
console.error("Unknown contentView.");
return null;
},
_showContentViewForIdentifier: function(identifier)
{
var representedObjectToShow = null;
switch (identifier) {
case WebInspector.FrameContentView.SourceCodeIdentifier:
representedObjectToShow = this._frame.mainResource;
break;
case WebInspector.FrameContentView.DOMTreeIdentifier:
representedObjectToShow = this._frame.domTree;
break;
}
console.assert(representedObjectToShow);
if (!representedObjectToShow)
return;
this._currentContentViewSetting.value = identifier;
return this.contentViewContainer.showContentViewForRepresentedObject(representedObjectToShow);
},
_pathComponentSelected: function(event)
{
this._showContentViewForIdentifier(event.data.pathComponent.representedObject);
}
};
WebInspector.FrameContentView.prototype.__proto__ = WebInspector.ClusterContentView.prototype;