1/* 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29/** 30 * @extends {WebInspector.ResourceView} 31 * @constructor 32 */ 33WebInspector.ImageView = function(resource) 34{ 35 WebInspector.ResourceView.call(this, resource); 36 37 this.element.classList.add("image"); 38} 39 40WebInspector.ImageView.prototype = { 41 hasContent: function() 42 { 43 return true; 44 }, 45 46 wasShown: function() 47 { 48 this._createContentIfNeeded(); 49 }, 50 51 _createContentIfNeeded: function() 52 { 53 if (this._container) 54 return; 55 56 var imageContainer = document.createElement("div"); 57 imageContainer.className = "image"; 58 this.element.appendChild(imageContainer); 59 60 var imagePreviewElement = document.createElement("img"); 61 imagePreviewElement.classList.add("resource-image-view"); 62 imageContainer.appendChild(imagePreviewElement); 63 imagePreviewElement.addEventListener("contextmenu", this._contextMenu.bind(this), true); 64 65 this._container = document.createElement("div"); 66 this._container.className = "info"; 67 this.element.appendChild(this._container); 68 69 var imageNameElement = document.createElement("h1"); 70 imageNameElement.className = "title"; 71 imageNameElement.textContent = this.resource.displayName; 72 this._container.appendChild(imageNameElement); 73 74 var infoListElement = document.createElement("dl"); 75 infoListElement.className = "infoList"; 76 77 this.resource.populateImageSource(imagePreviewElement); 78 79 /** 80 * @this {WebInspector.ImageView} 81 */ 82 function onImageLoad() 83 { 84 var content = this.resource.content; 85 if (content) 86 var resourceSize = this._base64ToSize(content); 87 else 88 var resourceSize = this.resource.resourceSize; 89 90 var imageProperties = [ 91 { name: WebInspector.UIString("Dimensions"), value: WebInspector.UIString("%d × %d", imagePreviewElement.naturalWidth, imagePreviewElement.naturalHeight) }, 92 { name: WebInspector.UIString("File size"), value: Number.bytesToString(resourceSize) }, 93 { name: WebInspector.UIString("MIME type"), value: this.resource.mimeType } 94 ]; 95 96 infoListElement.removeChildren(); 97 for (var i = 0; i < imageProperties.length; ++i) { 98 var dt = document.createElement("dt"); 99 dt.textContent = imageProperties[i].name; 100 infoListElement.appendChild(dt); 101 var dd = document.createElement("dd"); 102 dd.textContent = imageProperties[i].value; 103 infoListElement.appendChild(dd); 104 } 105 var dt = document.createElement("dt"); 106 dt.textContent = WebInspector.UIString("URL"); 107 infoListElement.appendChild(dt); 108 var dd = document.createElement("dd"); 109 var externalResource = true; 110 dd.appendChild(WebInspector.linkifyURLAsNode(this.resource.url, undefined, undefined, externalResource)); 111 infoListElement.appendChild(dd); 112 113 this._container.appendChild(infoListElement); 114 } 115 imagePreviewElement.addEventListener("load", onImageLoad.bind(this), false); 116 this._imagePreviewElement = imagePreviewElement; 117 }, 118 119 _base64ToSize: function(content) 120 { 121 if (!content.length) 122 return 0; 123 var size = (content.length || 0) * 3 / 4; 124 if (content.length > 0 && content[content.length - 1] === "=") 125 size--; 126 if (content.length > 1 && content[content.length - 2] === "=") 127 size--; 128 return size; 129 }, 130 131 _contextMenu: function(event) 132 { 133 var contextMenu = new WebInspector.ContextMenu(event); 134 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Copy image URL" : "Copy Image URL"), this._copyImageURL.bind(this)); 135 if (this._imagePreviewElement.src) 136 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Copy image as Data URL" : "Copy Image As Data URL"), this._copyImageAsDataURL.bind(this)); 137 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Open image in new tab" : "Open Image in New Tab"), this._openInNewTab.bind(this)); 138 contextMenu.show(); 139 }, 140 141 _copyImageAsDataURL: function() 142 { 143 InspectorFrontendHost.copyText(this._imagePreviewElement.src); 144 }, 145 146 _copyImageURL: function() 147 { 148 InspectorFrontendHost.copyText(this.resource.url); 149 }, 150 151 _openInNewTab: function() 152 { 153 InspectorFrontendHost.openInNewTab(this.resource.url); 154 }, 155 156 __proto__: WebInspector.ResourceView.prototype 157} 158