WebKit/mac/WebView/WebRenderLayer.mm
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2010 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  * 1. Redistributions of source code must retain the above copyright
       
     8  *    notice, this list of conditions and the following disclaimer.
       
     9  * 2. Redistributions in binary form must reproduce the above copyright
       
    10  *    notice, this list of conditions and the following disclaimer in the
       
    11  *    documentation and/or other materials provided with the distribution.
       
    12  *
       
    13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
       
    14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
       
    17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
       
    21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
    23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
       
    24  */
       
    25 
       
    26 #import "WebRenderLayer.h"
       
    27 
       
    28 #import "WebFrameInternal.h"
       
    29 #import <WebCore/Frame.h>
       
    30 #import <WebCore/FrameLoaderClient.h>
       
    31 #import <WebCore/PlatformString.h>
       
    32 #import <WebCore/RenderLayer.h>
       
    33 #import <WebCore/RenderLayerBacking.h>
       
    34 #import <WebCore/RenderView.h>
       
    35 
       
    36 using namespace WebCore;
       
    37 
       
    38 
       
    39 @interface WebRenderLayer(Private)
       
    40 
       
    41 - (id)initWithRenderLayer:(RenderLayer *)layer;
       
    42 - (void)buildDescendantLayers:(RenderLayer*)rootLayer;
       
    43 
       
    44 @end
       
    45 
       
    46 @implementation WebRenderLayer
       
    47 
       
    48 + (NSString *)nameForLayer:(RenderLayer*)layer
       
    49 {
       
    50     RenderObject* renderer = layer->renderer();
       
    51     NSString *name = [NSString stringWithUTF8String:renderer->renderName()];
       
    52 
       
    53     if (Node* node = renderer->node()) {
       
    54         if (node->isElementNode())
       
    55             name = [name stringByAppendingFormat:@" %@", (NSString *)static_cast<Element*>(node)->tagName()];
       
    56         if (node->hasID())
       
    57             name = [name stringByAppendingFormat:@" id=\"%@\"", (NSString *)static_cast<Element*>(node)->getIdAttribute()];
       
    58 
       
    59         if (node->hasClass()) {
       
    60             StyledElement* styledElement = static_cast<StyledElement*>(node);
       
    61             String classes;
       
    62             for (size_t i = 0; i < styledElement->classNames().size(); ++i) {
       
    63                 if (i > 0)
       
    64                     classes += " ";
       
    65                 classes += styledElement->classNames()[i];
       
    66             }
       
    67             name = [name stringByAppendingFormat:@" class=\"%@\"", (NSString *)classes];
       
    68         }
       
    69     }
       
    70 
       
    71     if (layer->isReflection())
       
    72         name = [name stringByAppendingString:@" (reflection)"];
       
    73 
       
    74     return name;
       
    75 }
       
    76 
       
    77 + (NSString *)compositingInfoForLayer:(RenderLayer*)layer
       
    78 {
       
    79     if (!layer->isComposited())
       
    80         return @"";
       
    81 
       
    82     NSString *layerType = @"";
       
    83 #if USE(ACCELERATED_COMPOSITING)
       
    84     RenderLayerBacking* backing = layer->backing();
       
    85     switch (backing->compositingLayerType()) {
       
    86         case NormalCompositingLayer:
       
    87             layerType = @"composited";
       
    88             break;
       
    89         case TiledCompositingLayer:
       
    90             layerType = @"composited: tiled layer";
       
    91             break;
       
    92         case MediaCompositingLayer:
       
    93             layerType = @"composited for plug-in, video or WebGL";
       
    94             break;
       
    95         case ContainerCompositingLayer:
       
    96             layerType = @"composited: container layer";
       
    97             break;
       
    98     }
       
    99     
       
   100     if (backing->hasClippingLayer())
       
   101         layerType = [layerType stringByAppendingString:@" (clipping)"];
       
   102 
       
   103     if (backing->hasAncestorClippingLayer())
       
   104         layerType = [layerType stringByAppendingString:@" (clipped)"];
       
   105 #endif
       
   106 
       
   107     return layerType;
       
   108 }
       
   109 
       
   110 - (id)initWithRenderLayer:(RenderLayer*)layer
       
   111 {
       
   112     if ((self = [super init])) {
       
   113         name = [[WebRenderLayer nameForLayer:layer] retain];
       
   114         bounds = layer->absoluteBoundingBox();
       
   115         composited = layer->isComposited();
       
   116         compositingInfo = [[WebRenderLayer compositingInfoForLayer:layer] retain];
       
   117     }
       
   118 
       
   119     return self;
       
   120 }
       
   121 
       
   122 - (id)initWithName:(NSString*)layerName
       
   123 {
       
   124     if ((self = [super init])) {
       
   125         name = [layerName copy];
       
   126         separator = YES;
       
   127     }
       
   128 
       
   129     return self;
       
   130 }
       
   131 
       
   132 // Only called on the root.
       
   133 - (id)initWithWebFrame:(WebFrame *)webFrame
       
   134 {
       
   135     self = [super init];
       
   136     
       
   137     Frame* frame = core(webFrame);
       
   138     if (!frame->loader()->client()->hasHTMLView()) {
       
   139         [self release];
       
   140         return nil;
       
   141     }
       
   142     
       
   143     RenderObject* renderer = frame->contentRenderer();
       
   144     if (!renderer) {
       
   145         [self release];
       
   146         return nil;
       
   147     }
       
   148 
       
   149     if (renderer->hasLayer()) {
       
   150         RenderLayer* layer = toRenderBoxModelObject(renderer)->layer();
       
   151 
       
   152         name = [[WebRenderLayer nameForLayer:layer] retain];
       
   153         bounds = layer->absoluteBoundingBox();
       
   154         composited = layer->isComposited();
       
   155         compositingInfo = [[WebRenderLayer compositingInfoForLayer:layer] retain];
       
   156     
       
   157         [self buildDescendantLayers:layer];
       
   158     }
       
   159     
       
   160     return self;
       
   161 }
       
   162 
       
   163 - (void)dealloc
       
   164 {
       
   165     [children release];
       
   166     [name release];
       
   167     [compositingInfo release];
       
   168     [super dealloc];
       
   169 }
       
   170 
       
   171 - (void)buildDescendantLayers:(RenderLayer*)layer
       
   172 {
       
   173     NSMutableArray *childWebLayers = [[NSMutableArray alloc] init];
       
   174 
       
   175     // Build children in back to front order.
       
   176     
       
   177     if (Vector<RenderLayer*>* negZOrderList = layer->negZOrderList()) {
       
   178         size_t listSize = negZOrderList->size();
       
   179 
       
   180         if (listSize) {
       
   181             WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithName:@"-ve z-order list"];
       
   182             [childWebLayers addObject:newLayer];
       
   183             [newLayer release];
       
   184         }
       
   185 
       
   186         for (size_t i = 0; i < listSize; ++i) {
       
   187             RenderLayer* curLayer = negZOrderList->at(i);
       
   188 
       
   189             WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithRenderLayer:curLayer];
       
   190             [newLayer buildDescendantLayers:curLayer];
       
   191 
       
   192             [childWebLayers addObject:newLayer];
       
   193             [newLayer release];
       
   194         }
       
   195     }
       
   196 
       
   197     if (Vector<RenderLayer*>* normalFlowList = layer->normalFlowList()) {
       
   198         size_t listSize = normalFlowList->size();
       
   199 
       
   200         if (listSize) {
       
   201             WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithName:@"normal flow list"];
       
   202             [childWebLayers addObject:newLayer];
       
   203             [newLayer release];
       
   204         }
       
   205         
       
   206         for (size_t i = 0; i < listSize; ++i) {
       
   207             RenderLayer* curLayer = normalFlowList->at(i);
       
   208 
       
   209             WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithRenderLayer:curLayer];
       
   210             [newLayer buildDescendantLayers:curLayer];
       
   211 
       
   212             [childWebLayers addObject:newLayer];
       
   213             [newLayer release];
       
   214         }
       
   215     }
       
   216 
       
   217     if (Vector<RenderLayer*>* posZOrderList = layer->posZOrderList()) {
       
   218         size_t listSize = posZOrderList->size();
       
   219 
       
   220         if (listSize) {
       
   221             WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithName:@"+ve z-order list"];
       
   222             [childWebLayers addObject:newLayer];
       
   223             [newLayer release];
       
   224         }
       
   225 
       
   226         for (size_t i = 0; i < listSize; ++i) {
       
   227             RenderLayer* curLayer = posZOrderList->at(i);
       
   228 
       
   229             WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithRenderLayer:curLayer];
       
   230             [newLayer buildDescendantLayers:curLayer];
       
   231 
       
   232             [childWebLayers addObject:newLayer];
       
   233             [newLayer release];
       
   234         }
       
   235     }
       
   236 
       
   237     children = childWebLayers;
       
   238 }
       
   239 
       
   240 - (NSArray *)children
       
   241 {
       
   242     return children;
       
   243 }
       
   244 
       
   245 - (NSString *)name
       
   246 {
       
   247     return name;
       
   248 }
       
   249 
       
   250 - (NSString *)positionString
       
   251 {
       
   252     return [NSString stringWithFormat:@"(%.0f, %.0f)", bounds.origin.x, bounds.origin.y];
       
   253 }
       
   254 
       
   255 - (NSString *)widthString
       
   256 {
       
   257     return [NSString stringWithFormat:@"%.0f", bounds.size.width];
       
   258 }
       
   259 
       
   260 - (NSString *)heightString
       
   261 {
       
   262     return [NSString stringWithFormat:@"%.0f", bounds.size.height];
       
   263 }
       
   264 
       
   265 - (NSString *)compositingInfo
       
   266 {
       
   267     return compositingInfo;
       
   268 }
       
   269 
       
   270 - (BOOL)isComposited
       
   271 {
       
   272     return composited;
       
   273 }
       
   274 
       
   275 - (BOOL)isSeparator
       
   276 {
       
   277     return separator;
       
   278 }
       
   279 
       
   280 @end