Home | History | Annotate | Download | only in toolbox
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 /**
      6  * @constructor
      7  * @extends {WebInspector.View}
      8  */
      9 WebInspector.InspectedPagePlaceholder = function()
     10 {
     11     WebInspector.View.call(this);
     12     this.element.classList.add("white-background");
     13     WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged, this._scheduleUpdate, this);
     14     this._margins = { top: 0, right: 0, bottom: 0, left: 0 };
     15     this.restoreMinimumSizeAndMargins();
     16 };
     17 
     18 WebInspector.InspectedPagePlaceholder.Events = {
     19     Update: "Update"
     20 };
     21 
     22 WebInspector.InspectedPagePlaceholder.MarginValue = 3;
     23 
     24 WebInspector.InspectedPagePlaceholder.prototype = {
     25     _findMargins: function()
     26     {
     27         var margins = { top: 0, right: 0, bottom: 0, left: 0 };
     28 
     29         if (this._useMargins) {
     30             var adjacent = { top: true, right: true, bottom: true, left: true };
     31             var view = this;
     32             while (view.parentView()) {
     33                 var parent = view.parentView();
     34                 // This view assumes it's always inside the main split view element, not a sidebar.
     35                 // Every parent which is not a split view, must be of the same size as this view.
     36                 if (parent instanceof WebInspector.SplitView) {
     37                     var side = parent.sidebarSide();
     38                     if (adjacent[side] && !parent.hasCustomResizer() && parent.isResizable())
     39                         margins[side] = WebInspector.InspectedPagePlaceholder.MarginValue;
     40                     adjacent[side] = false;
     41                 }
     42                 view = parent;
     43             }
     44         }
     45 
     46         if (this._margins.top !== margins.top || this._margins.left !== margins.left || this._margins.right !== margins.right || this._margins.bottom !== margins.bottom) {
     47             this._margins = margins;
     48             this._scheduleUpdate();
     49         }
     50     },
     51 
     52     onResize: function()
     53     {
     54         this._findMargins();
     55         this._scheduleUpdate();
     56     },
     57 
     58     _scheduleUpdate: function()
     59     {
     60         if (this._updateId)
     61             window.cancelAnimationFrame(this._updateId);
     62         this._updateId = window.requestAnimationFrame(this.update.bind(this));
     63     },
     64 
     65     /**
     66      * @return {!Size}
     67      */
     68     dipPageSize: function()
     69     {
     70         var rect = this._dipPageRect();
     71         return new Size(Math.round(rect.width), Math.round(rect.height));
     72     },
     73 
     74     /**
     75      * @return {!Size}
     76      */
     77     cssElementSize: function()
     78     {
     79         var zoomFactor = WebInspector.zoomManager.zoomFactor();
     80         var rect = this.element.getBoundingClientRect();
     81         var width = rect.width - (this._margins.left + this._margins.right) / zoomFactor;
     82         var height = rect.height - (this._margins.top + this._margins.bottom) / zoomFactor;
     83         return new Size(width, height);
     84     },
     85 
     86     restoreMinimumSizeAndMargins: function()
     87     {
     88         this._useMargins = true;
     89         this.setMinimumSize(50, 50);
     90         this._findMargins();
     91     },
     92 
     93     clearMinimumSizeAndMargins: function()
     94     {
     95         this._useMargins = false;
     96         this.setMinimumSize(1, 1);
     97         this._findMargins();
     98     },
     99 
    100     _dipPageRect: function()
    101     {
    102         var zoomFactor = WebInspector.zoomManager.zoomFactor();
    103         var rect = this.element.getBoundingClientRect();
    104         var bodyRect = document.body.getBoundingClientRect();
    105 
    106         var left = Math.max(rect.left * zoomFactor + this._margins.left, bodyRect.left * zoomFactor);
    107         var top = Math.max(rect.top * zoomFactor + this._margins.top, bodyRect.top * zoomFactor);
    108         var bottom = Math.min(rect.bottom * zoomFactor - this._margins.bottom, bodyRect.bottom * zoomFactor);
    109         var right = Math.min(rect.right * zoomFactor - this._margins.right, bodyRect.right * zoomFactor);
    110 
    111         return { x: left, y: top, width: right - left, height: bottom - top };
    112     },
    113 
    114     update: function()
    115     {
    116         delete this._updateId;
    117         var rect = this._dipPageRect();
    118         var bounds = { x: Math.round(rect.x), y: Math.round(rect.y), height: Math.max(1, Math.round(rect.height)), width: Math.max(1, Math.round(rect.width)) };
    119         this.dispatchEventToListeners(WebInspector.InspectedPagePlaceholder.Events.Update, bounds);
    120     },
    121 
    122     __proto__: WebInspector.View.prototype
    123 };
    124