18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2008, The Android Open Source Project 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "webcoreglue" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <config.h> 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebFrameView.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "android_graphics.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HostWindow.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <SkCanvas.h> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android { 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebFrameView::WebFrameView(WebCore::FrameView* frameView, WebViewCore* webViewCore) 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : WebCoreViewBridge() 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , mFrameView(frameView) 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , mWebViewCore(webViewCore) { 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // attach itself to mFrameView 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mFrameView->setPlatformWidget(this); 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Retain(mWebViewCore); 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebFrameView::~WebFrameView() { 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Release(mWebViewCore); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebFrameView::draw(WebCore::GraphicsContext* ctx, const WebCore::IntRect& rect) { 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::Frame* frame = mFrameView->frame(); 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (NULL == frame->contentRenderer()) { 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We only do this if there is nothing else to draw. 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If there is a renderer, it will fill the bg itself, so we don't want to 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // double-draw (slow) 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkCanvas* canvas = ctx->platformContext()->mCanvas; 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project canvas->drawColor(SK_ColorWHITE); 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (frame->tree()->parent()) { 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Note: this code was moved from FrameLoaderClientAndroid 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For subframe, create a new translated rect from the given rectangle. 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::IntRect transRect(rect); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In Frame::markAllMatchesForText(), it does a fake paint. So we need 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to handle the case where platformContext() is null. However, we still 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // want to call paint, since WebKit must have called the paint for a reason. 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkCanvas* canvas = ctx->platformContext() ? ctx->platformContext()->mCanvas : NULL; 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (canvas) { 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const WebCore::IntRect& bounds = getBounds(); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Grab the intersection of transRect and the frame's bounds. 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project transRect.intersect(bounds); 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (transRect.isEmpty()) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Move the transRect into the frame's local coordinates. 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project transRect.move(-bounds.x(), -bounds.y()); 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Translate the canvas, add a clip. 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project canvas->save(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project canvas->translate(SkIntToScalar(bounds.x()), SkIntToScalar(bounds.y())); 898535e17115184dbb5e448b6364b88eb52df34482Mike Reed canvas->clipRect(transRect); 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mFrameView->paintContents(ctx, transRect); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (canvas) 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project canvas->restore(); 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mFrameView->paintContents(ctx, rect); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebFrameView::setView(WebCore::FrameView* frameView) { 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mFrameView = frameView; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mFrameView->setPlatformWidget(this); 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace android 105