www.pudn.com > wcore.rar > WebCoreBridge.cpp


/* 
 * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved. 
 * Portions Copyright (c) 2005 Nokia Corporation, 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 COMPUTER, 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. 
 */ 
 
#include "WebCoreBridge.h" 
#include "WebCoreImageCarrier.h" 
 
#include "csshelper.h" 
#include "dom_node.h" 
#include "dom_docimpl.h" 
#include "dom_nodeimpl.h" 
#include "dom_position.h" 
#include "dom2_eventsimpl.h" 
#include "dom2_rangeimpl.h" 
#include "dom2_viewsimpl.h" 
#include "dom2_eventsimpl.h" 
#include "htmlediting.h" 
#include "html_documentimpl.h" 
#include "html_formimpl.h" 
#include "html_imageimpl.h" 
#include "htmlattrs.h" 
#include "htmltags.h" 
#include "khtml_part.h" 
#include "khtmlview.h" 
//#include "kjs_proxy.h" 
//#include "kjs_window.h" 
#include "loader.h" 
#include "render_frames.h" 
#include "render_image.h" 
#include "render_object.h" 
#include "render_text.h" 
#include "render_form.h" 
#include "render_canvas.h" 
#include "render_style.h" 
#include "render_replaced.h" 
#include "render_layer.h" 
#include "WebCoreCookieAdapter.h" 
 
//#import  
//#import  
//#import  
//#import  
 
#include "KWQGlobalServices.h" 
#include "KWQAssertions.h" 
#include "KWQCharsets.h" 
#include "KWQClipboard.h" 
#include "KWQDOMNode.h" 
#include "KWQFileButton.h" 
//#include "KWQEditCommand.h" 
#include "KWQFont.h" 
//#include "KWQFoundationExtras.h" 
#include "KWQFrame.h" 
#include "KWQKHTMLPart.h" 
#include "KWQLoader.h" 
//#include "KWQPageState.h" 
//#include "KWQRenderTreeDebug.h" 
//#include "KWQView.h" 
//#include "KWQPrinter.h" 
#include "KWQAccObjectCache.h" 
 
#include "WebCoreImageRenderer.h" 
//#include "WebCoreTextRendererFactory.h" 
//#include "WebCoreViewFactory.h" 
#include "WebCoreSettings.h" 
#include "WebCorePageData.h" 
#include "html_document.h" 
 
static const char* KTel = "tel:"; 
static const char* KMailto = "mailto:"; 
static const char* KWtai = "wtai:"; 
static const char* KWtaiMC = "wtai://wp/mc;"; 
static const char* KWtaiAP = "wtai://wp/ap;"; 
static const char* KWtaiSD = "wtai://wp/sd;"; 
 
using DOM::AtomicString; 
using DOM::DocumentFragmentImpl; 
using DOM::DocumentImpl; 
using DOM::DocumentTypeImpl; 
using DOM::DOMString; 
using DOM::Element; 
using DOM::ElementImpl; 
using DOM::HTMLElementImpl; 
using DOM::HTMLFormElementImpl; 
using DOM::HTMLGenericFormElementImpl; 
using DOM::HTMLImageElementImpl; 
using DOM::HTMLInputElementImpl; 
using DOM::HTMLTextAreaElementImpl; 
using DOM::Node; 
using DOM::NodeImpl; 
using DOM::Position; 
using DOM::Range; 
 
using khtml::Decoder; 
using khtml::DeleteSelectionCommand; 
using khtml::EditCommand; 
using khtml::MoveSelectionCommand; 
using khtml::ReplaceSelectionCommand; 
using khtml::parseURL; 
using khtml::ApplyStyleCommand; 
using khtml::RenderCanvas; 
using khtml::RenderImage; 
using khtml::RenderObject; 
using khtml::RenderText; 
using khtml::RenderTextArea; 
using khtml::RenderPart; 
using khtml::RenderStyle; 
using khtml::RenderWidget; 
//using khtml::TypingCommand; 
 
//using KJS::SavedProperties; 
//using KJS::SavedBuiltins; 
 
using KParts::URLArgs; 
 
//using KJS::Bindings::RootObject; 
 
 
static TBool initializedObjectCacheSize = EFalse; 
static TBool initializedKJS = EFalse; 
 
EXPORT_C CWebCoreBridge* CWebCoreBridge::NewL(MWebClientBridge& aClient) 
    { 
    CWebCoreBridge* self = new (ELeave) CWebCoreBridge(aClient); 
    CleanupStack::PushL(self); 
    self->ConstructL(); 
    CleanupStack::Pop(); 
    return self; 
    } 
 
 
CWebCoreBridge::CWebCoreBridge(MWebClientBridge& aClient) 
    :iClientBridge(&aClient) 
    { 
    } 
 
CWebCoreBridge::~CWebCoreBridge() 
    { 
    RemoveFromFrame(); 
 
    if (iRenderPart) { 
        iRenderPart->deref(iRenderPartArena); 
    } 
    iPart->setBridge(0); 
    iPart->deref(); 
     
    delete iSmartTextBuffer; 
    } 
 
 
void CWebCoreBridge::ConstructL() 
    { 
 
    iPart = new KWQKHTMLPart(); 
    iPart->setBridge(this); 
 
    if (!initializedObjectCacheSize){ 
        khtml::Cache::setSize(Client().GetObjectCacheSize()); 
        initializedObjectCacheSize = ETrue; 
    } 
 
    if (!initializedKJS) { 
 
// ### NOT IMPLEMENTED scripting 
        /*mainThread = pthread_self(); 
 
        KJS::Bindings::RootObject::setFindRootObjectForNativeHandleFunction (rootForView); 
 
        KJS::Bindings::Instance::setDidExecuteFunction(updateRenderingForBindings); 
 
        initializedKJS = TRUE;*/ 
    } 
 
    iShouldCreateRenderers = ETrue; 
    } 
 
EXPORT_C 
MWebClientBridge& CWebCoreBridge::Client() 
    { 
    return *iClientBridge; 
    } 
 
 
/* 
+ (WebCoreBridge *)bridgeForDOMDocument:(DOMDocument *)document 
{ 
    return ((KWQKHTMLPart *)[document _documentImpl]->part())->bridge(); 
}*/ 
 
EXPORT_C 
void CWebCoreBridge::InitializeSettings(const CWebCoreSettings &settings) 
{ 
    iPart->setSettings(settings.Settings()); 
} 
 
 
KWQKHTMLPart *CWebCoreBridge::Part() const 
{ 
    return iPart; 
} 
 
EXPORT_C 
void CWebCoreBridge::SetRenderPart(KHTMLRenderPart *aNewPart) 
{ 
    RenderArena *arena = aNewPart->ref(); 
    if (iRenderPart) { 
        iRenderPart->deref(iRenderPartArena); 
    } 
    iRenderPart = aNewPart; 
    iRenderPartArena = arena; 
} 
 
EXPORT_C 
KHTMLRenderPart *CWebCoreBridge::RenderPart() const 
{ 
    return iRenderPart; 
} 
 
EXPORT_C 
void CWebCoreBridge::SetParent(CWebCoreBridge *aParent) 
{ 
    iPart->setParent(aParent->Part()); 
} 
 
EXPORT_C 
void CWebCoreBridge::ProvisionalLoadStarted() 
{ 
    iPart->provisionalLoadStarted(); 
} 
 
EXPORT_C 
void CWebCoreBridge::OpenURL(const TDesC& aURL, TBool aReload, 
            const TDesC& aContentType, const TDesC& aRefresh, const TDateTime& aLastModified) 
{ 
// ### NOT IMPLEMENTED page cache 
/* 
    if (pageCache) { 
        KWQPageState *state = [pageCache objectForKey:WebCorePageCacheStateKey]; 
        iPart->openURLFromPageCache(state); 
        [state invalidate]; 
        return; 
    } 
*/ 
 
    // arguments 
    URLArgs args(iPart->browserExtension()->urlArgs()); 
    args.reload = aReload; 
    if (aContentType!=KNullDesC) { 
        args.serviceType = QString::FromDes(aContentType); 
    } 
    iPart->browserExtension()->setURLArgs(args); 
 
    // opening the URL 
    if (iPart->didOpenURL(aURL)) { 
        // things we have to set up after calling didOpenURL 
        if (aRefresh!=KNullDesC) { 
            iPart->addMetaData("http-refresh", QString::FromDes(aRefresh)); 
        } 
// ### NOT IMPLEMENTED url metadata "modified" 
/* 
        if (lastModified) { 
            NSString *modifiedString = [lastModified descriptionWithCalendarFormat:@"%a %b %d %Y %H:%M:%S" timeZone:nil locale:nil]; 
            iPart->addMetaData("modified", QString::fromNSString(modifiedString)); 
        } 
*/ 
    } 
} 
 
EXPORT_C 
void CWebCoreBridge::CreateDocumentWithEncoding(const TDesC& aEncoding, TEncodingType aUserChosen) 
{ 
    iSmartLinkNode = NULL;     
    iPart->setEncoding(QString::FromDes(aEncoding), aUserChosen); 
    Client().DocumentStarted(); 
} 
 
EXPORT_C 
void CWebCoreBridge::AddData(const TDesC8& aData) 
{ 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
 
    // Document may be nil if the part is about to redirect 
    // as a result of JS executing during load, i.e. one frame 
    // changing another's location before the frame's document 
    // has been created. 
    if (doc){ 
        doc->setShouldCreateRenderers(ShouldCreateRenderers()); 
        iPart->addData((const char *)aData.Ptr(), aData.Length()); 
    } 
} 
 
EXPORT_C 
void CWebCoreBridge::CloseURL() 
{ 
    iPart->closeURL(); 
} 
 
EXPORT_C 
void CWebCoreBridge::DidNotOpenURL(const TDesC& aURL) 
{ 
    iPart->didNotOpenURL(KURL(aURL).url()); 
 
/* 
// We might have made a page cache item, but now we're bailing out due to an error before we ever 
    // transitioned to the new page (before WebFrameState==commit).  The goal here is to restore any state 
    // so that the existing view (that wenever got far enough to replace) can continue being used. 
    DocumentImpl *doc = _part->xmlDocImpl(); 
    if (doc) { 
        doc->setInPageCache(NO); 
    } 
    KWQPageState *state = [pageCache objectForKey:WebCorePageCacheStateKey]; 
    [state invalidate];    */ 
} 
 
 
EXPORT_C 
void CWebCoreBridge::SaveDocumentState() 
{ 
  // Save persisted form data 
  if (iPart->FormValues()){ 
    Client().SaveFormData(*iPart->FormValues()); 
    iPart->clearRecordedFormValues(); 
  } 
// ### NOT IMPLEMENTED document state save/restore 
/* 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
    if (doc != 0){ 
        QStringList list = doc->docState(); 
        NSMutableArray *documentState = [[[NSMutableArray alloc] init] autorelease]; 
 
        for (uint i = 0; i < list.count(); i++){ 
            QString s = list[i]; 
            [documentState addObject: [NSString stringWithCharacters: (const unichar *)s.unicode() length: s.length()]]; 
        } 
        [self saveDocumentState: documentState]; 
    } 
*/ 
} 
 
EXPORT_C 
void CWebCoreBridge::RestoreDocumentState() 
{ 
// ### NOT IMPLEMENTED document state save/restore 
/* 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
 
    if (doc != 0){ 
        NSArray *documentState = [self documentState]; 
 
        QStringList s; 
        for (uint i = 0; i < [documentState count]; i++){ 
            NSString *string = [documentState objectAtIndex: i]; 
            s.append(QString::fromNSString(string)); 
        } 
 
        doc->setRestoreState(s); 
    } 
*/ 
} 
 
EXPORT_C 
void CWebCoreBridge::ScrollToAnchorWithURL(const TDesC& aURL) 
{ 
    iPart->scrollToAnchor(KURL(aURL).url().latin1()); 
} 
 
 
/*EXPORT_C 
TBool CWebCoreBridge::SaveDocumentToPageCache() 
{ 
// ### NOT IMPLEMENTED page cache 
 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
    if (!doc) { 
        return NO; 
    } 
 
    if (!doc->view()) { 
        return NO; 
    } 
    iPart->clearTimers(); 
 
    SavedProperties *windowProperties = new SavedProperties; 
    iPart->saveWindowProperties(windowProperties); 
 
    SavedProperties *locationProperties = new SavedProperties; 
    iPart->saveLocationProperties(locationProperties); 
 
    SavedBuiltins *interpreterBuiltins = new SavedBuiltins; 
    iPart->saveInterpreterBuiltins(*interpreterBuiltins); 
 
    KWQPageState *pageState = [[[KWQPageState alloc] initWithDocument:doc 
                                                                  URL:iPart->m_url 
                                                     windowProperties:windowProperties 
                                                   locationProperties:locationProperties 
                                  interpreterBuiltins:interpreterBuiltins] autorelease]; 
    [pageState setPausedActions: iPart->pauseActions((const void *)pageState)]; 
 
    return [self saveDocumentToPageCache:pageState]; 
 
    return EFalse; 
}*/ 
 
EXPORT_C 
TBool CWebCoreBridge::CanCachePage() const 
{ 
    return iPart->canCachePage(); 
} 
 
EXPORT_C 
void CWebCoreBridge::End() 
{ 
    iPart->end(); 
} 
 
EXPORT_C 
void CWebCoreBridge::CreateKHTMLView(MWebCoreScrollView& aView, TInt aMarginWidth, TInt aMarginHeight) 
{ 
    // If we own the view, delete the old one - otherwise the render iPart will take care of deleting the view. 
 
// NOT IMPLEMENTED views 
 
    RemoveFromFrame(); 
 
    KHTMLView *kview = new KHTMLView(iPart, 0); 
    iPart->setView(kview); 
    kview->deref(); 
 
    kview->setView(&aView); 
    if (aMarginWidth >= 0) 
        kview->setMarginWidth(aMarginWidth); 
    if (aMarginHeight >= 0) 
        kview->setMarginHeight(aMarginHeight); 
 
} 
 
EXPORT_C 
void CWebCoreBridge::ScrollToAnchor(const TDesC& aUrl) 
{ 
    KURL url( aUrl ); 
    iPart->scrollToAnchor(url); 
 
    // In tabbed naviagtion case, apart from moving the viewport, 
    // we need to run the tabbed navigation algorithm again 
    if ( Client().IsTabbedNavigationEnabled() ) { 
        iPart->xmlDocImpl()->setFocusNode(0); 
        QPoint pt = QPoint(iPart->view()->contentsX(),iPart->view()->contentsY()); 
        iPart->setCursorPosition(pt); 
        TWebCoreFocusedElementType elType = EWebCoreElementNone; 
        iPart->tabbedNavigation(0,1,elType,EFalse); 
        } 
} 
 
// ### NOT IMPLEMENTED editing 
/* 
- (BOOL)isSelectionEditable 
{ 
    // EDIT FIXME: This needs to consider the entire selected range 
    NodeImpl *startNode = iPart->selection().start().node(); 
    return startNode ? startNode->isContentEditable() : NO; 
} 
*/ 
 
/*EXPORT_C 
TBool CWebCoreBridge::HaveSelection() const 
{ 
    return iPart->selection().state() == Selection::RANGE; 
}*/ 
 
// ### NOT IMPLEMENTED dom interface 
/* 
- (NSString *)_documentTypeString 
{ 
    NSString *documentTypeString = nil; 
    DOM::DocumentImpl *doc = iPart->xmlDocImpl(); 
    if (doc) { 
        DocumentTypeImpl *doctype = doc->doctype(); 
        if (doctype) { 
            documentTypeString = doctype->toString().string().getNSString(); 
        } 
    } 
    return documentTypeString; 
} 
 
- (NSString *)_stringWithDocumentTypeStringAndMarkupString:(NSString *)markupString 
{ 
    NSString *documentTypeString = [self _documentTypeString]; 
    if (documentTypeString && markupString) { 
        return [NSString stringWithFormat:@"%@%@", documentTypeString, markupString]; 
    } else if (documentTypeString) { 
        return documentTypeString; 
    } else if (markupString) { 
        return markupString; 
    } else { 
        return @""; 
    } 
} 
 
- (NSArray *)nodesFromList:(QPtrList *)nodeList 
{ 
    NSMutableArray *nodes = [NSMutableArray array]; 
    unsigned int count = nodeList->count(); 
    for (unsigned int i = 0; i < count; i++) { 
        [nodes addObject:[DOMNode _nodeWithImpl:nodeList->at(i)]]; 
    } 
    return nodes; 
} 
 
- (NSString *)markupStringFromNode:(DOMNode *)node nodes:(NSArray **)nodes 
{ 
    QPtrList *nodeList = NULL; 
    if (nodes) { 
        nodeList = new QPtrList; 
    } 
    NSString *markupString = [node _nodeImpl]->recursive_toHTMLWithOptions(false, NULL, nodeList).getNSString(); 
    if (nodes) { 
        *nodes = [self nodesFromList:nodeList]; 
        delete nodeList; 
    } 
    return [self _stringWithDocumentTypeStringAndMarkupString:markupString]; 
} 
 
- (NSString *)markupStringFromRange:(DOMRange *)range nodes:(NSArray **)nodes 
{ 
    QPtrList *nodeList = NULL; 
    if (nodes) { 
        nodeList = new QPtrList; 
    } 
    NSString *markupString = [range _rangeImpl]->toHTMLWithOptions(nodeList).string().getNSString(); 
    if (nodes) { 
        *nodes = [self nodesFromList:nodeList]; 
        delete nodeList; 
    } 
    return [self _stringWithDocumentTypeStringAndMarkupString:markupString]; 
} 
*/ 
 
/*EXPORT_C 
HBufC* CWebCoreBridge::SelectedString() const 
{ 
    QString text = iPart->selectedText(); 
    text.replace('\\', iPart->backslashAsCurrencySymbol()); 
 
    return text.Des().Alloc(); 
}*/ 
 
// ### NOT IMPLEMENTED dom interface 
/* 
- (NSString *)stringForRange:(DOMRange *)range 
{ 
    QString text = iPart->text([range _rangeImpl]); 
    text.replace('\\', iPart->backslashAsCurrencySymbol()); 
    return [[text.getNSString() copy] autorelease]; 
} 
*/ 
 
/*EXPORT_C 
void CWebCoreBridge::SelectAll() 
{ 
    iPart->selectAll(); 
} 
 
EXPORT_C 
void CWebCoreBridge::DeselectAll() 
{ 
    DeselectText(); 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
    if (doc) { 
        doc->setFocusNode(0); 
    } 
} 
 
EXPORT_C 
void CWebCoreBridge::DeselectText() 
{ 
    iPart->slotClearSelection(); 
}*/ 
 
EXPORT_C 
TBool CWebCoreBridge::IsFrameSet() const 
{ 
    return iPart->isFrameSet(); 
} 
 
EXPORT_C 
void CWebCoreBridge::ScalingFactorChanged(TInt aFactor) 
{ 
    if((aFactor == 0) || (!iPart) ||(!iPart->xmlDocImpl())) { 
        return; 
    } 
 
    if(iPart) { 
        iPart->view()->setScalingFactor(aFactor); 
    } 
 
    NodeImpl* node = iPart->xmlDocImpl(); 
    while (node) { 
        if (node->renderer()) { 
            // Invalidate the current render tree 
            node->renderer()->setNeedsLayoutAndMinMaxRecalc(); 
            RenderStyle* style = node->renderer()->style(); 
            if (style) { 
                RenderStyle* newstyle = new (node->renderer()->renderArena()) RenderStyle(*style); 
                newstyle->htmlFont().update(iPart->xmlDocImpl()->paintDeviceMetrics()); 
                node->renderer()->setStyle(newstyle); 
            } 
        } 
        node = node->traverseNextNode(); 
    } 
 
    iPart->xmlDocImpl()->recalcStyle( NodeImpl::Force ); 
} 
 
// ### NOT IMPLEMENTED printing 
/* 
- (NSString *)styleSheetForPrinting 
{ 
    if (!iPart->settings()->shouldPrintBackgrounds()) { 
        return @"* { background-image: none !important; background-color: white !important;}"; 
    } 
    return nil; 
} 
*/ 
 
EXPORT_C 
void CWebCoreBridge::ReapplyStylesForDeviceType( TWebCoreDeviceType aDeviceType ) 
{ 
// ### NOT IMPLEMENTED 
/* 
    iPart->setMediaType(deviceType == WebCoreDeviceScreen ? "screen" : "print"); 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
    if (doc) { 
        static QPaintDevice screen; 
        static QPrinter printer; 
        doc->setPaintDevice(deviceType == WebCoreDeviceScreen ? &screen : &printer); 
        if (deviceType != WebCoreDeviceScreen) { 
            doc->setPrintStyleSheet(QString::fromNSString([self styleSheetForPrinting])); 
        } 
    } 
    return iPart->reparseConfiguration();*/ 
} 
 
static bool nowPrinting(CWebCoreBridge *self) 
{ 
    DocumentImpl *doc = self->Part()->xmlDocImpl(); 
    return doc && doc->paintDevice() && doc->paintDevice()->devType() == QInternal::Printer; 
} 
/* 
// Set or unset the printing mode in the view.  We only toy with this if we're printing. 
- (void)_setupRootForPrinting:(BOOL)onOrOff 
{ 
    if (nowPrinting(self)) { 
        RenderCanvas *root = static_cast(iPart->xmlDocImpl()->renderer()); 
        if (root) { 
            root->setPrintingMode(onOrOff); 
        } 
    } 
} 
*/ 
 
EXPORT_C 
void CWebCoreBridge::ForceLayoutAdjustingViewSize(TBool aAdjustSizeFlag) 
{ 
    iPart->forceLayout(); 
    if (aAdjustSizeFlag) { 
        AdjustViewSize(); 
    } 
} 
 
/* 
- (void)forceLayoutWithMinimumPageWidth:(float)minPageWidth maximumPageWidth:(float)maxPageWidth adjustingViewSize:(BOOL)flag 
{ 
    [self _setupRootForPrinting:YES]; 
    iPart->forceLayoutWithPageWidthRange(minPageWidth, maxPageWidth); 
    if (flag) { 
        [self adjustViewSize]; 
    } 
    [self _setupRootForPrinting:NO]; 
} 
*/ 
 
EXPORT_C 
void CWebCoreBridge::SendResizeEvent() 
{ 
    iPart->sendResizeEvent(); 
} 
 
EXPORT_C 
void CWebCoreBridge::SendScrollEvent() 
{ 
    iPart->sendScrollEvent(); 
} 
 
/* 
- (void)drawRect:(NSRect)rect withPainter:(QPainter *)p 
{ 
    [self _setupRootForPrinting:YES]; 
    iPart->paint(p, QRect(rect)); 
    [self _setupRootForPrinting:NO]; 
} 
*/ 
 
/*EXPORT_C 
void DrawRect(const TRect& rect) 
{ 
    QPainter painter(nowPrinting(self)); 
    painter.setUsesInactiveTextBackgroundColor(iPart->usesInactiveTextBackgroundColor()); 
    painter.setDrawsFocusRing(iPart->showsFirstResponder()); 
    [self drawRect:rect withPainter:&painter]; 
}*/ 
 
 
EXPORT_C 
void CWebCoreBridge::DrawRect(const TRect& rect, CWebCoreGraphicsContext& aGc) 
{ 
    QPainter painter(nowPrinting(this)); 
    painter.SetGc(aGc); 
    painter.setUsesInactiveTextBackgroundColor(iPart->usesInactiveTextBackgroundColor()); 
    painter.setDrawsFocusRing(iPart->showsFirstResponder()); 
    iPart->paint(&painter,QRect(rect)); 
} 
/* 
// Used by pagination code called from AppKit when a standalone web page is printed. 
- (NSArray*)computePageRectsWithPrintWidthScaleFactor:(float)printWidthScaleFactor printHeight:(float)printHeight 
{ 
    [self _setupRootForPrinting:YES]; 
    NSMutableArray* pages = [NSMutableArray arrayWithCapacity:5]; 
    if (printWidthScaleFactor == 0 || printHeight == 0) 
        return pages; 
 
    if (!iPart || !iPart->xmlDocImpl() || !iPart->view()) return pages; 
    RenderCanvas* root = static_cast(iPart->xmlDocImpl()->renderer()); 
    if (!root) return pages; 
 
    KHTMLView* view = iPart->view(); 
    NSView* documentView = view->getDocumentView(); 
    if (!documentView) 
        return pages; 
 
    float currPageHeight = printHeight; 
    float docHeight = root->layer()->height(); 
    float docWidth = root->layer()->width(); 
    float printWidth = docWidth/printWidthScaleFactor; 
 
    // We need to give the part the opportunity to adjust the page height at each step. 
    for (float i = 0; i < docHeight; i += currPageHeight) { 
        float proposedBottom = kMin(docHeight, i + printHeight); 
        iPart->adjustPageHeight(&proposedBottom, i, proposedBottom, i); 
        currPageHeight = kMax(1.0f, proposedBottom - i); 
        for (float j = 0; j < docWidth; j += printWidth) { 
            NSValue* val = [NSValue valueWithRect: NSMakeRect(j, i, printWidth, currPageHeight)]; 
            [pages addObject: val]; 
        } 
    } 
    [self _setupRootForPrinting:NO]; 
 
    return pages; 
} 
 
// This is to support the case where a webview is embedded in the view that's being printed 
- (void)adjustPageHeightNew:(float *)newBottom top:(float)oldTop bottom:(float)oldBottom limit:(float)bottomLimit 
{ 
    [self _setupRootForPrinting:YES]; 
    iPart->adjustPageHeight(newBottom, oldTop, oldBottom, bottomLimit); 
    [self _setupRootForPrinting:NO]; 
} 
*/ 
 
// ### NOT IMPLEMENTED dom interface 
/* 
- (NSObject *)copyDOMNode:(NodeImpl *)node copier:(id )copier 
{ 
    NSMutableArray *children = [[NSMutableArray alloc] init]; 
    for (NodeImpl *child = node->firstChild(); child; child = child->nextSibling()) { 
        [children addObject:[self copyDOMNode:child copier:copier]]; 
    } 
    NSObject *copiedNode = [copier nodeWithName:node->nodeName().string().getNSString() 
                                          value:node->nodeValue().string().getNSString() 
                                         source:node->recursive_toHTML(true).getNSString() 
                                       children:children]; 
    [children release]; 
    return copiedNode; 
} 
 
- (NSObject *)copyDOMTree:(id )copier 
{ 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
    if (!doc) { 
        return nil; 
    } 
    return [self copyDOMNode:doc copier:copier]; 
} 
 
- (NSObject *)copyRenderNode:(RenderObject *)node copier:(id )copier 
{ 
    NSMutableArray *children = [[NSMutableArray alloc] init]; 
    for (RenderObject *child = node->firstChild(); child; child = child->nextSibling()) { 
        [children addObject:[self copyRenderNode:child copier:copier]]; 
    } 
 
    NSString *name = [[NSString alloc] initWithUTF8String:node->renderName()]; 
 
    RenderPart *nodeRenderPart = dynamic_cast(node); 
    QWidget *widget = nodeRenderPart ? nodeRenderPart->widget() : 0; 
    NSView *view = widget ? widget->getView() : nil; 
 
    int nx, ny; 
    node->absolutePosition(nx,ny); 
    NSObject *copiedNode = [copier nodeWithName:name 
                                       position:NSMakePoint(nx,ny) 
                                           rect:NSMakeRect(node->xPos(), node->yPos(), node->width(), node->height()) 
                                           view:view 
                                       children:children]; 
 
    [name release]; 
    [children release]; 
 
    return copiedNode; 
} 
 
- (NSObject *)copyRenderTree:(id )copier 
{ 
    RenderObject *renderer = iPart->renderer(); 
    if (!renderer) { 
        return nil; 
    } 
    return [self copyRenderNode:renderer copier:copier]; 
} 
*/ 
 
EXPORT_C 
void CWebCoreBridge::RemoveFromFrame() 
{ 
    if (iPart->view()) 
        iPart->view()->setView(0); 
    iPart->setView(0); 
 
    // tell image renderers this frame does not exist any more 
    MWebCoreScrollView* view = &Client().DocumentView(); 
    QDictIterator it( *khtml::Cache::cache ); 
    khtml::CachedObject* o = 0; 
    while( ( o = it.current() ) != NULL ) { 
        if( o->type() == khtml::CachedObject::Image ) { 
            const QPixmap& pm = static_cast(o)->pixmap(); 
            if (pm.image()) 
                pm.image()->RemoveFromScrollView(view); 
        } 
        ++it; 
    } 
} 
 
EXPORT_C 
void CWebCoreBridge::InstallInFrame(MWebCoreScrollView& aView) 
{ 
    iPart->view()->setView(&aView); 
    if (iRenderPart) { 
        iRenderPart->setWidget(iPart->view()); 
        // Now the render part owns the view, so we don't any more. 
    } 
 
    iPart->view()->initScrollBars(); 
    iPart->view()->setScalingFactor(aView.ScalingFactor()); 
} 
 
// ### NOT IMPLEMENTED events 
/* 
- (void)mouseDown:(NSEvent *)event 
{ 
    iPart->mouseDown(event); 
} 
 
- (void)mouseDragged:(NSEvent *)event 
{ 
    iPart->mouseDragged(event); 
} 
 
- (void)mouseUp:(NSEvent *)event 
{ 
    iPart->mouseUp(event); 
} 
 
- (void)mouseMoved:(NSEvent *)event 
{ 
    iPart->mouseMoved(event); 
} 
 
- (BOOL)sendContextMenuEvent:(NSEvent *)event 
{ 
    return iPart->sendContextMenuEvent(event); 
} 
*/ 
 
// ### NOT IMPLEMENTED dom interface 
/* 
- (DOMElement *)elementForView:(NSView *)view 
{ 
    // FIXME: implemented currently for only a subset of the KWQ widgets 
    if ([view conformsToProtocol:@protocol(KWQWidgetHolder)]) { 
        NSView  *widgetHolder = view; 
        QWidget *widget = [widgetHolder widget]; 
        if (widget != nil) { 
            NodeImpl *node = static_cast(widget->eventFilterObject())->element(); 
            return [DOMElement _elementWithImpl:static_cast(node)]; 
        } 
    } 
    return nil; 
} 
 
static NSView *viewForElement(ElementImpl *elementImpl) 
{ 
    RenderObject *renderer = elementImpl->renderer(); 
    if (renderer && renderer->isWidget()) { 
        QWidget *widget = static_cast(renderer)->widget(); 
        if (widget) { 
            widget->populate(); 
            return widget->getView(); 
        } 
    } 
    return nil; 
} 
 
static HTMLInputElementImpl *inputElementFromDOMElement(DOMElement *element) 
{ 
    NodeImpl *node = [element _nodeImpl]; 
    if (node && idFromNode(node) == ID_INPUT) { 
        return static_cast(node); 
    } 
    return nil; 
} 
 
static HTMLFormElementImpl *formElementFromDOMElement(DOMElement *element) 
{ 
    NodeImpl *node = [element _nodeImpl]; 
    if (node && idFromNode(node) == ID_FORM) { 
        return static_cast(node); 
    } 
    return nil; 
} 
 
- (DOMElement *)elementWithName:(NSString *)name inForm:(DOMElement *)form 
{ 
    HTMLFormElementImpl *formElement = formElementFromDOMElement(form); 
    if (formElement) { 
        QPtrList elements = formElement->formElements; 
        QString targetName = QString::fromNSString(name); 
        for (unsigned int i = 0; i < elements.count(); i++) { 
            HTMLGenericFormElementImpl *elt = elements.at(i); 
            // Skip option elements, other duds 
            if (elt->name() == targetName) { 
                return [DOMElement _elementWithImpl:elt]; 
            } 
        } 
    } 
    return nil; 
} 
 
- (BOOL)elementDoesAutoComplete:(DOMElement *)element 
{ 
    HTMLInputElementImpl *inputElement = inputElementFromDOMElement(element); 
    return inputElement != nil 
        && inputElement->inputType() == HTMLInputElementImpl::TEXT 
        && inputElement->autoComplete(); 
} 
 
- (BOOL)elementIsPassword:(DOMElement *)element 
{ 
    HTMLInputElementImpl *inputElement = inputElementFromDOMElement(element); 
    return inputElement != nil 
        && inputElement->inputType() == HTMLInputElementImpl::PASSWORD; 
} 
 
- (DOMElement *)formForElement:(DOMElement *)element; 
{ 
    HTMLInputElementImpl *inputElement = inputElementFromDOMElement(element); 
    if (inputElement) { 
        HTMLFormElementImpl *formElement = inputElement->form(); 
        if (formElement) { 
            return [DOMElement _elementWithImpl:formElement]; 
        } 
    } 
    return nil; 
} 
 
- (DOMElement *)currentForm 
{ 
    HTMLFormElementImpl *formElement = iPart->currentForm(); 
    return formElement ? [DOMElement _elementWithImpl:formElement] : nil; 
} 
 
- (NSArray *)controlsInForm:(DOMElement *)form 
{ 
    NSMutableArray *results = nil; 
    HTMLFormElementImpl *formElement = formElementFromDOMElement(form); 
    if (formElement) { 
        QPtrList elements = formElement->formElements; 
        for (unsigned int i = 0; i < elements.count(); i++) { 
            if (elements.at(i)->isEnumeratable()) {     // Skip option elements, other duds 
                NSView *view = viewForElement(elements.at(i)); 
                if (view) { 
                    if (!results) { 
                        results = [NSMutableArray arrayWithObject:view]; 
                    } else { 
                        [results addObject:view]; 
                    } 
                } 
            } 
        } 
    } 
    return results; 
} 
 
- (NSString *)searchForLabels:(NSArray *)labels beforeElement:(DOMElement *)element 
{ 
    return iPart->searchForLabelsBeforeElement(labels, [element _elementImpl]); 
} 
 
- (NSString *)matchLabels:(NSArray *)labels againstElement:(DOMElement *)element 
{ 
    return iPart->matchLabelsAgainstElement(labels, [element _elementImpl]); 
} 
 
- (NSDictionary *)elementAtPoint:(NSPoint)point 
{ 
    RenderObject *renderer = iPart->renderer(); 
    if (!renderer) { 
        return nil; 
    } 
    RenderObject::NodeInfo nodeInfo(true, true); 
    renderer->layer()->nodeAtPoint(nodeInfo, (int)point.x, (int)point.y); 
 
    NSMutableDictionary *element = [NSMutableDictionary dictionary]; 
    [element setObject:[NSNumber numberWithBool:iPart->isPointInsideSelection((int)point.x, (int)point.y)] 
                forKey:WebCoreElementIsSelectedKey]; 
 
    // Find the title in the nearest enclosing DOM node. 
    // For  tags in image maps, walk the tree for the , not the  using it. 
    for (NodeImpl *titleNode = nodeInfo.innerNode(); titleNode; titleNode = titleNode->parentNode()) { 
        if (titleNode->isElementNode()) { 
            const AtomicString& title = static_cast(titleNode)->getAttribute(ATTR_TITLE); 
            if (!title.isNull()) { 
                // We found a node with a title. 
                QString titleText = title.string(); 
                titleText.replace('\\', iPart->backslashAsCurrencySymbol()); 
                [element setObject:titleText.getNSString() forKey:WebCoreElementTitleKey]; 
                break; 
            } 
        } 
    } 
 
    NodeImpl *URLNode = nodeInfo.URLElement(); 
    if (URLNode) { 
        ElementImpl *e = static_cast(URLNode); 
 
        const AtomicString& title = e->getAttribute(ATTR_TITLE); 
        if (!title.isEmpty()) { 
            QString titleText = title.string(); 
            titleText.replace('\\', iPart->backslashAsCurrencySymbol()); 
            [element setObject:titleText.getNSString() forKey:WebCoreElementLinkTitleKey]; 
        } 
 
        const AtomicString& link = e->getAttribute(ATTR_HREF); 
        if (!link.isNull()) { 
            if (e->firstChild()) { 
                Range r(iPart->document()); 
                r.setStartBefore(e->firstChild()); 
                r.setEndAfter(e->lastChild()); 
                QString t = iPart->text(r); 
                if (!t.isEmpty()) { 
                    [element setObject:t.getNSString() forKey:WebCoreElementLinkLabelKey]; 
                } 
            } 
            QString URLString = parseURL(link).string(); 
            [element setObject:iPart->xmlDocImpl()->completeURL(URLString).getNSString() forKey:WebCoreElementLinkURLKey]; 
        } 
 
        DOMString target = e->getAttribute(ATTR_TARGET); 
        if (target.isEmpty() && iPart->xmlDocImpl()) { 
            target = iPart->xmlDocImpl()->baseTarget(); 
        } 
        if (!target.isEmpty()) { 
            [element setObject:target.string().getNSString() forKey:WebCoreElementLinkTargetFrameKey]; 
        } 
    } 
 
    NodeImpl *node = nodeInfo.innerNonSharedNode(); 
    if (node) { 
        [element setObject:[DOMNode _nodeWithImpl:node] forKey:WebCoreElementDOMNodeKey]; 
 
        if (node->renderer() && node->renderer()->isImage()) { 
            RenderImage *r = static_cast(node->renderer()); 
            NSImage *image = r->pixmap().image(); 
            // Only return image information if there is an image. 
            if (image && !r->isDisplayingError()) { 
                [element setObject:r->pixmap().image() forKey:WebCoreElementImageKey]; 
 
                int x, y; 
                if (r->absolutePosition(x, y)) { 
                    NSValue *rect = [NSValue valueWithRect:NSMakeRect(x, y, r->contentWidth(), r->contentHeight())]; 
                    [element setObject:rect forKey:WebCoreElementImageRectKey]; 
                } 
 
                ElementImpl *i = static_cast(node); 
 
                // FIXME: Code copied from RenderImage::updateFromElement; should share. 
                DOMString attr; 
                if (idFromNode(i) == ID_OBJECT) { 
                    attr = i->getAttribute(ATTR_DATA); 
                } else { 
                    attr = i->getAttribute(ATTR_SRC); 
                } 
                if (!attr.isEmpty()) { 
                    QString URLString = parseURL(attr).string(); 
                    [element setObject:iPart->xmlDocImpl()->completeURL(URLString).getNSString() forKey:WebCoreElementImageURLKey]; 
                } 
 
                // FIXME: Code copied from RenderImage::updateFromElement; should share. 
                DOMString alt; 
                if (idFromNode(i) == ID_INPUT) 
                    alt = static_cast(i)->altText(); 
                else if (idFromNode(i) == ID_IMG) 
                    alt = static_cast(i)->altText(); 
                if (!alt.isNull()) { 
                    QString altText = alt.string(); 
                    altText.replace('\\', iPart->backslashAsCurrencySymbol()); 
                    [element setObject:altText.getNSString() forKey:WebCoreElementImageAltStringKey]; 
                } 
            } 
        } 
    } 
 
    return element; 
} 
*/ 
 
EXPORT_C 
HBufC* CWebCoreBridge::URLWithRelativeString(const TDesC& aString) 
{ 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
    if (!doc) { 
        return 0; 
    } 
    QString rel = parseURL(QString::FromDes(aString)).string(); 
 
    return rel.Des().Alloc(); 
} 
 
EXPORT_C 
TInt CWebCoreBridge::SearchAgain(const TDesC& aString, TBool aForward, TBool aCaseSensitive, TBool aWrap) 
{ 
  return iPart->FindStringAgain(aString, aForward, aCaseSensitive, aWrap); 
} 
 
EXPORT_C 
TInt CWebCoreBridge::SearchFor(const TDesC& aString, TBool aForward, TBool aCaseSensitive, TBool aWrap) 
{ 
    return iPart->FindString(aString, aForward, aCaseSensitive, aWrap); 
} 
 
EXPORT_C 
void CWebCoreBridge::ClearFind() 
{ 
  iPart->ClearFind(); 
} 
 
EXPORT_C 
void CWebCoreBridge::JumpToSelection() 
{ 
    iPart->jumpToSelection(); 
} 
 
EXPORT_C 
void CWebCoreBridge::SetFontSizeLevel( TInt aLevel ) 
{ 
    iPart->setFontSizeLevel( aLevel ); 
} 
 
EXPORT_C 
TUint CWebCoreBridge::TextEncoding() const 
{ 
// ### NOT IMPLEMENTED text encoding 
    //return KWQCFStringEncodingFromIANACharsetName(iPart->encoding().latin1()); 
    return 0; 
} 
 
// ### NOT IMPLEMENTED nextkey etc 
/* 
- (NSView *)nextKeyView 
{ 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
    if (!doc) { 
        return nil; 
    } 
    return iPart->nextKeyView(doc->focusNode(), KWQSelectingNext); 
} 
 
- (NSView *)previousKeyView 
{ 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
    if (!doc) { 
        return nil; 
    } 
    return iPart->nextKeyView(doc->focusNode(), KWQSelectingPrevious); 
} 
 
- (NSView *)nextKeyViewInsideWebFrameViews 
{ 
    return iPart->nextKeyViewInFrameHierarchy(0, KWQSelectingNext); 
} 
 
- (NSView *)previousKeyViewInsideWebFrameViews 
{ 
    return iPart->nextKeyViewInFrameHierarchy(0, KWQSelectingPrevious); 
} 
*/ 
 
// ### NOT IMPLEMENTED javascript 
/* 
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)string 
{ 
    iPart->createEmptyDocument(); 
    return iPart->executeScript(QString::fromNSString(string), true).asString().getNSString(); 
} 
 
- (WebScriptObject *)windowScriptObject 
{ 
    return iPart->windowScriptObject(); 
} 
*/ 
 
// ### NOT IMPLEMENTED dom interface & selections 
/* 
- (DOMDocument *)DOMDocument 
{ 
    return [DOMDocument _documentWithImpl:iPart->xmlDocImpl()]; 
} 
 
- (DOMHTMLElement *)frameElement 
{ 
    return (DOMHTMLElement *)[[self DOMDocument] _ownerElement]; 
} 
 
- (void)setSelectionFrom:(DOMNode *)start startOffset:(int)startOffset to:(DOMNode *)end endOffset:(int) endOffset 
{ 
    Position s([start _nodeImpl], startOffset); 
    Position e([end _nodeImpl], endOffset); 
    iPart->setSelection(Selection(s, e)); 
} 
 
- (NSAttributedString *)selectedAttributedString 
{ 
    return iPart->attributedString(iPart->selectionStart(), iPart->selectionStartOffset(), iPart->selectionEnd(), iPart->selectionEndOffset()); 
} 
 
- (NSAttributedString *)attributedStringFrom:(DOMNode *)start startOffset:(int)startOffset to:(DOMNode *)end endOffset:(int)endOffset 
{ 
    DOMNode *startNode = start; 
    DOMNode *endNode = end; 
    return iPart->attributedString([startNode _nodeImpl], startOffset, [endNode _nodeImpl], endOffset); 
} 
 
- (NSFont *)renderedFontForNode:(DOMNode *)node 
{ 
    RenderObject *renderer = [node _nodeImpl]->renderer(); 
    if (renderer) { 
        return renderer->style()->font().getNSFont(); 
    } 
    return nil; 
} 
 
- (DOMNode *)selectionStart 
{ 
    return [DOMNode _nodeWithImpl:iPart->selectionStart()]; 
} 
 
- (int)selectionStartOffset 
{ 
    return iPart->selectionStartOffset(); 
} 
 
- (DOMNode *)selectionEnd 
{ 
    return [DOMNode _nodeWithImpl:iPart->selectionEnd()]; 
} 
 
- (int)selectionEndOffset 
{ 
    return iPart->selectionEndOffset(); 
} 
 
- (NSRect)selectionRect 
{ 
    return iPart->selectionRect(); 
} 
 
- (NSRect)visibleSelectionRect 
{ 
    return iPart->visibleSelectionRect(); 
} 
 
- (NSImage *)selectionImage 
{ 
    return iPart->selectionImage(); 
} 
 
*/ 
EXPORT_C 
void CWebCoreBridge::SetName(const TDesC& aName) 
{ 
    iPart->KHTMLPart::setName(QString::FromDes(aName)); 
} 
 
EXPORT_C 
TPtrC CWebCoreBridge::Name() const 
{ 
    return iPart->name().Des(); 
} 
 
EXPORT_C 
TPtrC CWebCoreBridge::URL() const 
{ 
    return iPart->url().Des(); 
} 
 
 
EXPORT_C 
TPtrC CWebCoreBridge::Domain() const 
{ 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
    if (doc && doc->isHTMLDocument()) { 
        return doc->domain().string().Des(); 
    } 
    return KNullDesC(); 
} 
 
EXPORT_C 
HBufC* CWebCoreBridge::GetTextContentL() 
{ 
 
  if((!iPart) ||(!iPart->xmlDocImpl())) { 
        return NULL; 
    } 
 
   // __UHEAP_MARK; 
 
  QStringList array; 
  int textLength = 0; 
  DOMString textString; 
    HBufC* findText = NULL; 
  _LIT(KBr,"\n"); 
 
  RenderObject* robject = iPart->xmlDocImpl()->renderer(); 
  while (robject) 
    { 
      if(robject->isText()) 
      { 
        RenderText* textRenderer = static_cast(robject); 
        textString = textRenderer->string(); 
        textLength += textString.length(); 
        array.append(textString.string()); 
      } 
      else if (robject->isTextArea()) 
      { 
        RenderTextArea* textareaRenderer = static_cast(robject); 
        textString = textareaRenderer->text(); 
        textLength += textString.length(); 
        array.append(textString.string()); 
      } 
      else if (robject->isImage()) 
      { 
        textString = static_cast(robject->element())->altText(); 
        textLength += textString.length(); 
        array.append(textString.string()); 
      } 
      else if(robject->element()) 
      { 
        if(robject->element()->id()==ID_A) 
        { 
        textString = static_cast(robject->element())->getAttribute(ATTR_HREF); 
        textLength += textString.length(); 
        array.append(textString.string()); 
        } 
        else if(robject->element()->id()==ID_INPUT) 
        { 
        textString = static_cast(robject->element())->value(); 
        textLength += textString.length(); 
        array.append(textString.string()); 
        } 
      } 
      robject = robject->nextRenderer(); 
    } 
 
  int count = array.count(); 
  findText = HBufC::NewL(textLength + count*sizeof(KBr)); 
  for( QStringList::Iterator it = array.begin(); it != array.end(); ++it ) 
  { 
    findText->Des().Append((*it).Des()); 
    findText->Des().Append(KBr()); 
  } 
 
  return findText; 
} 
 
EXPORT_C 
TPtrC CWebCoreBridge::GetNextRenderTextForSmartLinksL(TBool& aContinue) 
{ 
 
    if((!iPart) || (!iPart->xmlDocImpl()))  
        { 
        aContinue = EFalse; 
        return TPtrC(); 
        } 
   
    if (iSmartLinkNode == NULL) 
        { 
        iSmartLinkNode = iPart->xmlDocImpl(); 
        if(iSmartLinkNode) 
            { 
            iSmartLinkNode->ref(); 
            } 
        //add ref 
        } 
    else  
        {    
        DOM::NodeImpl* nodeTemp = iSmartLinkNode; 
        iSmartLinkNode = iSmartLinkNode->traverseNextNode();   
        if(iSmartLinkNode) 
            { 
            iSmartLinkNode->ref(); 
            } 
        nodeTemp->deref(); 
        } 
 
    while (iSmartLinkNode) 
    { 
 
    if (iSmartLinkNode->renderer()) 
        { 
        if(iSmartLinkNode->renderer()->isText()) 
            { 
            aContinue = ETrue; 
            RenderText* textRenderer = static_cast(iSmartLinkNode->renderer());            
            delete iSmartTextBuffer; 
            iSmartTextBuffer = NULL; 
            iSmartTextBuffer = textRenderer->data().string().Des().AllocL();                 
            return iSmartTextBuffer->Ptr(); 
            } 
        } 
 
    DOM::NodeImpl* nodeTemp = iSmartLinkNode; 
    iSmartLinkNode = iSmartLinkNode->traverseNextNode();    
    if(iSmartLinkNode) 
        { 
        iSmartLinkNode->ref(); 
        } 
 
    nodeTemp->deref(); 
    } 
 
    aContinue = EFalse; 
    return TPtrC();     
} 
 
EXPORT_C 
void CWebCoreBridge::GetRenderTextArea(const TDesC& aText, RArray& aRect) 
{ 
  iPart->getRenderTextRectArray(aText, Node(iSmartLinkNode), aRect);    
} 
 
 
EXPORT_C 
TPtrC CWebCoreBridge::Referrer() const 
{ 
    return iPart->referrer().Des(); 
} 
 
// ### NOT IMPLEMENTED text encoding 
/* 
+ (NSString *)stringWithData:(NSData *)data textEncoding:(CFStringEncoding)textEncoding 
{ 
    if (textEncoding == kCFStringEncodingInvalidId || textEncoding == kCFStringEncodingISOLatin1) { 
        textEncoding = kCFStringEncodingWindowsLatin1; 
    } 
    return QTextCodec(textEncoding).toUnicode((const char*)[data bytes], [data length]).getNSString(); 
} 
 
+ (NSString *)stringWithData:(NSData *)data textEncodingName:(NSString *)textEncodingName 
{ 
    CFStringEncoding textEncoding = KWQCFStringEncodingFromIANACharsetName([textEncodingName lossyCString]); 
    return [WebCoreBridge stringWithData:data textEncoding:textEncoding]; 
} 
*/ 
 
EXPORT_C 
void CWebCoreBridge::UpdateAllViews() 
{ 
    for (QPtrListIterator it(KWQKHTMLPart::instances()); it.current(); ++it) { 
        KWQKHTMLPart *part = it.current(); 
        part->bridge()->Client().SetNeedsReapplyStyles(); 
    } 
} 
 
EXPORT_C 
HBufC* CWebCoreBridge::GetUrlOfNodeInFocusL(TPoint& aPoint) const 
{ 
  DocumentImpl* docImpl = iPart->xmlDocImpl(); 
  HBufC* newUrl = NULL; 
  if(docImpl) 
    { 
      // get the current focus node 
    RenderObject::NodeInfo renderInfo(true, false); 
    iPart->renderer()->layer()->hitTest(renderInfo, aPoint.iX, aPoint.iY); 
 
    NodeImpl *focusNode  = renderInfo.innerNode(); 
    for (; focusNode ; focusNode = focusNode->parentNode()) { 
      if (focusNode->isElementNode() && focusNode->isFocusable()) { 
            break; 
        } 
      } 
      // is element node 
      if(focusNode && (focusNode->id() == ID_A)) 
      { 
        ElementImpl *e = static_cast(focusNode); 
        QString url = e->getAttribute(ATTR_HREF).string(); 
        KURL absUrl = iPart->completeURL(url); 
        newUrl = HBufC::NewL(absUrl.url().length()); 
        newUrl->Des().Copy(absUrl.url().Des()); 
      } 
    } 
  return newUrl; 
} 
 
EXPORT_C 
TBool CWebCoreBridge::NeedsLayout() const 
{ 
    RenderObject *renderer = iPart->renderer(); 
    return renderer ? renderer->needsLayout() : false; 
} 
 
EXPORT_C 
void CWebCoreBridge::SetNeedsLayout() 
{ 
    RenderObject *renderer = iPart->renderer(); 
    if (renderer) 
        renderer->setNeedsLayout(true); 
} 
 
EXPORT_C 
TBool CWebCoreBridge::KeyEvent(TKeyEvent aEvent, TBool aUpEvent) 
{ 
    return iPart->KeyEvent(aEvent, aUpEvent); 
} 
 
EXPORT_C 
void CWebCoreBridge::ActivateEvent(TPoint &aPoint) 
{ 
    if(Client().IsTabbedNavigationEnabled()) { 
     if(iPart && iPart->xmlDocImpl()) { 
      NodeImpl *focusNode = iPart->xmlDocImpl()->focusNode(); 
      if(focusNode) { 
       iPart->activateEvent(); 
      } 
     } 
     return; 
  } 
 
    iPart->activateNodeAtPoint(QPoint(aPoint.iX,aPoint.iY)); 
} 
 
EXPORT_C 
void CWebCoreBridge::DeActivateEvent(TBool aAcceptChanges) 
{ 
  iPart->deActivateEvent(aAcceptChanges); 
  iPart->xmlDocImpl()->setFocusNode( 0 ); 
} 
 
 
EXPORT_C 
void CWebCoreBridge::RemoveFileName( TPoint& aPoint ) 
{ 
    RenderObject::NodeInfo renderInfo(true, false); 
    iPart->renderer()->layer()->hitTest(renderInfo, aPoint.iX, aPoint.iY); 
 
    NodeImpl *node = renderInfo.innerNode(); 
 
    // is element node 
    if( node && node->isElementNode() && idFromNode(node) ==  ID_INPUT) 
    { 
        // the is a file 
        HTMLInputElementImpl* inputElement = static_cast(node); 
 
        if(inputElement->inputType() == HTMLInputElementImpl::FILE && 
            inputElement->value().length()) 
        { 
 
            //Check if the render object is valid and is a widget 
            if (node->renderer() && node->renderer()->isWidget()) 
            { 
                QWidget *widget = static_cast(node->renderer())->widget(); 
                if(widget ) 
                { 
                    static_cast(widget)->setFilename(""); 
                } 
            } 
        } 
    } 
} 
 
EXPORT_C 
void CWebCoreBridge::ActivateAccessKeys(TKeyEvent aKeyEvent) 
{ 
  NodeImpl* oldFocusNode = NULL; 
  NodeImpl* newFocusNode = NULL; 
 
  DocumentImpl* docImpl = iPart->xmlDocImpl(); 
  if (docImpl) 
    oldFocusNode = docImpl->focusNode(); 
 
    // We expect Left-Control modifier set to handle accesskey support 
    TKeyEvent accessKeyEvent( aKeyEvent ); 
    accessKeyEvent.iModifiers = EModifierLeftCtrl; 
    iPart->KeyEvent(accessKeyEvent, false); 
 
  if (docImpl) 
        newFocusNode = docImpl->focusNode(); 
 
    if ( newFocusNode && oldFocusNode != newFocusNode ) { 
        iPart->scrollTo(newFocusNode->getRect()); 
        // viewp after scroll 
      TPoint viewp( iPart->view()->contentsX(), iPart->view()->contentsY() ); 
        TPoint nodep( newFocusNode->getRect().Rect().Center() ); 
        // hover 
        PointerEvent( TPointerEvent::EMove, nodep ); 
        // move cursor 
        TPoint newp( nodep.iX - viewp.iX, nodep.iY - viewp.iY ); 
        Client().SetCursorPosition( newp, NodeTypeB( newFocusNode ) ); 
    } 
} 
 
EXPORT_C 
void CWebCoreBridge::PointerEvent(TPointerEvent aEvent) 
{ 
    switch (aEvent.iType) 
    { 
        case TPointerEvent::EButton1Down: 
        case TPointerEvent::EButton2Down: 
        case TPointerEvent::EButton3Down: 
            iPart->MouseDown(aEvent); 
            break; 
        case TPointerEvent::EButton1Up: 
        case TPointerEvent::EButton2Up: 
        case TPointerEvent::EButton3Up: 
            iPart->MouseUp(aEvent); 
            break; 
        case TPointerEvent::EMove: 
            iPart->MouseMoved(aEvent); 
            break; 
         case TPointerEvent::EDrag: 
            iPart->MouseDragged(aEvent); 
            break; 
        default: ; 
    } 
} 
 
EXPORT_C 
void CWebCoreBridge::PointerEvent(TPointerEvent::TType aEventType, const TPoint &aPosition) 
{ 
   TPointerEvent pointerEvent; 
   pointerEvent.iType = TPointerEvent::EMove; 
   pointerEvent.iPosition = aPosition; 
   pointerEvent.iModifiers = 0; 
   PointerEvent(pointerEvent); 
} 
 
// ### NOT IMPLEMENTED events 
/* 
- (BOOL)interceptKeyEvent:(NSEvent *)event toView:(NSView *)view 
{ 
    return iPart->keyEvent(event); 
} 
*/ 
 
// ### NOT IMPLEMENTED debug 
/* 
- (NSString *)renderTreeAsExternalRepresentation 
{ 
    return externalRepresentation(iPart->renderer()).getNSString(); 
} 
*/ 
 
 
/*EXPORT_C 
void CWebCoreBridge::SetUsesInactiveTextBackgroundColor(TBool aUses) 
{ 
    iPart->setUsesInactiveTextBackgroundColor(aUses); 
} 
 
EXPORT_C 
TBool CWebCoreBridge::UsesInactiveTextBackgroundColor() 
{ 
    return iPart->usesInactiveTextBackgroundColor(); 
}*/ 
 
// ### NOT IMPLEMENTED ?? 
/* 
- (void)setShowsFirstResponder:(BOOL)flag 
{ 
    iPart->setShowsFirstResponder(flag); 
} 
*/ 
 
EXPORT_C 
void CWebCoreBridge::SetShouldCreateRenderers(TBool aCreateRenderers) 
{ 
    iShouldCreateRenderers = aCreateRenderers; 
} 
 
EXPORT_C 
TBool CWebCoreBridge::ShouldCreateRenderers() 
{ 
    return iShouldCreateRenderers; 
} 
 
EXPORT_C 
TInt CWebCoreBridge::NumPendingOrLoadingRequests() 
{ 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
 
    if (doc) 
        return KWQNumberOfPendingOrLoadingRequests (doc->docLoader()); 
    return 0; 
} 
 
EXPORT_C 
TRgb CWebCoreBridge::BodyBackgroundColor() 
{ 
    return iPart->BodyBackgroundColor(); 
} 
 
EXPORT_C 
TRgb CWebCoreBridge::SelectionColor() 
{ 
    RenderCanvas* root = static_cast(iPart->xmlDocImpl()->renderer()); 
    if (root) { 
        RenderStyle *pseudoStyle = root->getPseudoStyle(RenderStyle::SELECTION); 
        if (pseudoStyle && pseudoStyle->backgroundColor().isValid()) { 
            return pseudoStyle->backgroundColor().Rgb(); 
        } 
    } 
    return TRgb(0xff,0,0); 
 
// ### NOT IMPLEMENTED selection colors 
    //return iPart->usesInactiveTextBackgroundColor() ? [NSColor secondarySelectedControlColor] : [NSColor selectedTextBackgroundColor]; 
} 
 
EXPORT_C 
void CWebCoreBridge::AdjustViewSize() 
{ 
    KHTMLView *view = iPart->view(); 
    if (view) 
        view->adjustViewSize(); 
} 
 
EXPORT_C void CWebCoreBridge::ExecuteScript(const TDesC& aScriptText) 
{ 
  NodeImpl* node = iPart->xmlDocImpl()->focusNode(); 
  if (iPart && node) 
     iPart->executeScript(node,QString::FromDes(aScriptText)); 
} 
 
 
// ### NOT IMPLEMENTED accessibility 
/* 
-(id)accessibilityTree 
{ 
    KWQAccObjectCache::enableAccessibility(); 
    if (!iPart || !iPart->xmlDocImpl()) return nil; 
    RenderCanvas* root = static_cast(iPart->xmlDocImpl()->renderer()); 
    if (!root) return nil; 
    return iPart->xmlDocImpl()->getOrCreateAccObjectCache()->accObject(root); 
} 
*/ 
 
 
EXPORT_C 
void CWebCoreBridge::SetDrawsBackground(TBool aDrawsBackground) 
{ 
    if (iPart && iPart->view()) 
        iPart->view()->setTransparent(!aDrawsBackground); 
} 
 
EXPORT_C HBufC* CWebCoreBridge::ResolveUrlL(const TDesC &aBaseUrl, const TDesC &aResUrl) 
{ 
    QString resource = QString::FromDes(aResUrl); 
    KURL baseUrl(aBaseUrl); 
    KURL url(baseUrl,resource,NULL); 
    QString completeUrl = url.url(); 
    HBufC* newUrl = HBufC::NewL(completeUrl.length() + 1); 
    TPtr newUrlPtr = newUrl->Des(); 
    newUrlPtr.Copy(completeUrl.Des()); 
    return newUrl; 
} 
 
EXPORT_C 
CArrayFixFlat* CWebCoreBridge::ImagesInRect(TBool visibleOnly) 
{ 
 
 
  if(!iPart || !iPart->xmlDocImpl() || !iPart->xmlDocImpl()->renderer()) 
    { 
    return NULL; 
    } 
 
    KHTMLView *view = iPart->view(); 
  QPtrList *boxInfoList = new QPtrList; 
 
  int contentsx = view->contentsX();          // view port x position 
    int contentsy = view->contentsY();            // view port y position 
    int contentsW = view->contentsWidth();        // width of the content 
    int contentsH = view->contentsHeight();       // height of the content 
    int visibleW = view->visibleWidth();          // width of the display 
    int visibleH = view->visibleHeight();         // height of the display 
 
  if (visibleOnly) { // get the rectangle for the visible portion only 
      QRect viewrect(contentsx, contentsy, visibleW, visibleH); 
    iPart->xmlDocImpl()->renderer()->getRenderersInRect(*boxInfoList,0,0,viewrect); 
  } 
  else { 
    QRect rt(0,0,contentsW,contentsH); 
    iPart->xmlDocImpl()->renderer()->getRenderersInRect(*boxInfoList,0,0,rt); 
  } 
 
  //Initialise the WebCoreImageCarrier 
  CArrayFixFlat* imageList = 
        new CArrayFixFlat(10); 
 
  for(khtml::BoxInfo *sel = boxInfoList->first();sel;sel = boxInfoList->next()) 
    { 
      if (sel->renderObject && sel->renderObject->isImage()) { 
        NodeImpl* node = sel->renderObject->node(); 
        RenderImage *r = static_cast(node->renderer()); 
        QPixmap p = r->pixmap(); 
        khtml::CachedImage* ci = r->getImage(); 
 
                if( !ci ) continue; 
 
        TPtrC8 rawData = ci->rawData(); 
 
        // Check if there is data in the image buffer. 
        // Broken links do not have data in them 
        if (rawData.Length() == 0) { 
          // No data present, so continue 
          continue; 
        } 
 
        // Check if this image has been retrieved before. 
        // Image pointer should be the same for similar images 
        TBool imageExist = false; 
        for (int i=0; iCount();i++) 
        { 
          TWebCoreImageCarrier wcImage = imageList->At(i); 
          if ( rawData == wcImage.RawData()) { 
              imageExist = true; 
              break; 
          } 
        } 
        if ( imageExist )  {// do not add to the imageList 
          continue; 
        } 
 
        // Get the alt text 
 
              DOMString alt; 
        ElementImpl *i = static_cast(node); 
        if (idFromNode(i) == ID_IMG) 
                    alt = static_cast(i)->altText(); 
 
                // Check if alttext is "Nokia" or "No_save". 
                // Then do not add the image to the list 
                const char* str1 = "Nokia"; 
                const char* str2 = "No_Save"; 
 
                if ( !strcasecmp( alt, str1) ||  !strcasecmp( alt, str2)  ) 
                    continue; 
 
        DOM::DOMString url = ci->url(); 
        TPtrC ptrUrl((TUint16*)url.unicode(), url.length()); 
        TPtrC altPtr((TUint16*)alt.unicode(), alt.length()); 
 
 
            TWebCoreImageCarrier t (rawData, 
             ptrUrl, 
         altPtr, 
         p.mime().Des(), 
         p.image() ) ; 
 
            imageList->AppendL( t ); 
        } 
    } 
  boxInfoList->clear(); 
  delete boxInfoList; 
  return imageList; 
} 
 
 
EXPORT_C 
TInt CWebCoreBridge::ImageCount(TBool visibleOnly) 
{ 
 
  // This function is called sometimes whenthe doucment has not rendered. 
  if(!iPart || !iPart->xmlDocImpl() || !iPart->xmlDocImpl()->renderer()) 
    { 
    return 0; 
    } 
 
  // Get the renderers for rectangle. 
  // Get only the image renderers and get the count 
  // no need for raw data here. 
  KHTMLView *view = iPart->view(); 
  QPtrList *boxInfoList = new QPtrList; 
 
  int contentsx = view->contentsX();          // view port x position 
    int contentsy = view->contentsY();            // view port y position 
    int contentsW = view->contentsWidth();        // width of the content 
    int contentsH = view->contentsHeight();       // height of the content 
    int visibleW = view->visibleWidth();          // width of the display 
    int visibleH = view->visibleHeight();         // height of the display 
 
  if (visibleOnly) {// get the rectangle for the visible portion only 
      QRect viewrect(contentsx, contentsy, visibleW, visibleH); 
    iPart->xmlDocImpl()->renderer()->getRenderersInRect(*boxInfoList,0,0,viewrect); 
  } 
  else { 
    QRect rt(0,0,contentsW,contentsH); 
    iPart->xmlDocImpl()->renderer()->getRenderersInRect(*boxInfoList,0,0,rt); 
  } 
 
  int numImages = 0; 
  for(khtml::BoxInfo *sel = boxInfoList->first();sel;sel = boxInfoList->next()) 
    { 
    if (sel->renderObject && sel->renderObject->isImage()) { 
      // Check if the images have data in them. 
      // Sometimes broken links do not have data in them. 
      // This should not be included 
      RenderImage *r = static_cast(sel->renderObject); 
      khtml::CachedImage* ci = r->getImage(); 
 
      if ( ci && ( ci->rawData().Length() > 0 ) ) { 
    // Get the alt text 
    DOMString alt; 
    ElementImpl *i = static_cast(sel->renderObject->node()); 
    if ( i && ( idFromNode(i) == ID_IMG ) ) 
      alt = static_cast(i)->altText(); 
 
        // Check if alttext is "Nokia" or "No_save". 
        // Then do not count that image 
        const char* str1 = "Nokia"; 
        const char* str2 = "No_Save"; 
 
        if ( !strcasecmp( alt, str1) ||  !strcasecmp( alt, str2) ) 
      continue; 
    numImages++; 
        } 
      } 
    } 
  boxInfoList->clear(); 
  delete boxInfoList; 
 
  return numImages; 
} 
 
 
EXPORT_C 
void CWebCoreBridge::AddToContacts(TPoint& aPoint) 
{ 
  if(iPart->xmlDocImpl()) 
    { 
        // get the current focus node 
      RenderObject::NodeInfo renderInfo(true, false); 
    iPart->renderer()->layer()->hitTest(renderInfo, aPoint.iX, aPoint.iY); 
 
    NodeImpl *node = renderInfo.innerNode(); 
 
    NodeImpl *focusNode  = node; 
 
    for (; focusNode ; focusNode = focusNode->parentNode()) { 
      if (focusNode->isElementNode() && focusNode->isFocusable()) { 
          break; 
      } 
    } 
 
        // is element node 
        if(focusNode && focusNode->id() == ID_A ) 
            { 
            ElementImpl *e = static_cast(focusNode); 
            QString tel; 
            QString email; 
            QString telbook; 
 
            QString attr = e->getAttribute(ATTR_HREF).string(); 
        if (!attr.isNull() && !attr.isEmpty() ) 
          { 
                if ( attr.startsWith( KTel ) ) 
              tel = attr.mid(4); 
                else if( attr.startsWith(KWtaiMC) ) 
                    tel = attr.mid(13); 
                else if( attr.startsWith(KWtaiAP) ) 
                    tel = attr.mid(13); 
                else if( attr.startsWith(KWtaiSD) ) 
                    tel = attr.mid(13); 
            else if ( attr.startsWith( KMailto ) ) 
              { 
              email = attr.mid(7); 
              // Find just the email address 
              int i = email.find('?'); 
              if (i > 0 ) 
                email = email.left(i).stripWhiteSpace(); 
              } 
          } 
         attr = e->getAttribute(ATTR_CTI).string(); 
         if (!attr.isNull() && !attr.isEmpty() ) 
          tel = attr; 
 
         attr = e->getAttribute(ATTR_EMAIL).string(); 
         if (!attr.isNull() && !attr.isEmpty() ) 
          email = attr; 
 
         attr = e->getAttribute(ATTR_TELBOOK).string(); 
         if (!attr.isNull() && !attr.isEmpty() ) 
          telbook = attr; 
 
       // Save to phone book 
       QString url; 
 
         QString makeCallUrlPrefix("wtai://wp/ap;"); 
       QChar numberNameSeparator = ';'; 
 
       int len = makeCallUrlPrefix.length() + 3; // NULL terminator and ';' separators 
 
         len += tel.length() + telbook.length() + email.length(); 
 
         url.reserve(len); 
 
         url.append(makeCallUrlPrefix); 
       url.append(tel); 
         url.append(numberNameSeparator); 
       url.append(telbook); 
         url.append(numberNameSeparator); 
         url.append(email); 
 
         Client().LoadUrl(url.Des(), 
          KNullDesC, // referrer 
                EFalse, // reload 
                ETrue, //userGesture 
                KNullDesC, //target 
            EEventNull //triggeringEvent 
              ); 
 
 
         } 
   } 
} 
 
EXPORT_C 
CArrayPtr* CWebCoreBridge::GetPageDataL(TInt aTypeMask) 
{ 
    DOM::Document document = iPart->document(); 
    khtml::DocLoader* loader = NULL; 
    if ( iPart->xmlDocImpl() ) 
        { 
        loader = iPart->xmlDocImpl()->docLoader(); 
        } 
    User::LeaveIfNull( loader ); // if loader is null, we don't have a page loaded 
    CArrayPtr* itemArray = 
        new(ELeave) CArrayPtrFlat(10); 
    CleanupStack::PushL( itemArray ); 
    CWebCorePageDataItem* dataItem = NULL; 
     
    // get page markup document if requested 
    if(aTypeMask & CWebCorePageDataItem::EMarkup) 
        { 
        QString pageMarkupQ = document.toHTML(); 
        dataItem = CWebCorePageDataItem::NewL(CWebCorePageDataItem::EMarkup); 
        CleanupStack::PushL( dataItem ); 
        dataItem->SetUrlL(iPart->requestedURLString().Des()); 
        dataItem->SetContentTypeL(_L("text/html"));                         
        dataItem->SetCharsetL(_L("ucs-2"));  
        dataItem->SetDataL( pageMarkupQ.Des() ); 
        itemArray->AppendL(dataItem); 
        CleanupStack::Pop( dataItem ); 
        } 
    // get stylesheet documents if requested 
    if(aTypeMask & CWebCorePageDataItem::EStylesheet) 
        { 
        DOM::StyleSheetList sheetList = document.styleSheets(); 
        khtml::CachedCSSStyleSheet* kStyleSheet = NULL; 
        QString charset(""); 
        for(int m=0; mrequestStyleSheet(sheetUrl, charset); 
                dataItem = CWebCorePageDataItem::NewL(CWebCorePageDataItem::EStylesheet); 
                CleanupStack::PushL( dataItem ); 
                dataItem->SetUrlL(sheetUrl.string().Des()); 
                dataItem->SetContentTypeL(dStylesheet.type().string().Des()); 
                //Charset is required for saved pages.    
                dataItem->SetCharsetL(_L("ucs-2")); 
                dataItem->SetDataL(kStyleSheet->sheet().string().Des());                 
                itemArray->AppendL(dataItem ); 
                CleanupStack::Pop( dataItem ); 
                } 
            } 
        } 
    // get script documents if requested 
    if(aTypeMask & CWebCorePageDataItem::EScript) 
        { 
        DOMString scriptStr("script"); 
        DOMString srcStr("src"); 
        //DOMString typeStr("type"); 
        QString charset(""); 
        khtml::CachedScript* kScript = NULL; 
        DOM::NodeList scriptNodes = document.getElementsByTagName(scriptStr); 
        for(int n=0; nrequestScript(scriptUrl, charset); 
                dataItem = CWebCorePageDataItem::NewL(CWebCorePageDataItem::EScript); 
                CleanupStack::PushL( dataItem ); 
                dataItem->SetUrlL(scriptUrl.string().Des()); 
                dataItem->SetContentTypeL(_L("application/x-javascript")); 
                // Charset is required for saved pages.  
                dataItem->SetCharsetL(_L("ucs-2")); 
                dataItem->SetDataL(kScript->script().string().Des()); 
                itemArray->AppendL(dataItem); 
                CleanupStack::Pop( dataItem ); 
                } 
            } 
        } 
    CleanupStack::Pop( itemArray ); 
    return itemArray; 
    } 
 
// ### NOT IMPLEMENTED editing & dom interface 
/* 
- (void)undoEditing:(id)arg 
{ 
    ASSERT([arg isKindOfClass:[KWQEditCommand class]]); 
 
    EditCommand cmd([arg impl]); 
    cmd.unapply(); 
} 
 
- (void)redoEditing:(id)arg 
{ 
    ASSERT([arg isKindOfClass:[KWQEditCommand class]]); 
 
    EditCommand cmd([arg impl]); 
    cmd.reapply(); 
} 
 
- (DOMRange *)selectedDOMRangeWithGranularity:(WebSelectionGranularity)granularity 
{ 
    if (!iPart) 
        return nil; 
 
    // NOTE: The enums *must* match the very similar ones declared in ktml_selection.h 
    Selection selection(iPart->selection()); 
    selection.expandUsingGranularity(static_cast(granularity)); 
    return [DOMRange _rangeWithImpl:selection.toRange().handle()]; 
} 
 
- (DOMRange *)rangeByAlteringCurrentSelection:(WebSelectionAlteration)alteration direction:(WebSelectionDirection)direction granularity:(WebSelectionGranularity)granularity 
{ 
    if (!iPart) 
        return nil; 
 
    // NOTE: The enums *must* match the very similar ones declared in ktml_selection.h 
    Selection selection(iPart->selection()); 
    selection.modify(static_cast(alteration), 
                     static_cast(direction), 
                     static_cast(granularity)); 
    return [DOMRange _rangeWithImpl:selection.toRange().handle()]; 
} 
 
- (void)alterCurrentSelection:(WebSelectionAlteration)alteration direction:(WebSelectionDirection)direction granularity:(WebSelectionGranularity)granularity 
{ 
    if (!iPart) 
        return; 
 
    // NOTE: The enums *must* match the very similar ones declared in dom_selection.h 
    Selection selection(iPart->selection()); 
    selection.modify(static_cast(alteration), 
                     static_cast(direction), 
                     static_cast(granularity)); 
 
    // save vertical navigation x position if necessary 
    int xPos = KHTMLPart::NoXPosForVerticalArrowNavigation; 
    if (granularity == WebSelectByLine) 
        xPos = iPart->xPosForVerticalArrowNavigation(); 
 
    // setting the selection always clears saved vertical navigation x position 
    iPart->setSelection(selection); 
 
    // restore vertical navigation x position if necessary 
    if (xPos != KHTMLPart::NoXPosForVerticalArrowNavigation) 
        iPart->setXPosForVerticalArrowNavigation(xPos); 
 
    [self ensureCaretVisible]; 
} 
 
- (void)setSelectedDOMRange:(DOMRange *)range affinity:(NSSelectionAffinity)selectionAffinity 
{ 
    NodeImpl *startContainer = [[range startContainer] _nodeImpl]; 
    NodeImpl *endContainer = [[range endContainer] _nodeImpl]; 
    ASSERT(startContainer); 
    ASSERT(endContainer); 
    ASSERT(startContainer->getDocument()); 
    ASSERT(startContainer->getDocument() == endContainer->getDocument()); 
 
    DocumentImpl *doc = startContainer->getDocument(); 
    doc->updateLayout(); 
    Selection selection(Position(startContainer, [range startOffset]), Position(endContainer, [range endOffset])); 
    selection.setAffinity(static_cast(selectionAffinity)); 
    iPart->setSelection(selection); 
} 
 
- (DOMRange *)selectedDOMRange 
{ 
    return [DOMRange _rangeWithImpl:iPart->selection().toRange().handle()]; 
} 
 
- (NSSelectionAffinity)selectionAffinity 
{ 
    return static_cast(iPart->selection().affinity()); 
} 
 
- (DOMDocumentFragment *)documentFragmentWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString 
{ 
    DOM::DocumentImpl *document = iPart->xmlDocImpl(); 
    DOM::DocumentFragmentImpl *fragment = static_cast(document->documentElement())->createContextualFragment(markupString); 
    ASSERT(fragment); 
 
    if ([baseURLString length] > 0) { 
        DOM::DOMString baseURL = baseURLString; 
        if (baseURL != document->baseURL()) { 
            fragment->recursive_completeURLs(baseURL.string()); 
        } 
    } 
    return [DOMDocumentFragment _documentFragmentWithImpl:fragment]; 
} 
 
- (DOMDocumentFragment *)documentFragmentWithText:(NSString *)text 
{ 
    DOMDocument *document = [self DOMDocument]; 
    DOMDocumentFragment *fragment = [document createDocumentFragment]; 
    [fragment appendChild:[document createTextNode:text]]; 
    return fragment; 
} 
 
- (void)replaceSelectionWithFragment:(DOMDocumentFragment *)fragment selectReplacement:(BOOL)selectReplacement 
{ 
    if (!iPart || !iPart->xmlDocImpl() || !fragment) 
        return; 
 
    ReplaceSelectionCommand cmd(iPart->xmlDocImpl(), [fragment _fragmentImpl], selectReplacement); 
    cmd.apply(); 
    [self ensureCaretVisible]; 
} 
 
- (void)replaceSelectionWithNode:(DOMNode *)node selectReplacement:(BOOL)selectReplacement 
{ 
    DOMDocumentFragment *fragment = [[self DOMDocument] createDocumentFragment]; 
    [fragment appendChild:node]; 
    [self replaceSelectionWithFragment:fragment selectReplacement:selectReplacement]; 
} 
 
- (void)replaceSelectionWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString selectReplacement:(BOOL)selectReplacement 
{ 
    DOMDocumentFragment *fragment = [self documentFragmentWithMarkupString:markupString baseURLString:baseURLString]; 
    [self replaceSelectionWithFragment:fragment selectReplacement:selectReplacement]; 
} 
 
- (void)replaceSelectionWithText:(NSString *)text selectReplacement:(BOOL)selectReplacement 
{ 
    [self replaceSelectionWithFragment:[self documentFragmentWithText:text] selectReplacement:selectReplacement]; 
} 
 
- (void)insertNewline 
{ 
    if (!iPart || !iPart->xmlDocImpl()) 
        return; 
 
    TypingCommand::insertNewline(iPart->xmlDocImpl()); 
    [self ensureCaretVisible]; 
} 
 
- (void)insertText:(NSString *)text 
{ 
    if (!iPart || !iPart->xmlDocImpl()) 
        return; 
 
    TypingCommand::insertText(iPart->xmlDocImpl(), text); 
    [self ensureCaretVisible]; 
} 
 
- (void)setSelectionToDragCaret 
{ 
    iPart->setSelection(iPart->dragCaret()); 
} 
 
- (void)moveSelectionToDragCaret:(DOMDocumentFragment *)selectionFragment 
{ 
    Position base = iPart->dragCaret().base(); 
    MoveSelectionCommand cmd(iPart->xmlDocImpl(), [selectionFragment _fragmentImpl], base); 
    cmd.apply(); 
} 
 
- (Position)_positionForPoint:(NSPoint)point 
{ 
    RenderObject *renderer = iPart->renderer(); 
    if (!renderer) { 
        return Position(); 
    } 
 
    RenderObject::NodeInfo nodeInfo(true, true); 
    renderer->layer()->nodeAtPoint(nodeInfo, (int)point.x, (int)point.y); 
    NodeImpl *node = nodeInfo.innerNode(); 
    return node->positionForCoordinates((int)point.x, (int)point.y); 
} 
 
- (void)moveDragCaretToPoint:(NSPoint)point 
{ 
    Selection dragCaret([self _positionForPoint:point]); 
    iPart->setDragCaret(dragCaret); 
} 
 
- (void)removeDragCaret 
{ 
    iPart->setDragCaret(Selection()); 
} 
 
- (DOMRange *)dragCaretDOMRange 
{ 
    return [DOMRange _rangeWithImpl:iPart->dragCaret().toRange().handle()]; 
} 
 
- (DOMRange *)editableDOMRangeForPoint:(NSPoint)point 
{ 
    Position position = [self _positionForPoint:point]; 
    return position.isEmpty() ? nil : [DOMRange _rangeWithImpl:Selection(position).toRange().handle()]; 
} 
 
- (void)deleteSelection 
{ 
    if (!iPart || !iPart->xmlDocImpl()) 
        return; 
 
    Selection selection(iPart->selection()); 
    if (selection.state() != Selection::RANGE) 
        return; 
 
    DeleteSelectionCommand cmd(iPart->xmlDocImpl()); 
    cmd.apply(); 
} 
 
- (void)deleteKeyPressed 
{ 
    if (!iPart || !iPart->xmlDocImpl()) 
        return; 
 
    TypingCommand::deleteKeyPressed(iPart->xmlDocImpl()); 
    [self ensureCaretVisible]; 
} 
 
- (void)applyStyle:(DOMCSSStyleDeclaration *)style 
{ 
    if (!iPart) 
        return; 
    iPart->applyStyle([style _styleDeclarationImpl]); 
} 
 
- (NSFont *)fontForCurrentPosition 
{ 
    return iPart ? iPart->fontForCurrentPosition() : nil; 
} 
 
- (void)ensureCaretVisible 
{ 
    if (!iPart) 
        return; 
 
    KHTMLView *v = iPart->view(); 
    if (!v) 
        return; 
 
    QRect r(iPart->selection().getRepaintRect()); 
    v->ensureVisible(r.right(), r.bottom()); 
    v->ensureVisible(r.left(), r.top()); 
} 
 
// [info draggingLocation] is in window coords 
 
- (NSDragOperation)dragOperationForDraggingInfo:(id )info 
{ 
    NSDragOperation op = NSDragOperationNone; 
    if (iPart) { 
        KHTMLView *v = iPart->view(); 
        if (v) { 
            // Sending an event can result in the destruction of the view and part. 
            v->ref(); 
 
            KWQClipboard::AccessPolicy policy = iPart->baseURL().isLocalFile() ? KWQClipboard::Readable : KWQClipboard::TypesReadable; 
            KWQClipboard *clipboard = new KWQClipboard(true, [info draggingPasteboard], policy); 
            clipboard->ref(); 
            NSDragOperation srcOp = [info draggingSourceOperationMask]; 
            clipboard->setSourceOperation(srcOp); 
 
            if (v->updateDragAndDrop(QPoint([info draggingLocation]), clipboard)) { 
                // *op unchanged if no source op was set 
                if (!clipboard->destinationOperation(&op)) { 
                    // The element accepted but they didn't pick an operation, so we pick one for them 
                    // (as does WinIE). 
                    if (srcOp & NSDragOperationCopy) { 
                        op = NSDragOperationCopy; 
                    } else if (srcOp & NSDragOperationMove || srcOp & NSDragOperationGeneric) { 
                        op = NSDragOperationMove; 
                    } else if (srcOp & NSDragOperationLink) { 
                        op = NSDragOperationLink; 
                    } else { 
                        op = NSDragOperationGeneric; 
                    } 
                } else if (!(op & srcOp)) { 
                    // make sure WC picked an op that was offered.  Cocoa doesn't seem to enforce this, 
                    // but IE does. 
                    op = NSDragOperationNone; 
                } 
            } 
            clipboard->setAccessPolicy(KWQClipboard::Numb);    // invalidate clipboard here for security 
 
            clipboard->deref(); 
            v->deref(); 
            return op; 
        } 
    } 
    return op; 
} 
 
- (void)dragExitedWithDraggingInfo:(id )info 
{ 
    if (iPart) { 
        KHTMLView *v = iPart->view(); 
        if (v) { 
            // Sending an event can result in the destruction of the view and part. 
            v->ref(); 
 
            KWQClipboard::AccessPolicy policy = iPart->baseURL().isLocalFile() ? KWQClipboard::Readable : KWQClipboard::TypesReadable; 
            KWQClipboard *clipboard = new KWQClipboard(true, [info draggingPasteboard], policy); 
            clipboard->ref(); 
 
            v->cancelDragAndDrop(QPoint([info draggingLocation]), clipboard); 
            clipboard->setAccessPolicy(KWQClipboard::Numb);    // invalidate clipboard here for security 
 
            clipboard->deref(); 
            v->deref(); 
        } 
    } 
} 
 
- (BOOL)concludeDragForDraggingInfo:(id )info 
{ 
    if (iPart) { 
        KHTMLView *v = iPart->view(); 
        if (v) { 
            // Sending an event can result in the destruction of the view and part. 
            v->ref(); 
 
            KWQClipboard *clipboard = new KWQClipboard(true, [info draggingPasteboard], KWQClipboard::Readable); 
            clipboard->ref(); 
 
            BOOL result = v->performDragAndDrop(QPoint([info draggingLocation]), clipboard); 
            clipboard->setAccessPolicy(KWQClipboard::Numb);    // invalidate clipboard here for security 
 
            clipboard->deref(); 
            v->deref(); 
 
            return result; 
        } 
    } 
    return NO; 
} 
 
- (void)dragSourceMovedTo:(NSPoint)windowLoc 
{ 
    if (iPart) { 
        iPart->dragSourceMovedTo(QPoint(windowLoc)); 
    } 
} 
 
- (void)dragSourceEndedAt:(NSPoint)windowLoc operation:(NSDragOperation)operation 
{ 
    if (iPart) { 
        // FIXME must handle operation 
        iPart->dragSourceEndedAt(QPoint(windowLoc)); 
    } 
} 
 
- (BOOL)tryDHTMLCut 
{ 
    return iPart->tryCut(); 
} 
 
- (BOOL)tryDHTMLCopy 
{ 
    return iPart->tryCopy(); 
} 
 
- (BOOL)tryDHTMLPaste 
{ 
    return iPart->tryPaste(); 
} 
 
*/ 
 
 
EXPORT_C 
TBool CWebCoreBridge::HasPendingLayout() const 
{ 
    if (iPart && iPart->view()) 
        return iPart->view()->isLayoutPending(); 
    return EFalse; 
} 
 
 
EXPORT_C 
void CWebCoreBridge::SetFastFirstDisplayMode(TBool aFastMode) 
    { 
    iPart->setFastFirstDisplayMode(aFastMode); 
    } 
 
EXPORT_C 
TBool CWebCoreBridge::FastFirstDisplayMode() const 
    { 
    return iPart->fastFirstDisplayMode(); 
    } 
 
EXPORT_C 
TBool CWebCoreBridge::ShowingFastPreview() const 
    { 
    DocumentImpl *doc = iPart->xmlDocImpl(); 
    return doc?doc->fastDisplayMode():false; 
    } 
 
EXPORT_C 
void CWebCoreBridge::SetFormControlTextByName(const TDesC& aName, const TDesC& aValue) 
  { 
  if (iPart) 
    { 
    QString qname; 
    QString qvalue; 
    qname.SetBufferFromDes(aName); 
    qvalue.SetBufferFromDes(aValue); 
    DOMString textString; 
 
      RenderObject* robject = iPart->xmlDocImpl()->renderer(); 
    while (robject) 
      { 
      if(robject->element() && robject->element()->id()==ID_INPUT) 
        { 
        textString = static_cast(robject->element())->getAttribute(ATTR_NAME); 
        if (qname.compare(textString.string())==0) 
          { 
          static_cast(robject->element())->setValue(qvalue); 
          robject->element()->setChanged(true); 
          break; 
          } 
        } 
      robject = robject->nextRenderer(); 
      } 
    } 
  } 
 
EXPORT_C 
void CWebCoreBridge::FindLinksOfType(const TDesC& aType, RArray& aResult) 
{ 
    NodeImpl* node = 0; 
 
    if(iPart) { 
        QString searchType = QString::FromDes(aType); 
        node = iPart->xmlDocImpl(); 
 
        while (node && node->id()!=ID_BODY) { 
            if (node->isElementNode()) { 
                ElementImpl* el = static_cast(node); 
                DOMString type = el->getAttribute("type"); 
                if (el->id()==ID_LINK && (searchType.isEmpty() || type==searchType)) { 
                    DOMString href = el->getAttribute("href"); 
                    DOMString title = el->getAttribute("title"); 
                    DOMString charset = el->getAttribute("charset"); 
                    TWebCoreLinkItem item; 
                    item.iType.Set((unsigned short*)type.unicode(),type.length()); 
                    if (!href.isEmpty()) 
                        item.iHref.Set((unsigned short*)href.unicode(),href.length()); 
                    if (!title.isEmpty()) 
                        item.iTitle.Set((unsigned short*)title.unicode(),title.length()); 
                    if (!charset.isEmpty()) 
                        item.iCharset.Set((unsigned short*)charset.unicode(),charset.length()); 
                    aResult.Append(item); 
                } 
            } 
            node = node->traverseNextNode(); 
        } 
    } 
 
 
} 
 
EXPORT_C 
TBool CWebCoreBridge::NavigableNodeUnderCursor(TPoint &aPoint, TWebCoreFocusedElementType &aElType, TRect& aFocusRect) const 
{ 
  TRect nr; 
 
    RenderObject *renderer = iPart->renderer(); 
    if (!renderer) { 
        return EFalse; 
    } 
 
    /* 
    // fire the mousemove event 
    TPointerEvent ev; 
    ev.iType = TPointerEvent::EMove; 
    ev.iPosition = aCursor.Position(); 
 
    KHTMLView *v = iPart->view(); 
    v->ref(); 
    QMouseEvent kEvent(QEvent::MouseMove, ev); 
    NodeImpl* node = v->ifMouseMoveTo(&kEvent); 
    v->deref(); 
 
    while (node && !node->renderer()) { 
        node = node->parent(); 
    } 
    */ 
    RenderObject::NodeInfo renderInfo(true, false); 
    iPart->renderer()->layer()->hitTest(renderInfo, aPoint.iX, aPoint.iY); 
 
    NodeImpl *node = renderInfo.innerNode(); 
 
    /* 
    We shouldnt go up the tree and locate the node that has a renderer 
    Image maps are represented by areas nodes and they dont have render objects 
    */ 
    /*while (node && !node->renderer()) { 
        node = node->parent(); 
    }*/ 
 
    if (node) { 
        // get the navigable node at this point 
        for (NodeImpl *navNode = node; navNode; navNode = navNode->parentNode()) { 
            if (navNode->isElementNode()) { 
                if( navNode->isFocusable() ) 
                    { 
                    aElType = NodeTypeB( navNode ); 
                    aFocusRect = navNode->getRect().Rect(); 
                    return ETrue; 
                    } 
                else if( navNode->getHTMLEventListener(DOM::EventImpl::MOUSEOVER_EVENT) 
                    || navNode->getHTMLEventListener(DOM::EventImpl::KHTML_CLICK_EVENT) 
                    || navNode->getHTMLEventListener(DOM::EventImpl::MOUSEUP_EVENT) ) { 
                    aFocusRect = navNode->getRect().Rect(); 
                    aElType = EWebCoreElementMouseButtonListener; 
                    return ETrue; 
                } 
                else if( navNode->id() == ID_AREA) { 
                    ElementImpl* e =  static_cast(navNode); 
                    if(e && !e->getAttribute(ATTR_HREF).isNull()) { 
                    aElType = EWebCoreElementImageBox; 
                    aFocusRect = navNode->getRect().Rect(); 
                    return ETrue; 
                    } 
                } 
                else if (navNode->renderer() && navNode->renderer()->layer()) { 
                    QScrollBar* hbar = navNode->renderer()->layer()->horizontalScrollbar(); 
                    if (hbar && QRect(hbar->pos(),hbar->size()).contains(aPoint.iX,aPoint.iY)) { 
                        aElType = EWebCoreElementScrollBar; 
                        aFocusRect = QRect(hbar->pos(),hbar->size()).Rect(); 
                        return ETrue; 
                    } 
                    QScrollBar* vbar = navNode->renderer()->layer()->verticalScrollbar(); 
                    if (vbar && QRect(vbar->pos(),vbar->size()).contains(aPoint.iX,aPoint.iY)) { 
                        aElType = EWebCoreElementScrollBar; 
                        aFocusRect = QRect(vbar->pos(),vbar->size()).Rect(); 
                        return ETrue; 
                    } 
               } 
            } 
        } 
    } 
    iPart->xmlDocImpl()->setFocusNode( 0 ); 
    aElType = EWebCoreElementNone; 
    aFocusRect = TRect(); 
    return EFalse; 
} 
 
 
TWebCoreFocusedElementType CWebCoreBridge::NodeTypeB( DOM::NodeImpl* aFocusNode ) const 
{ 
    if( !aFocusNode ) 
        return EWebCoreElementNone; 
 
    TWebCoreFocusedElementType elType( EWebCoreElementNone ); 
 
  switch(aFocusNode->id()) 
    { 
        case ID_LINK: 
            { 
            elType = EWebCoreElementAnchor; 
            break; 
            } 
        case ID_A: 
            { 
            elType = EWebCoreElementAnchor; 
 
      ElementImpl *e = static_cast(aFocusNode); 
      QString attr = e->getAttribute(ATTR_HREF).string(); 
 
      if (!attr.isNull() && !attr.isEmpty() ) { 
                if ( attr.startsWith( KTel ) ) { 
                    elType = EWebCoreElementTelAnchor; 
                } 
                else if( attr.startsWith( KWtai ) ) { 
                     if (attr.startsWith( KWtaiMC ) || attr.startsWith( KWtaiAP ) 
                         || attr.startsWith( KWtaiSD )) { 
               elType = EWebCoreElementTelAnchor; 
                     } 
        } 
        else if ( attr.startsWith( KMailto ) ) { 
          elType = EWebCoreElementMailtoAnchor; 
        } 
      } 
      attr = e->getAttribute(ATTR_CTI).string(); 
      if (!attr.isNull() && !attr.isEmpty() ) { 
        elType = EWebCoreElementTelAnchor; 
      } 
            break; 
            } 
    case ID_INPUT: 
      { 
            HTMLInputElementImpl* inputElement = static_cast(aFocusNode); 
            TInt type = inputElement->inputType(); 
            switch(inputElement->inputType()) 
                { 
                case HTMLInputElementImpl::TEXT: 
                case HTMLInputElementImpl::PASSWORD: 
                    elType = EWebCoreElementInputBox; 
                break; 
                case HTMLInputElementImpl::CHECKBOX: 
                // if the checkbox is selected 
                if(inputElement->checked()) 
                    { 
                    elType = EWebCoreElementCheckBoxChecked; 
                    } 
                else 
                    { 
                    elType = EWebCoreElementCheckBoxUnChecked; 
                    } 
                break; 
                case HTMLInputElementImpl::RADIO: 
                if(inputElement->checked()) 
                    { 
                    elType = EWebCoreElementRadioButtonSelected; 
                    } 
                else 
                    { 
                    elType = EWebCoreElementRadioButtonUnSelected; 
                    } 
                break; 
                case HTMLInputElementImpl::IMAGE: 
                case HTMLInputElementImpl::SUBMIT: 
                case HTMLInputElementImpl::BUTTON: 
                case HTMLInputElementImpl::RESET: 
                    { 
                    elType = EWebCoreElementButton; 
                    break; 
                    } 
                case HTMLInputElementImpl::FILE: 
                    { 
                    if(inputElement->value().length()) 
                        { 
                        elType = EWebCoreElementFileSelectionBoxWithContent; 
                        } 
                    else 
                        { 
                        elType = EWebCoreElementFileSelectionBoxNoContent; 
                        } 
                    } 
                    break; 
                } 
        } 
        break; 
    case ID_TEXTAREA: 
      { 
            elType = EWebCoreElementInputBox; 
      break; 
      } 
        case ID_SELECT: 
            { 
            elType = EWebCoreElementSelectBox; 
      break; 
      } 
    case ID_EMBED: 
    case ID_OBJECT: 
      { 
            if(aFocusNode->renderer()) { 
              if(aFocusNode->renderer()->isWidget()) { 
            elType = EWebCoreElementObjectBox; 
              } 
              else { 
                 elType = EWebCoreElementNone; 
              } 
            } 
      break; 
      } 
    default: 
      { 
            elType = EWebCoreElementAnchor; 
      break; 
      } 
    } 
    return elType; 
    } 
 
 
EXPORT_C TBool CWebCoreBridge::TabbedNavigation(TWebNavDirection aDirection,TWebCoreFocusedElementType &aElType,TBool aInitialize) 
{ 
    if(!iPart || !iPart->xmlDocImpl()) return EFalse; 
    if(aInitialize) { 
         
        if (iPart->xmlDocImpl() && iPart->xmlDocImpl()->focusNode()){ 
            QPoint cp(iPart->xmlDocImpl()->focusNode()->getRect().center()); 
            iPart->setCursorPosition(cp); 
            iPart->view()->GetDocumentView().SetFocus(ETrue); 
            return ETrue; 
        } 
         
        QPtrList childPartList = iPart->frames(); 
        for(KParts::ReadOnlyPart* childPart = childPartList.first();childPart;childPart = childPartList.next()){ 
            KHTMLPart *khtml_part = static_cast(childPart); 
            KWQKHTMLPart* p = KWQ(khtml_part); 
            if (p->xmlDocImpl() && p->xmlDocImpl()->focusNode()){ 
                QPoint cp(p->xmlDocImpl()->focusNode()->getRect().center()); 
                p->setCursorPosition(cp); 
                p->view()->GetDocumentView().SetFocus(ETrue); 
                return ETrue; 
            } 
        } 
        QPoint pt(0,0); 
        iPart->setCursorPosition(pt); 
        iPart->view()->GetDocumentView().SetFocus(ETrue); 
        iPart->tabbedNavigation(0,1,aElType, aInitialize); 
        return ETrue; 
    } 
     
    int lr = (aDirection == EWebNavLeft) ? -1 : (aDirection == EWebNavRight) ? 1 : 0 ; 
    int tb = (lr != 0) ? 0: (aDirection == EWebNavUp) ? -1 : 1 ; 
    bool found = iPart->tabbedNavigation(lr,tb,aElType,aInitialize); 
    return found; 
} 
 
EXPORT_C TBool CWebCoreBridge::DetermineCursorPosition(TWebCoreFocusedElementType &aElType, TRect& aFocusRect,TRect& aSearchRect, TPoint &aCursorPosition, TBool aInitialize) 
{ 
    QRect searchRt(aSearchRect); 
    QPoint pt(aCursorPosition.iX,aCursorPosition.iY); 
    bool found = false; 
 
    if(aInitialize && iPart->xmlDocImpl()->focusNode()) { 
       QRect nodeRect = iPart->xmlDocImpl()->focusNode()->getRect(); 
       if(nodeRect.intersects(searchRt)) { 
          QRect rt = nodeRect.intersect(searchRt); 
          pt = rt.center(); 
          found = true; 
       } 
    } 
 
    found = iPart->determineCursorPositon(searchRt,pt); 
    TPoint newPos(pt.x(),pt.y()); 
 
    TBool retest = EFalse; 
    if(found) 
       retest = NavigableNodeUnderCursor(newPos,aElType,aFocusRect); 
 
    if(!retest) return EFalse; 
 
    aCursorPosition = newPos; 
    return retest; 
} 
 
EXPORT_C 
void CWebCoreBridge::SetMaxBidiWidth(TInt aWidth) 
{ 
    iPart->view()->setMaxBidiWidth(aWidth); 
} 
 
// load and replace missing images for the document 
EXPORT_C 
void CWebCoreBridge::LoadImages() 
{ 
    iPart->xmlDocImpl()->docLoader()->setAutoloadImages( true ); 
} 
 
EXPORT_C 
void CWebCoreBridge::DumpRenderTree() 
{ 
  iPart->slotDebugRenderTree(); 
} 
 
EXPORT_C 
void CWebCoreBridge::PrepareForExit() 
{ 
    // clear static data hold by the memory cache 
    khtml::Cache::clear(); 
 
    // gloal services 
    KWQGlobalServices::PrepareForExit(); 
 
    // text codec 
    QTextCodec::PrepareForExit(); 
 
    // delete the singlete allocator, any deallocation after this will 
    // be skipped. 
    MemoryManager::PrepareForExit(); 
 
  //reset the cookia adaptor 
  TWebCoreCookieFactory::ResetCookieAdapter(); 
 
    // std lib 
    CloseSTDLIB(); 
} 
 
EXPORT_C 
void CWebCoreBridge::SetDefersTimers(TBool aDefer) 
{ 
    QObject::setDefersTimers(aDefer); 
} 
 
EXPORT_C 
TBool CWebCoreBridge::DefersTimers() 
{ 
    return QObject::defersTimers(); 
}