/*
* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:   Implementation of WebFrameLoaderClient
*
*/

#include <browser_platform_variant.hrh>
#include "config.h"
#include <../bidi.h>
#include "WebFrameLoaderClient.h"
#include "ResourceError.h"
#include "DebugStream.h"
#include "DocumentLoader.h"
#include "Frame.h"
#include "FrameLoader.h"
#include "HTMLFrameOwnerElement.h"
#include "HtmlNames.h"
#include "HTMLFrameElement.h"
#include "WebCoreFrameBridge.h"
#include "HTMLFormElement.h"
#include "HTMLObjectElement.h"
#include "FrameView.h"
#include "Document.h"
#include "WebCoreWidget.h"
#include "WebFrame.h"
#include "WebView.h"
#include "WebFrameView.h"
#include "WebFrameBridge.h"
#include "WebDocumentLoader.h"
#include "brctl.h"
#include "page.h"
#include "ProgressTracker.h"
#include "WebPolicyManager.h"
#include "StaticObjectsContainer.h"
#include "ResourceLoaderDelegate.h"
#include <brctlwindowobserver.h>
#include "WmlDispatcher.h"
#include "WebUtil.h"
#include "errordefs.h"
#include "WebFepTextEditor.h"
#include "SettingsContainer.h"
#include "WebTabbedNavigation.h"
#include "StaticObjectsContainer.h"
#include "WebCursor.h"
#include "WebCharsetData.h"
#include "WebKitLogger.h"
#include "PluginHandler.h"
#include "MIMETypeRegistry.h"
#include "WidgetExtension.h"

using namespace WebCore;
using namespace HTMLNames;

// this should be changed if we wanna have a counter per window.
static int total_bytes = 0;


static CBrCtl* brctl(WebFrame* webFrame)
{
    ASSERT(hasWebView());
    ASSERT(hasFrameView());
    return webFrame->frameView()->topView()->brCtl();
}

WebFrameLoaderClient::WebFrameLoaderClient(WebFrame* webFrame)
    : m_webFrame(webFrame)
{
    m_webPolicyManager = new WebPolicyManager(this);
    m_WmlContentListener = 0;
}

WebFrameLoaderClient::~WebFrameLoaderClient()
{
    delete m_webPolicyManager;
    if (m_WmlContentListener) delete m_WmlContentListener;
}

void WebFrameLoaderClient::frameLoaderDestroyed() 
{ 
    delete this;
}

bool WebFrameLoaderClient::hasWebView() const 
{
    return m_webFrame != NULL;; 
}

bool WebFrameLoaderClient::hasFrameView() const 
{
    return m_webFrame->frameView() != NULL; 
}

bool WebFrameLoaderClient::privateBrowsingEnabled() const
{
//    return [[getWebView(m_webFrame.get()) preferences] privateBrowsingEnabled];
    return false; 
}

void WebFrameLoaderClient::makeDocumentView()
{
    WebFrameView *v = m_webFrame->frameView();
    //WebDataSource *ds = [m_webFrame.get() _dataSource];

    //NSView <WebDocumentView> *documentView = [v _makeDocumentViewForDataSource:ds];
    //if (!documentView)
    //    return;

    if (m_webFrame && 
        m_webFrame->frameView() && 
        m_webFrame->frameView()->topView()&&
        !m_webFrame->parentFrame()) {

        m_webFrame->frameView()->topView()->setEditable(false);
    }
    WebFrameBridge *bridge = m_webFrame->bridge();

    // FIXME: We could save work and not do this for a top-level view that is not a WebHTMLView.
    //(MWebCoreWidget* view, int marginWidth, int marginHeight)    
    bridge->createFrameViewWithScrollView(v, v->marginWidth(), v->marginHeight());
    //m_webFrame.get() _updateBackground];
    bridge->installInFrame(v);

    // Call setDataSource on the document view after it has been placed in the view hierarchy.
    // This what we for the top-level view, so should do this for views in subframes as well.
    //[documentView setDataSource:ds];
}

void WebFrameLoaderClient::makeRepresentation(DocumentLoader* docLoader)
{
    if (isWMLContent(m_response.mimeType())) {
        // call the WmlDispatcher Headers routine to set the WML flag
        if (! m_WmlContentListener) {
            TRAPD(err, m_WmlContentListener = CWmlDispatcher::NewL(brctl(m_webFrame), core(m_webFrame) ));
            if((err == KErrNone) && (m_WmlContentListener != NULL))
                {
                brctl(m_webFrame)->setWmlDispatcher(m_WmlContentListener);
                }
        }
        TRAPD(err,m_WmlContentListener->HeadersL( 0, m_response ));
    }
    else{
        if (m_WmlContentListener) {
            m_WmlContentListener->MakeWmlVisible(EFalse);
        brctl(m_webFrame)->setWmlMode(EFalse);
            brctl(m_webFrame)->MakeVisible(ETrue);
        }
        if (FrameLoadTypeRedirectWithLockedHistory == core(m_webFrame)->loader()->loadType())
            m_webFrame->frameView()->topView()->setRedirectWithLockedHistory(true);
        if (docLoader->isLoadingMainResource()&&
            core(m_webFrame)->loader()->isLoadingMainFrame() &&
            FrameLoadTypeStandard == core(m_webFrame)->loader()->loadType()){
            m_webFrame->frameView()->topView()->resetZoomLevel();
        }

        if (!core(m_webFrame)->ownerElement()) {
            brctl(m_webFrame)->settings()->setNavigationType((brctl(m_webFrame)->capabilities()&TBrCtlDefs::ECapabilityCursorNavigation) ? SettingsContainer::NavigationTypeCursor : SettingsContainer::NavigationTypeTabbed);
            StaticObjectsContainer::instance()->webCursor()->cursorUpdate(true);
            m_webFrame->frameView()->topView()->tabbedNavigation()->clear();
		}        
    }
}

void WebFrameLoaderClient::setDocumentViewFromCachedPage(CachedPage*)
{
    /*
    DocumentLoader* cachedDocumentLoader = cachedPage->documentLoader();
    ASSERT(cachedDocumentLoader);
    cachedDocumentLoader->setFrame(core(m_webFrame.get()));
    NSView <WebDocumentView> *cachedView = cachedPage->documentView();
    ASSERT(cachedView != nil);
    [cachedView setDataSource:dataSource(cachedDocumentLoader)];
    [m_webFrame->_private->webFrameView _setDocumentView:cachedView];
    */
    notImplemented(); 
}

void WebFrameLoaderClient::forceLayout()
{
    /*
    NSView <WebDocumentView> *view = [m_webFrame->_private->webFrameView documentView];
    if ([view isKindOfClass:[WebHTMLView class]])
        [(WebHTMLView *)view setNeedsToApplyStyles:YES];
    [view setNeedsLayout:YES];
    [view layout];
    */
    if (core(m_webFrame)->document()->isHTMLDocument())
    {
        core(m_webFrame)->view()->layout();
    }
}

void WebFrameLoaderClient::forceLayoutForNonHTML() 
{
    /*
    WebFrameView *thisView = m_webFrame->_private->webFrameView;
    NSView <WebDocumentView> *thisDocumentView = [thisView documentView];
    ASSERT(thisDocumentView != nil);
    
    // Tell the just loaded document to layout.  This may be necessary
    // for non-html content that needs a layout message.
    if (!([[m_webFrame.get() _dataSource] _isDocumentHTML])) {
        [thisDocumentView setNeedsLayout:YES];
        [thisDocumentView layout];
        [thisDocumentView setNeedsDisplay:YES];
    }
    */
    if (core(m_webFrame)->document()->isImageDocument())
    {
        core(m_webFrame)->view()->layout();
    }
}

void WebFrameLoaderClient::setCopiesOnScroll()
{
    m_webFrame->frameView()->setMayUseCopyScroll(true);
}

void WebFrameLoaderClient::detachedFromParent2()
{
    // m_webFrame->_private->inspectors makeObjectsPerformSelector:@selector(_webFrameDetached:) withObject:m_webFrame.get()];
    if (m_webFrame->frameView())
        m_webFrame->frameView()->setWebFrame(NULL);
}

void WebFrameLoaderClient::detachedFromParent3()
{
    m_webFrame->setFrameView(NULL);
}

void WebFrameLoaderClient::detachedFromParent4()
{
    m_webFrame->setBridge(NULL);
}

void WebFrameLoaderClient::download(ResourceHandle* handle, const ResourceRequest& request, const ResourceRequest& initialRequest, const ResourceResponse& response) 
{
    /*
    id proxy = handle->releaseProxy();
    ASSERT(proxy);
    
    WebView *webView = getWebView(m_webFrame.get());
    WebDownload *download = [WebDownload _downloadWithLoadingConnection:handle->connection()
                                                                request:request.nsURLRequest()
                                                               response:response.nsURLResponse()
                                                               delegate:[webView downloadDelegate]
                                                                  proxy:proxy]; 
    NSURL *originalURL = nil;
    WebBackForwardList *history = [webView backForwardList];
    WebHistoryItem *currentItem = nil;
    int backListCount = [history backListCount];
    int backCount = 0;
    
    // find the first item in the history that was originated
    // by the user
    while (backListCount > 0 && !originalURL) {
        currentItem = [history itemAtIndex:backCount--];
        
        if (![currentItem respondsToSelector:@selector(_wasUserGesture)] || [currentItem _wasUserGesture])
            originalURL = [currentItem URL];
    }

    if (originalURL && [download respondsToSelector:@selector(_setOriginatingURL:)])
        [download _setOriginatingURL:originalURL];
    */
    StaticObjectsContainer::instance()->resourceLoaderDelegate()->download(handle, request, response);
    TRAP_IGNORE(
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventNewUrlContentArrived, 0, 0 ); // must send this for progress bar to go away
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventUrlLoadingFinished, 0, 0 );
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventContentFinished, 0, 0 );
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventLoadFinished, 0, 0 );
    );
}

void WebFrameLoaderClient::assignIdentifierToInitialRequest(unsigned long identifier, DocumentLoader*, const ResourceRequest&)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    id resourceLoadDelegate = WebViewGetResourceLoadDelegate(webView);
    WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);

    id object;
    BOOL shouldRelease = NO;
    if (implementations.delegateImplementsIdentifierForRequest)
        object = implementations.identifierForRequestFunc(resourceLoadDelegate, @selector(webView:identifierForInitialRequest:fromDataSource:), webView, request.nsURLRequest(), dataSource(loader));
    else {
        object = [[NSObject alloc] init];
        shouldRelease = YES;
    }
    [webView _addObject:object forIdentifier:identifier];
    if (shouldRelease)
        [object release];
    */

    notImplemented(); 
}

void WebFrameLoaderClient::dispatchWillSendRequest(DocumentLoader* loader, unsigned long identifier, ResourceRequest&, const ResourceResponse& redirectResponse)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    id resourceLoadDelegate = WebViewGetResourceLoadDelegate(webView);
    WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);
    */
    if (redirectResponse.isNull())
        static_cast<WebDocumentLoader*>(loader)->increaseLoadCount(identifier);
    /*
    if (implementations.delegateImplementsWillSendRequest)
        request = implementations.willSendRequestFunc(resourceLoadDelegate, @selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:), webView, [webView _objectForIdentifier:identifier], request.nsURLRequest(), redirectResponse.nsURLResponse(), dataSource(loader));
    */
}

void WebFrameLoaderClient::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, unsigned long identifier, const AuthenticationChallenge&)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    id resourceLoadDelegate = [webView resourceLoadDelegate];
    WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);

    NSURLAuthenticationChallenge *webChallenge = mac(challenge);

    if (implementations.delegateImplementsDidReceiveAuthenticationChallenge) {
        [resourceLoadDelegate webView:webView resource:[webView _objectForIdentifier:identifier] didReceiveAuthenticationChallenge:webChallenge fromDataSource:dataSource(loader)];
        return;
    }

    NSWindow *window = [webView hostWindow] ? [webView hostWindow] : [webView window];
    [[WebPanelAuthenticationHandler sharedHandler] startAuthentication:webChallenge window:window];
    */
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidCancelAuthenticationChallenge(DocumentLoader*, unsigned long identifier, const AuthenticationChallenge&)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    id resourceLoadDelegate = [webView resourceLoadDelegate];
    WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);

    NSURLAuthenticationChallenge *webChallenge = mac(challenge);

    if (implementations.delegateImplementsDidCancelAuthenticationChallenge) {
        [resourceLoadDelegate webView:webView resource:[webView _objectForIdentifier:identifier] didCancelAuthenticationChallenge:webChallenge fromDataSource:dataSource(loader)];
        return;
    }

    [(WebPanelAuthenticationHandler *)[WebPanelAuthenticationHandler sharedHandler] cancelAuthentication:webChallenge];
    */
    notImplemented(); 
}       

void WebFrameLoaderClient::dispatchDidReceiveResponse(DocumentLoader* loader, unsigned long identifier, const ResourceResponse& response) 
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    id resourceLoadDelegate = WebViewGetResourceLoadDelegate(webView);
    WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);

    if (implementations.delegateImplementsDidReceiveResponse)
        implementations.didReceiveResponseFunc(resourceLoadDelegate, @selector(webView:resource:didReceiveResponse:fromDataSource:), webView, [webView _objectForIdentifier:identifier], response.nsURLResponse(), dataSource(loader));
    */
    
    m_firstData = true;
    m_response = response;
}

void WebFrameLoaderClient::dispatchDidReceiveContentLength(DocumentLoader*, unsigned long identifier, int lengthReceived)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    id resourceLoadDelegate = WebViewGetResourceLoadDelegate(webView);
    WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);

    if (implementations.delegateImplementsDidReceiveContentLength)
        implementations.didReceiveContentLengthFunc(resourceLoadDelegate, @selector(webView:resource:didReceiveContentLength:fromDataSource:), webView, [webView _objectForIdentifier:identifier], (WebNSUInteger)lengthReceived, dataSource(loader));
    */
    // tot:fixme lemgthReceived is actually the content length, not how much was received. The logic has to change
    total_bytes+=lengthReceived;
}

void WebFrameLoaderClient::dispatchDidFinishLoading(DocumentLoader* loader, unsigned long identifier)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    id resourceLoadDelegate = WebViewGetResourceLoadDelegate(webView);
    WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);
    
    if (implementations.delegateImplementsDidFinishLoadingFromDataSource)
        implementations.didFinishLoadingFromDataSourceFunc(resourceLoadDelegate, @selector(webView:resource:didFinishLoadingFromDataSource:), webView, [webView _objectForIdentifier:identifier], dataSource(loader));
    [webView _removeObjectForIdentifier:identifier];

    static_cast<WebDocumentLoaderMac*>(loader)->decreaseLoadCount(identifier);
    */
    static_cast<WebDocumentLoader*>(loader)->decreaseLoadCount(identifier);
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidFailLoading(DocumentLoader* loader, unsigned long identifier, const ResourceError& error)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    id resourceLoadDelegate = WebViewGetResourceLoadDelegate(webView);
    WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);

    if (implementations.delegateImplementsDidFailLoadingWithErrorFromDataSource)
        implementations.didFailLoadingWithErrorFromDataSourceFunc(resourceLoadDelegate, @selector(webView:resource:didFailLoadingWithError:fromDataSource:), webView, [webView _objectForIdentifier:identifier], error, dataSource(loader));
    [webView _removeObjectForIdentifier:identifier];

    static_cast<WebDocumentLoaderMac*>(loader)->decreaseLoadCount(identifier);
    */  
    //
    if (brctl(m_webFrame)->wmlMode() && m_WmlContentListener) {
        m_WmlContentListener->HandleError(identifier,error.errorCode());
    }
    //
    static_cast<WebDocumentLoader*>(loader)->decreaseLoadCount(identifier);
}

bool WebFrameLoaderClient::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*, const ResourceRequest&, const ResourceResponse&, int length)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    id resourceLoadDelegate = WebViewGetResourceLoadDelegate(webView);
    WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);

    if (!implementations.delegateImplementsDidLoadResourceFromMemoryCache)
        return false;

    implementations.didLoadResourceFromMemoryCacheFunc(resourceLoadDelegate, @selector(webView:didLoadResourceFromMemoryCache:response:length:fromDataSource:), webView, request.nsURLRequest(), response.nsURLResponse(), length, dataSource(loader));
    return true;
    */
    notImplemented(); 
    return false; 
}

void WebFrameLoaderClient::dispatchDidHandleOnloadEvents()
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidHandleOnloadEventsForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didHandleOnloadEventsForFrameFunc(frameLoadDelegate, @selector(webView:didHandleOnloadEventsForFrame:), webView, m_webFrame.get());
    }
    */
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad()
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidReceiveServerRedirectForProvisionalLoadForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didReceiveServerRedirectForProvisionalLoadForFrameFunc(frameLoadDelegate, @selector(webView:didReceiveServerRedirectForProvisionalLoadForFrame:), webView, m_webFrame.get());
    }
    */
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidCancelClientRedirect()
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidCancelClientRedirectForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didCancelClientRedirectForFrameFunc(frameLoadDelegate, @selector(webView:didCancelClientRedirectForFrame:), webView, m_webFrame.get());
    }
    */
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchWillPerformClientRedirect(const KURL&, double interval, double fireDate)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsWillPerformClientRedirectToURLDelayFireDateForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.willPerformClientRedirectToURLDelayFireDateForFrameFunc(frameLoadDelegate, @selector(webView:willPerformClientRedirectToURL:delay:fireDate:forFrame:), webView, URL.getNSURL(), delay, [NSDate dateWithTimeIntervalSince1970:fireDate], m_webFrame.get());
    }
    */
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidChangeLocationWithinPage()
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidChangeLocationWithinPageForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didChangeLocationWithinPageForFrameFunc(frameLoadDelegate, @selector(webView:didChangeLocationWithinPageForFrame:), webView, m_webFrame.get());
    }
    */
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchWillClose()
{
    /*
    WebView *webView = getWebView(m_webFrame.get());   
    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsWillCloseFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.willCloseFrameFunc(frameLoadDelegate, @selector(webView:willCloseFrame:), webView, m_webFrame.get());
    }
    */
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidReceiveIcon()
{
    /*
    ASSERT([m_webFrame.get() _isMainFrame]);
    WebView *webView = getWebView(m_webFrame.get());   

    // FIXME: This willChangeValueForKey call is too late, because the icon has already changed by now.
    [webView _willChangeValueForKey:_WebMainFrameIconKey];

    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidReceiveIconForFrame) {
        Image* image = iconDatabase()->iconForPageURL(core(m_webFrame.get())->loader()->url().url(), IntSize(16, 16));
        if (NSImage *icon = webGetNSImage(image, NSMakeSize(16, 16))) {
            id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
            implementations.didReceiveIconForFrameFunc(frameLoadDelegate, @selector(webView:didReceiveIcon:forFrame:), webView, icon, m_webFrame.get());
        }
    }

    [webView _didChangeValueForKey:_WebMainFrameIconKey];
    */
    TRAP_IGNORE(
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventFaviconAvailable, 0, 0 );
    );
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidStartProvisionalLoad() 
{
    /*
    WebView *webView = getWebView(m_webFrame.get());   
    [webView _didStartProvisionalLoadForFrame:m_webFrame.get()];

    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidStartProvisionalLoadForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didStartProvisionalLoadForFrameFunc(frameLoadDelegate, @selector(webView:didStartProvisionalLoadForFrame:), webView, m_webFrame.get());
    }
    */
    TRAP_IGNORE(
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventNewContentStart, 0, 0 );
    );
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidReceiveTitle(const String& title) 
{
    /*
    WebView *webView = getWebView(m_webFrame.get());   
    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidReceiveTitleForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didReceiveTitleForFrameFunc(frameLoadDelegate, @selector(webView:didReceiveTitle:forFrame:), webView, title, m_webFrame.get());
    }
    */
    TRAP_IGNORE(
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventTitleAvailable, 0, 0 );
    );
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidCommitLoad() 
{ 
    /*
    // Tell the client we've committed this URL.
    ASSERT([m_webFrame->_private->webFrameView documentView] != nil);
    
    WebView *webView = getWebView(m_webFrame.get());   
    [webView _didCommitLoadForFrame:m_webFrame.get()];

    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidCommitLoadForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didCommitLoadForFrameFunc(frameLoadDelegate, @selector(webView:didCommitLoadForFrame:), webView, m_webFrame.get());
    }
    */
    TRAP_IGNORE(
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventTitleAvailable, 0, 0 );
    );
}

void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& error)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());   
    [webView _didFailProvisionalLoadWithError:error forFrame:m_webFrame.get()];
    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidFailProvisionalLoadWithErrorForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didFailProvisionalLoadWithErrorForFrameFunc(frameLoadDelegate, @selector(webView:didFailProvisionalLoadWithError:forFrame:), webView, error, m_webFrame.get());
    }
    [m_webFrame->_private->internalLoadDelegate webFrame:m_webFrame.get() didFinishLoadWithError:error];
    */
    //
    if (brctl(m_webFrame)->wmlMode() && m_WmlContentListener) {
        m_WmlContentListener->HandleError(0,error.errorCode());
    }
    //
    TRAP_IGNORE(
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventLoadError, 0, 0 );
    );
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidFailLoad(const ResourceError& error)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());   
    [webView _didFailLoadWithError:error forFrame:m_webFrame.get()];

    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidFailLoadWithErrorForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didFailLoadWithErrorForFrameFunc(frameLoadDelegate, @selector(webView:didFailLoadWithError:forFrame:), webView, error, m_webFrame.get());
    }

    [m_webFrame->_private->internalLoadDelegate webFrame:m_webFrame.get() didFinishLoadWithError:error];
    */
    //
    if (brctl(m_webFrame)->wmlMode() && m_WmlContentListener) {
        m_WmlContentListener->HandleError(0,error.errorCode());
    }
    //
    TRAP_IGNORE(
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventLoadError, 0, 0 );
    );
    m_webFrame->frameView()->topView()->pageLoadFinished();
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchDidFinishDocumentLoad() // called when parsing is finished
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidFinishDocumentLoadForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didFinishDocumentLoadForFrameFunc(frameLoadDelegate, @selector(webView:didFinishDocumentLoadForFrame:), webView, m_webFrame.get());
    }
    */
}

void WebFrameLoaderClient::dispatchDidFinishLoad()
{
    /*
    WebView *webView = getWebView(m_webFrame.get());   
    [webView _didFinishLoadForFrame:m_webFrame.get()];

    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidFinishLoadForFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didFinishLoadForFrameFunc(frameLoadDelegate, @selector(webView:didFinishLoadForFrame:), webView, m_webFrame.get());
    }

    [m_webFrame->_private->internalLoadDelegate webFrame:m_webFrame.get() didFinishLoadWithError:nil];
    */
    if(  core(m_webFrame)->loader()->isLoadingMainFrame() )
        m_webFrame->frameView()->topView()->pageLoadFinished();
}

void WebFrameLoaderClient::dispatchDidFirstLayout()
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    WebFrameLoadDelegateImplementationCache implementations = WebViewGetFrameLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsDidFirstLayoutInFrame) {
        id frameLoadDelegate = WebViewGetFrameLoadDelegate(webView);
        implementations.didFirstLayoutInFrameFunc(frameLoadDelegate, @selector(webView:didFirstLayoutInFrame:), webView, m_webFrame.get());
    }
    */
    TRAP_IGNORE(
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventNewContentDisplayed, 0, 0 );
    );
}

Frame* WebFrameLoaderClient::dispatchCreatePage()
{
    /*
    WebView *currentWebView = getWebView(m_webFrame.get());
    id wd = [currentWebView UIDelegate];
    if ([wd respondsToSelector:@selector(webView:createWebViewWithRequest:)])
        return core([[wd webView:currentWebView createWebViewWithRequest:nil] mainFrame]);
    return 0;
    */
    CBrCtl* newBrCtl = NULL;
    TRAP_IGNORE(newBrCtl = brctl(m_webFrame)->getWindowL(*m_webPolicyManager->newWindowTargetName(),
        m_webPolicyManager->newWindowuserGesture()));
    if (newBrCtl) {
        return core(newBrCtl->webView()->mainFrame());
    }
    return NULL; 
}

void WebFrameLoaderClient::dispatchShow() 
{
    brctl(m_webFrame)->showWindow();
}

//dl mgr
void WebFrameLoaderClient::dispatchDecidePolicyForMIMEType(FramePolicyFunction function, const String& MIMEType, const ResourceRequest& request) 
{ 
    /*
        WebView *webView = getWebView(m_webFrame.get());

    [[webView _policyDelegateForwarder] webView:webView
                        decidePolicyForMIMEType:MIMEType
                                        request:request.nsURLRequest()
                                          frame:m_webFrame.get()
                               decisionListener:setUpPolicyListener(function).get()];

    */
    if (!function) 
        return;
    m_webPolicyManager->dispatchDecidePolicyForMIMEType(function, MIMEType, request);
}

void WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction function, const NavigationAction& action, const ResourceRequest& request, const String& frameName)
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    [[webView _policyDelegateForwarder] webView:webView
            decidePolicyForNewWindowAction:actionDictionary(action)
                                   request:request.nsURLRequest()
                              newFrameName:frameName
                          decisionListener:setUpPolicyListener(function).get()];
    */
    if (!function) 
        return;
    m_webPolicyManager->dispatchDecidePolicyForNewWindowAction(function, action, request, frameName);
}

void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(FramePolicyFunction function, const NavigationAction& action, const ResourceRequest& request) 
{ 
    /*
    WebView *webView = getWebView(m_webFrame.get());
    [[webView _policyDelegateForwarder] webView:webView
                decidePolicyForNavigationAction:actionDictionary(action)
                                        request:request.nsURLRequest()
                                          frame:m_webFrame.get()
                               decisionListener:setUpPolicyListener(function).get()];
    */
    if (!core(m_webFrame) || !function)
        return;
    m_webPolicyManager->dispatchDecidePolicyForNavigationAction(function, action, request);
}

void WebFrameLoaderClient::cancelPolicyCheck() 
{
    /*
    [m_policyListener.get() invalidate];
    m_policyListener = nil;
    m_policyFunction = 0;
    */
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchUnableToImplementPolicy(const ResourceError&) 
{
    /*
    WebView *webView = getWebView(m_webFrame.get());
    [[webView _policyDelegateForwarder] webView:webView
        unableToImplementPolicyWithError:error frame:m_webFrame.get()];    
    */
    notImplemented(); 
}

void WebFrameLoaderClient::dispatchWillSubmitForm(FramePolicyFunction function, PassRefPtr<FormState> formState)
{
    if (!function)
        return;
    m_webFrame->frameView()->topView()->willSubmitForm(formState.get());
    m_webPolicyManager->dispatchWillSubmitForm(function, formState);
}

void WebFrameLoaderClient::dispatchDidLoadMainResource(DocumentLoader*) 
{
    /*
    if ([WebScriptDebugServer listenerCount])
        [[WebScriptDebugServer sharedScriptDebugServer] webView:getWebView(m_webFrame.get())
            didLoadMainResourceForDataSource:dataSource(loader)];
    */
    notImplemented(); 
}

void WebFrameLoaderClient::revertToProvisionalState(DocumentLoader*)
{
    //    [dataSource(loader) _revertToProvisionalState];
    notImplemented(); 
}

void WebFrameLoaderClient::setMainDocumentError(DocumentLoader* loader, const ResourceError& error) 
{
    //    [dataSource(loader) _setMainDocumentError:error];
    if (brctl(m_webFrame)->brCtlDialogsProvider()) {
        int err = mapHttpErrors(error.errorCode());
        if (err <= KBrowserHTTP100 && err > KBrowserFailure) {
            if (total_bytes == 0 || err == KBrowserHTTP502 ) {
                HBufC* url = NULL;
                url = HBufC::New(loader->originalURL().des().Length());
                if (url) {
                    url->Des().Copy(loader->originalURL().des());
                    TRAP_IGNORE(brctl(m_webFrame)->brCtlDialogsProvider()->DialogNotifyHttpErrorL(err, *url));
                    delete url;
                }
            }
        }
        else {
            if (err != KBrowserCancelled) {
                TRAP_IGNORE(brctl(m_webFrame)->brCtlDialogsProvider()->DialogNotifyErrorL(err));
            }
        }
    }
}

void WebFrameLoaderClient::clearUnarchivingState(DocumentLoader*) 
{
    notImplemented(); 
}

// Maybe these should go into a ProgressTrackerClient some day
void WebFrameLoaderClient::willChangeEstimatedProgress() 
{
    //    [dataSource(loader) _clearUnarchivingState];
}

void WebFrameLoaderClient::didChangeEstimatedProgress() 
{
    //    [getWebView(m_webFrame.get()) _willChangeValueForKey:_WebEstimatedProgressKey];
    notImplemented(); 
}

void WebFrameLoaderClient::postProgressStartedNotification() 
{
    //    [[NSNotificationCenter defaultCenter] postNotificationName:WebViewProgressStartedNotification object:getWebView(m_webFrame.get())];
    TRAP_IGNORE(
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventUrlLoadingStart, 0, 0 );
    );
    total_bytes = 0;
#ifdef PERF_REGRESSION_LOG
        wkDebug()<<"Load started"<<mem<<flush;
#endif // PERF_REGRESSION_LOG
}

void WebFrameLoaderClient::postProgressEstimateChangedNotification()
{
#ifdef PERF_REGRESSION_LOG
    wkDebug()<<"Loading..."<<total_bytes<<"bytes"<<mem<<flush;
#endif // PERF_REGRESSION_LOG
    //    [[NSNotificationCenter defaultCenter] postNotificationName:WebViewProgressEstimateChangedNotification object:getWebView(m_webFrame.get())];
    double estimatedProgress = core(m_webFrame)->page()->progress()->estimatedProgress();
    TRAP_IGNORE(
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventNewUrlContentArrived, total_bytes / estimatedProgress, 0 );
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventMoreUrlContentArrived, total_bytes, 0 );
    );
}

void WebFrameLoaderClient::postProgressFinishedNotification() 
{
    TRAP_IGNORE(postProgressFinishedNotificationL());
}

void WebFrameLoaderClient::postProgressFinishedNotificationL() 
{
#ifdef PERF_REGRESSION_LOG
    wkDebug()<<"Load finished "<<core(m_webFrame)->page()->mainFrame()->document()->documentURI().des()<<mem<<flush;
#endif // PERF_REGRESSION_LOG
    //    [[NSNotificationCenter defaultCenter] postNotificationName:WebViewProgressFinishedNotification object:getWebView(m_webFrame.get())];
    //core(m_webFrame)->bridge()->Callback().postProgressFinishedNotification();
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventMoreUrlContentArrived, total_bytes, 0 );
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventUrlLoadingFinished, 0, 0 );
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventContentFinished, 0, 0 );
    brctl(m_webFrame)->HandleBrowserLoadEventL(TBrCtlDefs::EEventLoadFinished, 0, 0 );
    m_webFrame->frameView()->topView()->pageLoadFinished();
}

void WebFrameLoaderClient::setMainFrameDocumentReady(bool) 
{
    //    [getWebView(m_webFrame.get()) setMainFrameDocumentReady:ready];
    notImplemented(); 
}

void WebFrameLoaderClient::startDownload(const ResourceRequest&) 
{
    /*
    // FIXME: Should download full request.
    [getWebView(m_webFrame.get()) _downloadURL:request.url().getNSURL()];
    */
    notImplemented(); 
}

void WebFrameLoaderClient::willChangeTitle(DocumentLoader*) 
{
    /*
    // FIXME: Should do this only in main frame case, right?
    [getWebView(m_webFrame.get()) _willChangeValueForKey:_WebMainFrameTitleKey];
    */
    notImplemented(); 
}

void WebFrameLoaderClient::didChangeTitle(DocumentLoader*)
{
    /*
    // FIXME: Should do this only in main frame case, right?
    [getWebView(m_webFrame.get()) _didChangeValueForKey:_WebMainFrameTitleKey];
    */
    notImplemented(); 
}

void WebFrameLoaderClient::committedLoad(DocumentLoader* loader, const char* data, int length) 
{ 
    if (brctl(m_webFrame)->wmlMode()) {
    if(m_WmlContentListener)
    	TRAP_IGNORE(
         m_WmlContentListener->ResponseL( data, length );
         );
        return;
    }
    m_webFrame->bridge()->receivedData(data, length, m_response.textEncodingName());
}

void WebFrameLoaderClient::finishedLoading(DocumentLoader* loader) 
{ 
    if (!brctl(m_webFrame)->wmlMode()) {
        m_webFrame->bridge()->receivedData(NULL, 0, m_response.textEncodingName());
    }
}

void WebFrameLoaderClient::finalSetupForReplace(DocumentLoader*)
{
    //    [dataSource(loader) _clearUnarchivingState];
    notImplemented(); 
}

void WebFrameLoaderClient::updateGlobalHistoryForStandardLoad(const KURL& url) 
{ 
    /*
    NSURL *nsurl = url.getNSURL();
    WebHistoryItem *entry = [[WebHistory optionalSharedHistory] addItemForURL:nsurl];
    String pageTitle = core(m_webFrame.get())->loader()->documentLoader()->title();
    if (pageTitle.length())
        [entry setTitle:pageTitle];
    */

    if (!core(m_webFrame)->ownerElement()) {
        ResourceRequest* r = &(core(m_webFrame)->loader()->activeDocumentLoader()->request());
        TPtrC formContentType(KNullDesC);
        WebCore::FormData* formData = NULL;

        if (equalIgnoringCase(r->httpMethod(), "POST")) {
            formContentType.Set(r->httpContentType().des());
            formData = r->httpBody();
        }
        TPtrC8 responseUrl(r->url().des());
        TPtrC8 requestUrl(url.des());

        brctl(m_webFrame)->historyHandler()->updateGlobalHistoryForStandardLoad(responseUrl, requestUrl, formContentType, formData);
    }
}

void WebFrameLoaderClient::updateGlobalHistoryForReload(const KURL&)
{
    /*
    WebHistory *sharedHistory = [WebHistory optionalSharedHistory];
    WebHistoryItem *item = [sharedHistory itemForURL:url.getNSURL()];
    if (item)
        [sharedHistory setLastVisitedTimeInterval:[NSDate timeIntervalSinceReferenceDate] forItem:item];
    */
     brctl(m_webFrame)->historyHandler()->updateGlobalHistoryForReload();
}

bool WebFrameLoaderClient::shouldGoToHistoryItem(HistoryItem*) const 
{
    /*
    WebView* view = getWebView(m_webFrame.get());
    WebHistoryItem *webItem = kit(item);
    
    return [[view _policyDelegateForwarder] webView:view shouldGoToHistoryItem:webItem];
    */
    notImplemented();
    return false; 
}

ResourceError WebFrameLoaderClient::cancelledError(const ResourceRequest& request_)
{
    //    return [NSError _webKitErrorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled URL:request.url().getNSURL()];
    return ResourceError(String(), KErrCancel, request_.url().url(), String());
}

ResourceError WebFrameLoaderClient::blockedError(const ResourceRequest&)
{
    //    return [NSError _webKitErrorWithDomain:WebKitErrorDomain code:WebKitErrorCannotUseRestrictedPort URL:request.url().getNSURL()];
    notImplemented();
    return ResourceError(); 
}

ResourceError WebFrameLoaderClient::cannotShowURLError(const ResourceRequest&)
{
    //    return [NSError _webKitErrorWithDomain:WebKitErrorDomain code:WebKitErrorCannotShowURL URL:request.url().getNSURL()];
    notImplemented();
    return ResourceError(); 
}

ResourceError WebFrameLoaderClient::interruptForPolicyChangeError(const ResourceRequest& request)
{
    //    return [NSError _webKitErrorWithDomain:WebKitErrorDomain code:WebKitErrorFrameLoadInterruptedByPolicyChange URL:request.url().getNSURL()];
    return ResourceError(String(), KErrCancel, request.url().url(), String());
}

ResourceError WebFrameLoaderClient::cannotShowMIMETypeError(const ResourceResponse&) 
{
    //    return [NSError _webKitErrorWithDomain:NSURLErrorDomain code:WebKitErrorCannotShowMIMEType URL:response.url().getNSURL()];
    notImplemented();
    return ResourceError(); 
}

ResourceError WebFrameLoaderClient::fileDoesNotExistError(const ResourceResponse&)
{
//        return [NSError _webKitErrorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist URL:response.url().getNSURL()];    
    notImplemented();
    return ResourceError(); 
}

bool WebFrameLoaderClient::shouldFallBack(const ResourceError&)
{
    /*
    // FIXME: Needs to check domain.
    // FIXME: WebKitErrorPlugInWillHandleLoad is a workaround for the cancel we do to prevent
    // loading plugin content twice.  See <rdar://problem/4258008>
    return error.errorCode() != NSURLErrorCancelled && error.errorCode() != WebKitErrorPlugInWillHandleLoad;
    */
    notImplemented(); 
    return false; 
}

void WebFrameLoaderClient::setDefersLoading(bool defers)
{
    /*
    if (!defers)
        deliverArchivedResourcesAfterDelay();
    */
    notImplemented(); 
}

bool WebFrameLoaderClient::willUseArchive(ResourceLoader*, const ResourceRequest&, const KURL& originalURL) const
{
    /*
    if (request.url() != originalURL)
        return false;
    if (!canUseArchivedResource(request.nsURLRequest()))
        return false;
    WebResource *resource = [dataSource(core(m_webFrame.get())->loader()->activeDocumentLoader()) _archivedSubresourceForURL:originalURL.getNSURL()];
    if (!resource)
        return false;
    if (!canUseArchivedResource([resource _response]))
        return false;
    m_pendingArchivedResources.set(loader, resource);
    // Deliver the resource after a delay because callers don't expect to receive callbacks while calling this method.
    deliverArchivedResourcesAfterDelay();
    return true;
    */
    notImplemented(); 
    return false; 
}

bool WebFrameLoaderClient::isArchiveLoadPending(ResourceLoader*) const 
{
    //    return m_pendingArchivedResources.contains(loader);
    notImplemented(); 
    return false; 
}

void WebFrameLoaderClient::cancelPendingArchiveLoad(ResourceLoader*) 
{
    /*
    if (m_pendingArchivedResources.isEmpty())
        return;
    m_pendingArchivedResources.remove(loader);
    if (m_pendingArchivedResources.isEmpty())
        m_archivedResourcesDeliveryTimer.stop();
    */
    notImplemented(); 
}

void WebFrameLoaderClient::clearArchivedResources() 
{
    /*
    m_pendingArchivedResources.clear();
    m_archivedResourcesDeliveryTimer.stop();
    */
    notImplemented(); 
}

bool WebFrameLoaderClient::canHandleRequest(const ResourceRequest&) const
{
    //    return [WebView _canHandleRequest:request.nsURLRequest()];
    notImplemented(); 
    return true; 
}

bool WebFrameLoaderClient::canShowMIMEType(const String& MIMEType) const 
{
    //    return [WebView canShowMIMEType:MIMEType];
    notImplemented(); 
    return true; 
}

bool WebFrameLoaderClient::representationExistsForURLScheme(const String& URLScheme) const 
{
    //    return [WebView _representationExistsForURLScheme:URLScheme];
    notImplemented();
    return false; 
}

String WebFrameLoaderClient::generatedMIMETypeForURLScheme(const String& URLScheme) const 
{
    //    return [WebView _generatedMIMETypeForURLScheme:URLScheme];
    notImplemented();
    return String(); 
}

void WebFrameLoaderClient::frameLoadCompleted()
{
    if (brctl(m_webFrame)->wmlMode()) {
    if (m_WmlContentListener)
        TRAP_IGNORE(
         m_WmlContentListener->CompleteL( 0, 0 );
        );
        return;
    }
    /*
    // Note: Can be called multiple times.
    // Even if already complete, we might have set a previous item on a frame that
    // didn't do any data loading on the past transaction. Make sure to clear these out.
    NSScrollView *sv = [m_webFrame->_private->webFrameView _scrollView];
    if ([getWebView(m_webFrame.get()) drawsBackground])
        [sv setDrawsBackground:YES];
    core(m_webFrame.get())->loader()->setPreviousHistoryItem(0);
    */
    notImplemented(); 
}

void WebFrameLoaderClient::saveViewStateToItem(HistoryItem*)
{
    /*
    if (!item)
        return;
    
    NSView <WebDocumentView> *docView = [m_webFrame->_private->webFrameView documentView];

    // we might already be detached when this is called from detachFromParent, in which
    // case we don't want to override real data earlier gathered with (0,0)
    if ([docView superview] && [docView conformsToProtocol:@protocol(_WebDocumentViewState)])
        item->setViewState([(id <_WebDocumentViewState>)docView viewState]);
    */
    notImplemented(); 
}

void WebFrameLoaderClient::restoreViewState()
{
    /*
    HistoryItem* currentItem = core(m_webFrame.get())->loader()->currentHistoryItem();
    ASSERT(currentItem);

    // FIXME: As the ASSERT attests, it seems we should always have a currentItem here.
    // One counterexample is <rdar://problem/4917290>
    // For now, to cover this issue in release builds, there is no technical harm to returning
    // early and from a user standpoint - as in the above radar - the previous page load failed 
    // so there *is* no scroll state to restore!
    if (!currentItem)
        return;
    
    NSView <WebDocumentView> *docView = [m_webFrame->_private->webFrameView documentView];
    if ([docView conformsToProtocol:@protocol(_WebDocumentViewState)]) {        
        id state = currentItem->viewState();
        if (state) {
            [(id <_WebDocumentViewState>)docView setViewState:state];
        }
    }
    */
    notImplemented(); 
}

void WebFrameLoaderClient::provisionalLoadStarted()
{ 
    /*
    // FIXME: This is OK as long as no one resizes the window,
    // but in the case where someone does, it means garbage outside
    // the occupied part of the scroll view.
    [[m_webFrame->_private->webFrameView _scrollView] setDrawsBackground:NO];
    */
    notImplemented(); 
}

void WebFrameLoaderClient::didFinishLoad() 
{
    //    [m_webFrame->_private->internalLoadDelegate webFrame:m_webFrame.get() didFinishLoadWithError:nil];    
    notImplemented(); 
}

void WebFrameLoaderClient::prepareForDataSourceReplacement() 
{
    /*
    if (![m_webFrame.get() _dataSource]) {
        ASSERT(!core(m_webFrame.get())->tree()->childCount());
        return;
    }
    
    // Make sure that any work that is triggered by resigning first reponder can get done.
    // The main example where this came up is the textDidEndEditing that is sent to the
    // FormsDelegate (3223413).  We need to do this before _detachChildren, since that will
    // remove the views as a side-effect of freeing the bridge, at which point we can't
    // post the FormDelegate messages.
    //
    // Note that this can also take FirstResponder away from a child of our frameView that
    // is not in a child frame's view.  This is OK because we are in the process
    // of loading new content, which will blow away all editors in this top frame, and if
    // a non-editor is firstReponder it will not be affected by endEditingFor:.
    // Potentially one day someone could write a DocView whose editors were not all
    // replaced by loading new content, but that does not apply currently.
    NSView *frameView = m_webFrame->_private->webFrameView;
    NSWindow *window = [frameView window];
    NSResponder *firstResp = [window firstResponder];
    if ([firstResp isKindOfClass:[NSView class]] && [(NSView *)firstResp isDescendantOf:frameView])
        [window endEditingFor:firstResp];
    */
    notImplemented(); 
}

PassRefPtr<DocumentLoader> WebFrameLoaderClient::createDocumentLoader(const ResourceRequest& request, const SubstituteData& substituteData) 
{
//    RefPtr<WebDocumentLoader> loader = new WebDocumentLoader(request, substituteData);
//    WebDataSource *dataSource = new WebDataSource;
//    dataSource->initWithDocumentLoader(loader.get());
//    loader->setDataSource(dataSource, getWebView(m_webFrame.get()));
//    dataSource->release();
//    return loader.release();
    RefPtr<DocumentLoader> loader = new WebDocumentLoader(request, substituteData);

    return loader.release();
}

void WebFrameLoaderClient::setTitle(const String& title, const KURL&) 
{ 
    /*
    NSURL* nsURL = canonicalURL(URL.getNSURL());
    if(!nsURL)
        return;
    NSString *titleNSString = title;
    [[[WebHistory optionalSharedHistory] itemForURL:nsURL] setTitle:titleNSString];
    */
    brctl(m_webFrame)->historyHandler()->setCurrentEntryTitle(title.des());    
}

String WebFrameLoaderClient::userAgent(const KURL&) 
{
    //    return [getWebView(m_webFrame.get()) _userAgentForURL:url];
    return m_webFrame->frameView()->topView()->userAgent();
}

TInt WebFrameLoaderClient::widgetNetworkConstants(TInt aId)
{
    CWidgetExtension* widgetExt = m_webFrame->frameView()->topView()->widgetExtension();
    if ( widgetExt ) {
        return widgetExt->widgetNetworkConstants(aId);
    }
    
    notImplemented();
    return 0;
}

TInt WebFrameLoaderClient::widgetNetworkState()
{
    CWidgetExtension* widgetExt = m_webFrame->frameView()->topView()->widgetExtension();
    if ( widgetExt ) {
        return widgetExt->widgetNetworkState();
    }
    
    notImplemented();
    return 0;
}

void WebFrameLoaderClient::saveDocumentViewToCachedPage(CachedPage*) 
{
    //    cachedPage->setDocumentView([m_webFrame->_private->webFrameView documentView]);
    notImplemented(); 
}

bool WebFrameLoaderClient::canCachePage() const 
{
    /*
    // We can only cache HTML pages right now
    return [[[m_webFrame.get() _dataSource] representation] isKindOfClass:[WebHTMLRepresentation class]];
    */
    notImplemented();
    return false; 
}


PassRefPtr<Frame> WebFrameLoaderClient::createFrame(const KURL& url, const String& name, HTMLFrameOwnerElement* ownerElement,
    const String& referrer, bool allowsScrolling, int marginWidth, int marginHeight)
{
    /*
    WebFrameBridge* bridge = m_webFrame->_private->bridge;
    BEGIN_BLOCK_OBJC_EXCEPTIONS;
    
    return [bridge createChildFrameNamed:name
                   withURL:url.getNSURL()
                   referrer:referrer 
                   ownerElement:ownerElement
                   allowsScrolling:allowsScrolling
                   marginWidth:marginWidth
                   marginHeight:marginHeight];

    END_BLOCK_OBJC_EXCEPTIONS;
    return 0;
    */
    return m_webFrame->bridge()->createChildFrameNamed(&name, url.des(), referrer.des(),
        ownerElement, allowsScrolling, marginWidth, marginHeight);
}

Widget* WebFrameLoaderClient::createPlugin(const WebCore::IntSize&, Element* pluginElement, const KURL& url, const Vector<String>& paramNames,
                                               const Vector<String>& paramValues, const String& mimeType, bool pluginDocument)
{
    bool canLoad = true;
    
    if ( pluginElement ) {
        HTMLObjectElement *objectNode = static_cast<HTMLObjectElement* >(pluginElement);
        canLoad = objectNode->canLoadPlugin();
    }
    
    return new Widget( m_webFrame->bridge()->viewForPluginWithURL( url.des(), paramNames, paramValues,
            core(m_webFrame)->loader()->baseURL(), mimeType, canLoad, pluginElement ));
}

void WebFrameLoaderClient::redirectDataToPlugin(Widget* pluginWidget) 
{
    /*
    BEGIN_BLOCK_OBJC_EXCEPTIONS;
    [m_webFrame->_private->bridge redirectDataToPlugin:pluginWidget->getView()];
    END_BLOCK_OBJC_EXCEPTIONS;
    */
//    core(m_webFrame)->bridge()->Callback().RedirectDataToPlugin( pluginWidget->getView() );
}

Widget* WebFrameLoaderClient::createJavaAppletWidget(const IntSize&, Element*, const KURL& baseURL, const Vector<String>& paramNames, const Vector<String>& paramValues)
{
    /*
    Widget* result = new Widget;
    
    BEGIN_BLOCK_OBJC_EXCEPTIONS;
    WebFrameBridge* bridge = m_webFrame->_private->bridge;
    result->setView([bridge viewForJavaAppletWithFrame:NSMakeRect(0, 0, size.width(), size.height())
                            attributeNames:nsArray(paramNames)
                            attributeValues:nsArray(paramValues)
                            baseURL:baseURL.getNSURL()
                            DOMElement:[DOMElement _wrapElement:element]]);    
    END_BLOCK_OBJC_EXCEPTIONS;
    
    return result;
    */
    notImplemented();
    return 0; 
}

ObjectContentType WebFrameLoaderClient::objectContentType(const KURL& url, const String& mimeType)
{
    /*
    WebFrameBridge* bridge = m_webFrame->_private->bridge;
    BEGIN_BLOCK_OBJC_EXCEPTIONS;
    return (ObjectContentType)[bridge determineObjectFromMIMEType:mimeType URL:url.getNSURL()];
    END_BLOCK_OBJC_EXCEPTIONS;
    return ObjectContentNone;
    */

    ObjectContentType contentType = ObjectContentNone;
    PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler();     
    TInt  handle = pluginHandler->findPlugin( mimeType.des() );        
    
    if (handle == KErrNotFound) {                        
      handle = pluginHandler->findPluginByExtension( url.des() );        
    }
    
    if (handle != KErrNotFound) {
        contentType = ObjectContentNetscapePlugin;
    }

    if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType))
        return WebCore::ObjectContentImage;
    return contentType; 
}

String WebFrameLoaderClient::overrideMediaType() const
{
    /*
    NSString* overrideType = [m_webFrame->_private->bridge overrideMediaType];
    if (overrideType)
        return overrideType;
    return String();
    */
    notImplemented();
    return String(); 
}

void WebFrameLoaderClient::windowObjectCleared() const
{
    if (m_webFrame && !m_webFrame->parentFrame()) {
        m_webFrame->frameView()->topView()->windowObjectCleared();
    }
}

void WebFrameLoaderClient::didPerformFirstNavigation() const
{
    notImplemented();
}

void WebFrameLoaderClient::registerForIconNotification(bool listen)
{
//    [[m_webFrame.get() webView] _registerForIconNotification:listen];
//tot:fixme Do this when SQLite is capable to support multithreading.
/*
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_receivedIconChangedNotification:) name:WebIconDatabaseDidAddIconNotification object:nil];        
    else
        [[NSNotificationCenter defaultCenter] removeObserver:self name:WebIconDatabaseDidAddIconNotification object:nil];

  */
    notImplemented();
}

void WebFrameLoaderClient::ignore(WebCore::FramePolicyFunction function)
{
    (core(m_webFrame)->loader()->*function)(WebCore::PolicyIgnore);
}

void WebFrameLoaderClient::download(WebCore::FramePolicyFunction function)
{
    (core(m_webFrame)->loader()->*function)(WebCore::PolicyDownload);
}

void WebFrameLoaderClient::use(WebCore::FramePolicyFunction function)
{
    (core(m_webFrame)->loader()->*function)(WebCore::PolicyUse);
}

bool WebFrameLoaderClient::isWMLContent(const String& MIMEType)
{
    bool found = false;
#ifndef BRDO_WML_DISABLED_FF    
    if ( MIMEType == "text/vnd.wap.wml" || MIMEType == "text/vnd.wap.wmlc" || MIMEType == "application/vnd.wap.wmlc" || MIMEType == "application/vnd.wap.wmlscriptc") {
        found = true;
    }
#endif    
    return found;
}




/*
static inline WebDataSource *dataSource(DocumentLoader* loader)
{
    return loader ? static_cast<WebDocumentLoaderMac*>(loader)->dataSource() : nil;
}

WebFrameLoaderClient::WebFrameLoaderClient(WebFrame *webFrame)
    : m_webFrame(webFrame)
    , m_policyFunction(0)
    , m_archivedResourcesDeliveryTimer(this, &WebFrameLoaderClient::deliverArchivedResources)
{
}

NSCachedURLResponse* WebFrameLoaderClient::willCacheResponse(DocumentLoader* loader, unsigned long identifier, NSCachedURLResponse* response) const
{
    WebView *webView = getWebView(m_webFrame.get());
    id resourceLoadDelegate = WebViewGetResourceLoadDelegate(webView);
    WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);
    if (implementations.delegateImplementsWillCacheResponse)
        return implementations.willCacheResponseFunc(resourceLoadDelegate, @selector(webView:resource:willCacheResponse:fromDataSource:), webView, [webView _objectForIdentifier:identifier], response, dataSource(loader));

    return response;
}

// The following 2 functions are copied from [NSHTTPURLProtocol _cachedResponsePassesValidityChecks] and modified for our needs.
// FIXME: It would be nice to eventually to share this logic somehow.
bool WebFrameLoaderClient::canUseArchivedResource(NSURLRequest *request) const
{
    NSURLRequestCachePolicy policy = [request cachePolicy];
    if (policy == NSURLRequestReturnCacheDataElseLoad)
        return true;
    if (policy == NSURLRequestReturnCacheDataDontLoad)
        return true;
    if ([request valueForHTTPHeaderField:@"must-revalidate"] != nil)
        return false;
    if ([request valueForHTTPHeaderField:@"proxy-revalidate"] != nil)
        return false;
    if ([request valueForHTTPHeaderField:@"If-Modified-Since"] != nil)
        return false;
    if ([request valueForHTTPHeaderField:@"Cache-Control"] != nil)
        return false;
    if ([@"POST" _webkit_isCaseInsensitiveEqualToString:[request HTTPMethod]])
        return false;
    return true;
}

bool WebFrameLoaderClient::canUseArchivedResource(NSURLResponse *response) const
{
    if (WKGetNSURLResponseMustRevalidate(response))
        return false;
    if (WKGetNSURLResponseCalculatedExpiration(response) - CFAbsoluteTimeGetCurrent() < 1)
        return false;
    return true;
}

void WebFrameLoaderClient::deliverArchivedResourcesAfterDelay() const
{
    if (m_pendingArchivedResources.isEmpty())
        return;
    if (core(m_webFrame.get())->page()->defersLoading())
        return;
    if (!m_archivedResourcesDeliveryTimer.isActive())
        m_archivedResourcesDeliveryTimer.startOneShot(0);
}

void WebFrameLoaderClient::deliverArchivedResources(Timer<WebFrameLoaderClient>*)
{
    if (m_pendingArchivedResources.isEmpty())
        return;
    if (core(m_webFrame.get())->page()->defersLoading())
        return;

    const ResourceMap copy = m_pendingArchivedResources;
    m_pendingArchivedResources.clear();

    ResourceMap::const_iterator end = copy.end();
    for (ResourceMap::const_iterator it = copy.begin(); it != end; ++it) {
        RefPtr<ResourceLoader> loader = it->first;
        WebResource *resource = it->second.get();
        NSData *data = [[resource data] retain];
        loader->didReceiveResponse([resource _response]);
        loader->didReceiveData((const char*)[data bytes], [data length], [data length], true);
        [data release];
        loader->didFinishLoading();
    }
}

RetainPtr<WebFramePolicyListener> WebFrameLoaderClient::setUpPolicyListener(FramePolicyFunction function)
{
    ASSERT(!m_policyListener);
    ASSERT(!m_policyFunction);

    [m_policyListener.get() invalidate];

    WebFramePolicyListener *listener = [[WebFramePolicyListener alloc] initWithWebCoreFrame:core(m_webFrame.get())];
    m_policyListener = listener;
    [listener release];
    m_policyFunction = function;

    return listener;
}

void WebFrameLoaderClient::receivedPolicyDecison(PolicyAction action)
{
    ASSERT(m_policyListener);
    ASSERT(m_policyFunction);

    FramePolicyFunction function = m_policyFunction;

    m_policyListener = nil;
    m_policyFunction = 0;

    (core(m_webFrame.get())->loader()->*function)(action);
}

String WebFrameLoaderClient::userAgent(const KURL& url)
{
    return [getWebView(m_webFrame.get()) _userAgentForURL:url];
}

static const MouseEvent* findMouseEvent(const Event* event)
{
    for (const Event* e = event; e; e = e->underlyingEvent())
        if (e->isMouseEvent())
            return static_cast<const MouseEvent*>(e);
    return 0;
}

NSDictionary *WebFrameLoaderClient::actionDictionary(const NavigationAction& action) const
{
    unsigned modifierFlags = 0;
    const Event* event = action.event();
    if (const UIEventWithKeyState* keyStateEvent = findEventWithKeyState(const_cast<Event*>(event))) {
        if (keyStateEvent->ctrlKey())
            modifierFlags |= NSControlKeyMask;
        if (keyStateEvent->altKey())
            modifierFlags |= NSAlternateKeyMask;
        if (keyStateEvent->shiftKey())
            modifierFlags |= NSShiftKeyMask;
        if (keyStateEvent->metaKey())
            modifierFlags |= NSCommandKeyMask;
    }
    if (const MouseEvent* mouseEvent = findMouseEvent(event)) {
        IntPoint point(mouseEvent->clientX(), mouseEvent->clientY());
        WebElementDictionary *element = [[WebElementDictionary alloc]
            initWithHitTestResult:core(m_webFrame.get())->eventHandler()->hitTestResultAtPoint(point, false)];
        NSDictionary *result = [NSDictionary dictionaryWithObjectsAndKeys:
            [NSNumber numberWithInt:action.type()], WebActionNavigationTypeKey,
            element, WebActionElementKey,
            [NSNumber numberWithInt:mouseEvent->button()], WebActionButtonKey,
            [NSNumber numberWithInt:modifierFlags], WebActionModifierFlagsKey,
            action.URL().getNSURL(), WebActionOriginalURLKey,
            nil];
        [element release];
        return result;
    }
    return [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithInt:action.type()], WebActionNavigationTypeKey,
        [NSNumber numberWithInt:modifierFlags], WebActionModifierFlagsKey,
        action.URL().getNSURL(), WebActionOriginalURLKey,
        nil];
}

static NSArray* nsArray(const Vector<String>& vector)
{
    unsigned len = vector.size();
    NSMutableArray* array = [NSMutableArray arrayWithCapacity:len];
    for (unsigned x = 0; x < len; x++)
        [array addObject:vector[x]];
    return array;
}

- (id)initWithWebCoreFrame:(Frame*)frame
{
    self = [self init];
    if (!self)
        return nil;
    frame->ref();
    m_frame = frame;
    return self;
}

- (void)invalidate
{
    if (m_frame) {
        m_frame->deref();
        m_frame = 0;
    }
}

- (void)dealloc
{
    if (m_frame)
        m_frame->deref();
    [super dealloc];
}

- (void)finalize
{
    ASSERT_MAIN_THREAD();
    if (m_frame)
        m_frame->deref();
    [super finalize];
}


*/



