diff -r 000000000000 -r 4f2f89ce4247 WebKit/mac/WebView/WebRenderLayer.mm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebKit/mac/WebView/WebRenderLayer.mm Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,280 @@ +/* + * Copyright (C) 2010 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. ``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 COMPUTER, INC. OR + * 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. + */ + +#import "WebRenderLayer.h" + +#import "WebFrameInternal.h" +#import +#import +#import +#import +#import +#import + +using namespace WebCore; + + +@interface WebRenderLayer(Private) + +- (id)initWithRenderLayer:(RenderLayer *)layer; +- (void)buildDescendantLayers:(RenderLayer*)rootLayer; + +@end + +@implementation WebRenderLayer + ++ (NSString *)nameForLayer:(RenderLayer*)layer +{ + RenderObject* renderer = layer->renderer(); + NSString *name = [NSString stringWithUTF8String:renderer->renderName()]; + + if (Node* node = renderer->node()) { + if (node->isElementNode()) + name = [name stringByAppendingFormat:@" %@", (NSString *)static_cast(node)->tagName()]; + if (node->hasID()) + name = [name stringByAppendingFormat:@" id=\"%@\"", (NSString *)static_cast(node)->getIdAttribute()]; + + if (node->hasClass()) { + StyledElement* styledElement = static_cast(node); + String classes; + for (size_t i = 0; i < styledElement->classNames().size(); ++i) { + if (i > 0) + classes += " "; + classes += styledElement->classNames()[i]; + } + name = [name stringByAppendingFormat:@" class=\"%@\"", (NSString *)classes]; + } + } + + if (layer->isReflection()) + name = [name stringByAppendingString:@" (reflection)"]; + + return name; +} + ++ (NSString *)compositingInfoForLayer:(RenderLayer*)layer +{ + if (!layer->isComposited()) + return @""; + + NSString *layerType = @""; +#if USE(ACCELERATED_COMPOSITING) + RenderLayerBacking* backing = layer->backing(); + switch (backing->compositingLayerType()) { + case NormalCompositingLayer: + layerType = @"composited"; + break; + case TiledCompositingLayer: + layerType = @"composited: tiled layer"; + break; + case MediaCompositingLayer: + layerType = @"composited for plug-in, video or WebGL"; + break; + case ContainerCompositingLayer: + layerType = @"composited: container layer"; + break; + } + + if (backing->hasClippingLayer()) + layerType = [layerType stringByAppendingString:@" (clipping)"]; + + if (backing->hasAncestorClippingLayer()) + layerType = [layerType stringByAppendingString:@" (clipped)"]; +#endif + + return layerType; +} + +- (id)initWithRenderLayer:(RenderLayer*)layer +{ + if ((self = [super init])) { + name = [[WebRenderLayer nameForLayer:layer] retain]; + bounds = layer->absoluteBoundingBox(); + composited = layer->isComposited(); + compositingInfo = [[WebRenderLayer compositingInfoForLayer:layer] retain]; + } + + return self; +} + +- (id)initWithName:(NSString*)layerName +{ + if ((self = [super init])) { + name = [layerName copy]; + separator = YES; + } + + return self; +} + +// Only called on the root. +- (id)initWithWebFrame:(WebFrame *)webFrame +{ + self = [super init]; + + Frame* frame = core(webFrame); + if (!frame->loader()->client()->hasHTMLView()) { + [self release]; + return nil; + } + + RenderObject* renderer = frame->contentRenderer(); + if (!renderer) { + [self release]; + return nil; + } + + if (renderer->hasLayer()) { + RenderLayer* layer = toRenderBoxModelObject(renderer)->layer(); + + name = [[WebRenderLayer nameForLayer:layer] retain]; + bounds = layer->absoluteBoundingBox(); + composited = layer->isComposited(); + compositingInfo = [[WebRenderLayer compositingInfoForLayer:layer] retain]; + + [self buildDescendantLayers:layer]; + } + + return self; +} + +- (void)dealloc +{ + [children release]; + [name release]; + [compositingInfo release]; + [super dealloc]; +} + +- (void)buildDescendantLayers:(RenderLayer*)layer +{ + NSMutableArray *childWebLayers = [[NSMutableArray alloc] init]; + + // Build children in back to front order. + + if (Vector* negZOrderList = layer->negZOrderList()) { + size_t listSize = negZOrderList->size(); + + if (listSize) { + WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithName:@"-ve z-order list"]; + [childWebLayers addObject:newLayer]; + [newLayer release]; + } + + for (size_t i = 0; i < listSize; ++i) { + RenderLayer* curLayer = negZOrderList->at(i); + + WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithRenderLayer:curLayer]; + [newLayer buildDescendantLayers:curLayer]; + + [childWebLayers addObject:newLayer]; + [newLayer release]; + } + } + + if (Vector* normalFlowList = layer->normalFlowList()) { + size_t listSize = normalFlowList->size(); + + if (listSize) { + WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithName:@"normal flow list"]; + [childWebLayers addObject:newLayer]; + [newLayer release]; + } + + for (size_t i = 0; i < listSize; ++i) { + RenderLayer* curLayer = normalFlowList->at(i); + + WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithRenderLayer:curLayer]; + [newLayer buildDescendantLayers:curLayer]; + + [childWebLayers addObject:newLayer]; + [newLayer release]; + } + } + + if (Vector* posZOrderList = layer->posZOrderList()) { + size_t listSize = posZOrderList->size(); + + if (listSize) { + WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithName:@"+ve z-order list"]; + [childWebLayers addObject:newLayer]; + [newLayer release]; + } + + for (size_t i = 0; i < listSize; ++i) { + RenderLayer* curLayer = posZOrderList->at(i); + + WebRenderLayer* newLayer = [[WebRenderLayer alloc] initWithRenderLayer:curLayer]; + [newLayer buildDescendantLayers:curLayer]; + + [childWebLayers addObject:newLayer]; + [newLayer release]; + } + } + + children = childWebLayers; +} + +- (NSArray *)children +{ + return children; +} + +- (NSString *)name +{ + return name; +} + +- (NSString *)positionString +{ + return [NSString stringWithFormat:@"(%.0f, %.0f)", bounds.origin.x, bounds.origin.y]; +} + +- (NSString *)widthString +{ + return [NSString stringWithFormat:@"%.0f", bounds.size.width]; +} + +- (NSString *)heightString +{ + return [NSString stringWithFormat:@"%.0f", bounds.size.height]; +} + +- (NSString *)compositingInfo +{ + return compositingInfo; +} + +- (BOOL)isComposited +{ + return composited; +} + +- (BOOL)isSeparator +{ + return separator; +} + +@end