WebKit/mac/WebView/WebRenderNode.mm
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2005, 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 #import "WebRenderNode.h"
       
    30 
       
    31 #import "WebFrameInternal.h"
       
    32 #import <WebCore/Frame.h>
       
    33 #import <WebCore/FrameLoaderClient.h>
       
    34 #import <WebCore/RenderText.h>
       
    35 #import <WebCore/RenderWidget.h>
       
    36 #import <WebCore/RenderView.h>
       
    37 #import <WebCore/Widget.h>
       
    38 
       
    39 using namespace WebCore;
       
    40 
       
    41 static WebRenderNode *copyRenderNode(RenderObject*);
       
    42 
       
    43 @implementation WebRenderNode
       
    44 
       
    45 - (id)_initWithCoreFrame:(Frame *)frame
       
    46 {
       
    47     [self release];
       
    48     
       
    49     if (!frame->loader()->client()->hasHTMLView())
       
    50         return nil;
       
    51     
       
    52     RenderObject* renderer = frame->contentRenderer();
       
    53     if (!renderer)
       
    54         return nil;
       
    55     
       
    56     return copyRenderNode(renderer);
       
    57 }
       
    58 
       
    59 - (id)_initWithName:(NSString *)n position:(NSPoint)p rect:(NSRect)r coreFrame:(Frame*)coreFrame children:(NSArray *)c
       
    60 {
       
    61     NSMutableArray *collectChildren;
       
    62     
       
    63     self = [super init];
       
    64     if (!self)
       
    65         return nil;
       
    66 
       
    67     collectChildren = [c mutableCopy];
       
    68 
       
    69     name = [n retain];
       
    70     rect = r;
       
    71     absolutePosition = p;
       
    72 
       
    73     if (coreFrame) {
       
    74         WebRenderNode *node = [[WebRenderNode alloc] _initWithCoreFrame:coreFrame];
       
    75         [collectChildren addObject:node];
       
    76         [node release];
       
    77     }
       
    78     
       
    79     children = [collectChildren copy];
       
    80     [collectChildren release];
       
    81     
       
    82     return self;
       
    83 }
       
    84 
       
    85 static WebRenderNode *copyRenderNode(RenderObject* node)
       
    86 {
       
    87     NSMutableArray *children = [[NSMutableArray alloc] init];
       
    88     for (RenderObject* child = node->firstChild(); child; child = child->nextSibling()) {
       
    89         WebRenderNode *childCopy = copyRenderNode(child);
       
    90         [children addObject:childCopy];
       
    91         [childCopy release];
       
    92     }
       
    93 
       
    94     NSString *name = [[NSString alloc] initWithUTF8String:node->renderName()];
       
    95     
       
    96     RenderWidget* renderWidget = node->isWidget() ? toRenderWidget(node) : 0;
       
    97     Widget* widget = renderWidget ? renderWidget->widget() : 0;
       
    98     FrameView* frameView = widget && widget->isFrameView() ? static_cast<FrameView*>(widget) : 0;
       
    99     Frame* frame = frameView ? frameView->frame() : 0;
       
   100 
       
   101     // FIXME: broken with transforms
       
   102     FloatPoint absPos = node->localToAbsolute(FloatPoint());
       
   103     int x = 0;
       
   104     int y = 0;
       
   105     int width = 0;
       
   106     int height = 0;
       
   107     if (node->isBox()) {
       
   108         RenderBox* box = toRenderBox(node);
       
   109         x = box->x();
       
   110         y = box->y();
       
   111         width = box->width();
       
   112         height = box->height();
       
   113     } else if (node->isText()) {
       
   114         // FIXME: Preserve old behavior even though it's strange.
       
   115         RenderText* text = toRenderText(node);
       
   116         x = text->firstRunX();
       
   117         y = text->firstRunY();
       
   118         IntRect box = text->linesBoundingBox();
       
   119         width = box.width();
       
   120         height = box.height();
       
   121     } else if (node->isRenderInline()) {
       
   122         RenderBoxModelObject* inlineFlow = toRenderBoxModelObject(node);
       
   123         IntRect boundingBox = inlineFlow->borderBoundingBox();
       
   124         x = boundingBox.x();
       
   125         y = boundingBox.y();
       
   126         width = boundingBox.width();
       
   127         height = boundingBox.height();
       
   128     }
       
   129 
       
   130     WebRenderNode *result = [[WebRenderNode alloc] _initWithName:name
       
   131                                                         position:absPos rect:NSMakeRect(x, y, width, height)
       
   132                                                        coreFrame:frame children:children];
       
   133 
       
   134     [name release];
       
   135     [children release];
       
   136 
       
   137     return result;
       
   138 }
       
   139 
       
   140 - (id)initWithWebFrame:(WebFrame *)frame
       
   141 {
       
   142     return [self _initWithCoreFrame:core(frame)];
       
   143 }
       
   144 
       
   145 - (void)dealloc
       
   146 {
       
   147     [children release];
       
   148     [name release];
       
   149     [super dealloc];
       
   150 }
       
   151 
       
   152 - (NSArray *)children
       
   153 {
       
   154     return children;
       
   155 }
       
   156 
       
   157 - (NSString *)name
       
   158 {
       
   159     return name;
       
   160 }
       
   161 
       
   162 - (NSString *)absolutePositionString
       
   163 {
       
   164     return [NSString stringWithFormat:@"(%.0f, %.0f)", absolutePosition.x, absolutePosition.y];
       
   165 }
       
   166 
       
   167 - (NSString *)positionString
       
   168 {
       
   169     return [NSString stringWithFormat:@"(%.0f, %.0f)", rect.origin.x, rect.origin.y];
       
   170 }
       
   171 
       
   172 - (NSString *)widthString
       
   173 {
       
   174     return [NSString stringWithFormat:@"%.0f", rect.size.width];
       
   175 }
       
   176 
       
   177 - (NSString *)heightString
       
   178 {
       
   179     return [NSString stringWithFormat:@"%.0f", rect.size.height];
       
   180 }
       
   181 
       
   182 @end