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