diff -r 7c90e6132015 -r 10e98eab6f85 webengine/osswebengine/WebKit/s60/webview/WebView.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebView.cpp Fri May 08 08:25:06 2009 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/WebView.cpp Fri Jul 03 15:54:40 2009 +0100 @@ -59,6 +59,7 @@ #include "PluginSkin.h" #include "PluginWin.h" #include "PluginPlayer.h" +#include "WebKitLogger.h" #include "Page.h" @@ -83,6 +84,10 @@ #include "WidgetExtension.h" #include "Cache.h" #include "RenderWidget.h" +#include "HTMLNames.h" +#include "HTMLInputElement.h" + +using namespace HTMLNames; #include #include @@ -98,6 +103,7 @@ const int KRepaintDelayLoading = 500*1000; // dont do repaints more often than this during loading (0.5s) const int KRepaintDelayComplete = 100*1000; // faster updates after load so dynamic scripts etc have better frame rate (0.1s) +const int KRepaintDelayNavNone = 70*1000; const int KNormalScrollRange = 60; const int KPanningStartSpeed = 30; @@ -185,7 +191,6 @@ , m_pageFullScreenHandler(NULL) , m_viewIsScrolling(false) , m_ptrbuffer(0) -, m_pluginActivated(false) , m_showCursor(false) , m_allowRepaints(true) { @@ -200,6 +205,8 @@ delete m_pageZoomHandler; m_pageZoomHandler = NULL; + m_zoomLevelArray.Close(); + // prevent frameViews to access members when topView is // closing down. m_isClosing = true; @@ -229,6 +236,8 @@ delete m_tabbedNavigation; delete m_userAgent; delete m_pageFullScreenHandler; + delete m_bridge; + delete m_frameView; } // ----------------------------------------------------------------------------- @@ -242,7 +251,7 @@ CCoeControl::MakeVisible(ETrue); - WebFrameView *frameView = new WebFrameView(); + m_frameView = new WebFrameView(); m_page = new Page(new WebChromeClient(this), new WebContextMenuClient(), new WebEditorClient(this), new WebDragClient(), new WebInspectorClient()); m_page->backForwardList()->setCapacity(0); m_page->setGroupName("com.s60.browser"); @@ -261,8 +270,8 @@ m_tabbedNavigation = new WebTabbedNavigation(this); - WebFrameBridge* bridge = new WebFrameBridge(); - bridge->initMainFrameWithPage(m_page, "", frameView); + m_bridge = new WebFrameBridge(); + m_bridge->initMainFrameWithPage(m_page, "", m_frameView); // Create and offscreen device and context m_bitmapdevice = CFbsBitmapDevice::NewL( StaticObjectsContainer::instance()->webSurface()->offscreenBitmap() ); @@ -364,7 +373,7 @@ //------------------------------------------------------------------------------- void WebView::Draw( const TRect& rect ) const { - if (m_pluginFullscreen) return; + if (StaticObjectsContainer::instance()->isPluginFullscreen()) return; CWindowGc& gc = SystemGc(); CEikBorderedControl::Draw( rect ); @@ -549,7 +558,7 @@ return; } - if (isPluginFullscreen()) return; + if (StaticObjectsContainer::instance()->isPluginFullscreen()) return; CFbsBitGc& gc = m_webcorecontext->gc(); gc.Reset(); @@ -561,6 +570,15 @@ layoutPending = f->view()->layoutPending(); f = f->tree()->traverseNext(); } + + if (layoutPending && m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) { + Frame* f = m_page->mainFrame(); + while ( f ) { + f->view()->layout(); + f = f->tree()->traverseNext(); + } + layoutPending = false; + } if (!layoutPending) { bool needsDraw = false; m_repaints.Tidy(); @@ -588,8 +606,11 @@ // tot:fixme TBool complete = iWebkitControl->IsProgressComplete(); && CImageRendererFactory::Instance()->DecodeCount()==0; TBool complete = ETrue; + int timeout = complete ? KRepaintDelayComplete : KRepaintDelayLoading; + if (complete && m_brctl->settings() && m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) + timeout = KRepaintDelayNavNone; if ( !m_pageZoomHandler->isActive() && m_allowRepaints){ - m_repainttimer->Start(complete ? KRepaintDelayComplete : KRepaintDelayLoading, + m_repainttimer->Start(timeout, 0, TCallBack( &doRepaintCb, this ) ); } // need to draw formfill popup here. @@ -633,15 +654,23 @@ //------------------------------------------------------------------------------- void WebView::collectOffscreenbitmapL(CFbsBitmap& snapshot) { - - (snapshot).Create(m_brctl->Size(), StaticObjectsContainer::instance()->webSurface()->displayMode()); - + if ( snapshot.Handle() == 0) { + // Create bitmap only once + (snapshot).Create(m_brctl->Size(), StaticObjectsContainer::instance()->webSurface()->displayMode()); + } CFbsBitmapDevice* device = CFbsBitmapDevice::NewL( &snapshot); CleanupStack::PushL(device); WebCoreGraphicsContext* gc = WebCoreGraphicsContext::NewL( device, &snapshot, mainFrame()->frameView()); CleanupStack::PushL(gc); - + + if( snapshot.Handle() != 0 ){ + // Clear previous offscreen bitmap + // frameView->draw might clear the bitmap. + gc->gc().Clear(); + } else if (snapshot.SizeInPixels()!=m_brctl->Size()){ + snapshot.Resize(m_brctl->Size()); + } mainFrame()->frameView()->draw( *gc, mainFrame()->frameView()->visibleRect() ); CleanupStack::PopAndDestroy(2); @@ -673,34 +702,40 @@ void WebView::pageLoadFinished() { + if (m_brctl->settings()) { + switch (m_brctl->settings()->getNavigationType()) { + case SettingsContainer::NavigationTypeTabbed: + m_tabbedNavigation->initializeForPage(); + break; + case SettingsContainer::NavigationTypeNone: + break; + case SettingsContainer::NavigationTypeCursor: + { - if (m_brctl->settings() && m_brctl->settings()->getTabbedNavigation()) { - m_tabbedNavigation->initializeForPage(); - } - else { + // Temp solution to fix a problem with scrolling large pages: + // if user starts scrolling while loading a page - at the end of the load we should not restore + // the content position from the history controller + // As of now scroll events are not passed to WebCore and this will be changed in future + // then this code should be replaces with the commented one below - // Temp solution to fix a problem with scrolling large pages: - // if user starts scrolling while loading a page - at the end of the load we should not restore - // the content position from the history controller - // As of now scroll events are not passed to WebCore and this will be changed in future - // then this code should be replaces with the commented one below + TPoint ptInit(0,0); + TPoint ptFromHistory = m_brctl->historyHandler()->historyController()->currentEntryPosition(); + TPoint ptCurr = mainFrame()->frameView()->contentPos(); - TPoint ptInit(0,0); - TPoint ptFromHistory = m_brctl->historyHandler()->historyController()->currentEntryPosition(); - TPoint ptCurr = mainFrame()->frameView()->contentPos(); - - if ( ptCurr != ptFromHistory ) { - if ( ptInit == ptCurr ) { - mainFrame()->frameView()->scrollTo(ptFromHistory); - } - else { - m_brctl->historyHandler()->historyController()->updateCurrentEntryPositionIfNeeded(); + if ( ptCurr != ptFromHistory ) { + if ( ptInit == ptCurr ) { + mainFrame()->frameView()->scrollTo(ptFromHistory); + } + else { + m_brctl->historyHandler()->historyController()->updateCurrentEntryPositionIfNeeded(); + } + } + /* + if ( !core(mainFrame())->view()->wasScrolledByUser()) + mainFrame()->frameView()->scrollTo(m_brctl->historyHandler()->historyController()->currentEntryPosition());*/ + break; } } - /* - if ( !core(mainFrame())->view()->wasScrolledByUser()) - mainFrame()->frameView()->scrollTo(m_brctl->historyHandler()->historyController()->currentEntryPosition());*/ - } if (FrameLoadTypeStandard == core( mainFrame())->loader()->loadType()){ @@ -787,6 +822,8 @@ return rv; } + + bool WebView::isNaviKey(const TKeyEvent& keyevent) { return ( keyevent.iCode == EKeyUpArrow // North @@ -800,24 +837,26 @@ || keyevent.iCode == EStdKeyDevice13 // : Extra KeyEvent supports diagonal event simulator wedge || keyevent.iCode == EKeyLeftArrow // West || keyevent.iCode == EKeyLeftUpArrow // Northwest - || keyevent.iCode == EStdKeyDevice10); + || keyevent.iCode == EStdKeyDevice10); } bool WebView::handleEditable(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame ) { bool consumed = false; + if (eventcode == EEventKeyDown) + return false; consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode)); // exit input on up/down key // EXCEPT on touch-enabled devices. We'll just consume in that case if ( !consumed && isNaviKey(keyevent) ) { if (m_webfeptexteditor->validateTextFormat() ) { setFocusNone(); - } + } else { consumed = true; } } - + return consumed; } @@ -836,23 +875,23 @@ event.iPosition = pos; event.iModifiers = 0; event.iType = eventType; - + switch (eventType) { case TPointerEvent::EButton1Down: { frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event)); break; } - - case TPointerEvent::EButton1Up: + + case TPointerEvent::EButton1Up: { frame->eventHandler()->handleMouseReleaseEvent(PlatformMouseEvent(event)); break; } - + case TPointerEvent::EMove: { - frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event)); + frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event)); break; } }; @@ -875,49 +914,62 @@ bool consumed = false; TKeyEvent oldKeyEvent(m_currentEventKey); + oldKeyEvent.iCode = keyevent.iCode; + TEventCode oldKeyCode = m_currentEventCode; bool downEventConsumed = false; - if (m_currentEventCode == EEventKeyDown && - keyevent.iCode != EKeyDevice3 ){ - sendKeyEventToEngine(oldKeyEvent, EEventKeyDown, frame); - } m_currentEventKey = keyevent; m_currentEventCode = eventcode; - if (keyevent.iCode == EKeyDevice3) { - // pass it to webcore - sendMouseEventToEngine(TPointerEvent::EButton1Down, - cursor->position(), frame); - // mimic ccb's behavior of onFocus - setFocusedNode(frame); + if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) { + consumed = handleInputElement(keyevent, eventcode, frame); + if (!consumed) + consumed = sendKeyEventToEngine(keyevent, eventcode, frame); + } + else { + if (keyevent.iCode == EKeyDevice3) { + // pass it to webcore + sendMouseEventToEngine(TPointerEvent::EButton1Down, + cursor->position(), frame); + + // mimic ccb's behavior of onFocus + setFocusedNode(frame); - // Toolbar is activated on long key press only if the element - // type is EElementNone during EEventKeyDown and EEventKey. - // This prevents toolbar from popping up in DHTML pages. Also, - // toolbar is activated when the user is not in fast scroll - // mode, or in page overview mode, or on wml page. - if ( ( m_focusedElementType == TBrCtlDefs::EElementNone || - m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) && - keyevent.iRepeats && !m_brctl->wmlMode() ) { - launchToolBarL(); - } - consumed = true; + // Toolbar is activated on long key press only if the element + // type is EElementNone during EEventKeyDown and EEventKey. + // This prevents toolbar from popping up in DHTML pages. Also, + // toolbar is activated when the user is not in fast scroll + // mode, or in page overview mode, or on wml page. + if ( ( m_focusedElementType == TBrCtlDefs::EElementNone || + m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) && + keyevent.iRepeats && !m_brctl->wmlMode() ) { + launchToolBarL(); + } + consumed = true; + } + else if (isNaviKey(keyevent)) { + + if (oldKeyCode == EEventKeyDown){ + // Keydown event is automatically generated before each keypress event, but in this case + // we don't send a keypress event, so send a keydown event explicitly. + downEventConsumed = sendKeyEventToEngine(oldKeyEvent, EEventKeyDown, frame); + } + + + if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed) { + consumed = downEventConsumed || handleTabbedNavigation(keyevent, eventcode); + } + else { + consumed = handleKeyNavigation(keyevent, eventcode, frame); + } + } // if (m_brctl->settings()->getNavigationType() + else { // Not an arrow key.. + // activate hovered input element by just start typing + consumed = handleInputElement(keyevent, eventcode, frame); + } + if (!consumed && !(m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed && isNaviKey(keyevent))) { + consumed = sendKeyEventToEngine(keyevent, eventcode, frame); + } } - else if (isNaviKey(keyevent)) { - if (m_brctl->settings()->getTabbedNavigation()) { - consumed = downEventConsumed || handleTabbedNavigation(keyevent, eventcode); - } - else { - consumed = handleKeyNavigation(keyevent, eventcode, frame); - } - } // if (m_brctl->settings()->getTabbedNavigation() - else { // Not an arrow key.. - // activate hovered input element by just start typing - consumed = handleInputElement(keyevent, eventcode, frame); - } - - if (!consumed) { - consumed = sendKeyEventToEngine(keyevent, eventcode, frame); - } return consumed; } @@ -925,15 +977,22 @@ bool WebView::handleInputElement(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) { WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); - if (m_focusedElementType == TBrCtlDefs::EElementInputBox || - m_focusedElementType == TBrCtlDefs::EElementSelectBox || - m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox || + bool sendMousedEvent = false; + if (m_focusedElementType == TBrCtlDefs::EElementInputBox || m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) { - + sendMousedEvent = true; + } + else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox || + m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) { + if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone || keyevent.iCode == EKeyDevice3) { + sendMousedEvent = true; + } + } + if (sendMousedEvent) { sendMouseEventToEngine(TPointerEvent::EButton1Down, cursor->position(), frame); sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame); - - if (m_focusedElementType == TBrCtlDefs::EElementInputBox || + + if (m_focusedElementType == TBrCtlDefs::EElementInputBox || m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) { if (!m_fepTimer) { m_fepTimer = new WebCore::Timer(this, &WebView::fepTimerFired); @@ -944,8 +1003,9 @@ } m_keyevent = keyevent; m_eventcode = eventcode; + return true; } - return true; + return false; // not input element } @@ -960,7 +1020,7 @@ if (!cursor->isVisible()) { cursor->cursorUpdate(true); } - + m_savedPosition = mainFrame()->frameView()->contentPos(); cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll); updateScrollbars(); @@ -975,7 +1035,7 @@ if (!fastscroll) { sendMouseEventToEngine(TPointerEvent::EMove, cursor->position(), frame); } - + consumed = true; return consumed; } @@ -984,7 +1044,7 @@ bool WebView::handleMinimapNavigation() { int scrollingTime = millisecondsScrolled(); - if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled && + if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled && m_pageScaler && !isSmallPage() && m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsPageOverview) && (scrollingTime > KPanningPageScalerStart || m_pageScaler->Visible())) { @@ -1051,6 +1111,7 @@ bool consumed = false; TInt delay = 2 * KCursorInitialDelay; WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); + m_fastScrollTimer->Cancel(); m_scrollingSpeed = KNormalScrollRange*100/scalingFactor(); @@ -1064,38 +1125,42 @@ } m_pageScrollHandler->scrollbarDrawer()->fadeScrollbar(delay); - if ( (keyevent.iScanCode == EStdKeyDevice3) || - (keyevent.iScanCode == EStdKeyEnter) ) { - // pass it to webcore - - if (m_focusedElementType == TBrCtlDefs::EElementInputBox || + if ( (keyevent.iScanCode == EStdKeyDevice3) || + (keyevent.iScanCode == EStdKeyEnter) ) { + // pass it to webcore + + if (m_focusedElementType == TBrCtlDefs::EElementInputBox || m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) { setEditable(true); } - sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame); - consumed = true; + if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) { + sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame); + consumed = true; + } } - if (!consumed) { - sendKeyEventToEngine(keyevent, eventcode, frame); - } - m_currentEventKey = KNullKeyEvent; - m_currentEventCode = EEventNull; + + if (!consumed) { + + TKeyEvent correctedKeyEvent(keyevent); + correctedKeyEvent.iCode = m_currentEventKey.iCode; + sendKeyEventToEngine(correctedKeyEvent, eventcode, frame); + } + m_currentEventKey = KNullKeyEvent; + m_currentEventCode = EEventNull; return consumed; } -bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent, +bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) { bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode)); - - if (!consumed && eventcode == EEventKey && + if (!consumed && eventcode == EEventKey && (m_brctl->capabilities() & TBrCtlDefs::ECapabilityAccessKeys)) { - TKeyEvent ke = keyevent; TChar c(ke.iCode); // Not consumed by WebCore, is alphanumeric and does not have any modifier - if (c.IsAlphaDigit() && + if (c.IsAlphaDigit() && !(ke.iModifiers & (EModifierCtrl | EModifierAlt | EModifierShift))) { ke.iModifiers = EModifierCtrl; frame->eventHandler()->keyEvent(PlatformKeyboardEvent(ke,EEventKeyDown)); @@ -1130,12 +1195,12 @@ if (!coreFrame) return EKeyWasNotConsumed; coreFrame = page()->focusController()->focusedOrMainFrame(); - + // edit events if (m_isEditable) { consumed = handleEditable(keyevent, eventcode, coreFrame); } - + // scroll events if (!consumed) { switch( eventcode ) { @@ -1162,6 +1227,8 @@ (displayPosY * scalingFactor()) / 100, (documentWidth * scalingFactor()) / 100, Rect().Width(), (displayPosX * scalingFactor()) / 100); } + + void WebView::updateScrollbars() { TPoint scrollDelta = mainFrame()->frameView()->contentPos() - m_savedPosition; @@ -1177,6 +1244,7 @@ } } + void WebView::openPageViewL() { // don't show pageview if we are in lite mode @@ -1404,28 +1472,6 @@ void WebView::FocusChanged(TDrawNow aDrawNow) { -if (m_isPluginsVisible && !m_pluginActivated) { - Frame* coreFrame =core(mainFrame()); - MWebCoreObjectWidget* view = NULL; - TBool focus(IsFocused()); - for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame)) { - PassRefPtr objects = frame->document()->objects(); - for (Node* n = objects->firstItem(); n; n = objects->nextItem()) { - view = widget(n); - if (view) { - static_cast(view)->viewFocusChanged(focus); - } - } - - PassRefPtr embeds = frame->document()->embeds(); - for (Node* n = embeds->firstItem(); n; n = embeds->nextItem()) { - view = widget(n); - if (view) { - static_cast(view)->viewFocusChanged(focus); - } - } - } - } if (m_pageFullScreenHandler && m_pageFullScreenHandler->isFullScreenMode()) { if (IsFocused()) m_pageFullScreenHandler->showEscBtnL(); else m_pageFullScreenHandler->hideEscBtnL(); @@ -1447,9 +1493,11 @@ if (m_pageFullScreenHandler) { m_pageFullScreenHandler->SizeChanged(); } - if (m_viewIsScrolling) { + + if (m_pageScrollHandler) { m_pageScrollHandler->scrollbarDrawer()->redrawScrollbar(); } + } TSize WebView::maxBidiSize() const @@ -1582,9 +1630,9 @@ { if (!m_findKeyword) { WebFrame* frame = mainFrame()->findFrameWithSelection(); - if (frame) { - frame->clearSelection(); - } + if(frame) { + frame->clearSelection(); + } return TBrCtlDefs::EFindNoMatches; } return search(*m_findKeyword, forward, true); @@ -1681,8 +1729,12 @@ TPtr8 ptr((TUint8 *)m_ptrbuffer,256*sizeof(TPoint)); TInt numPnts = Window().RetrievePointerMoveBuffer(ptr); - - for (int i = 0; i < numPnts; i++) { + int i = 0; + if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) { + if (numPnts > 20) + i = numPnts - 20; + } + for (; i < numPnts; i++) { TPointerEvent pe; pe.iType = TPointerEvent::EDrag; pe.iPosition = m_ptrbuffer[i]; @@ -1703,9 +1755,12 @@ { if (name == "navigation") { if (value == "tabbed") { - m_brctl->settings()->setTabbedNavigation(true); + m_brctl->settings()->setNavigationType(SettingsContainer::NavigationTypeTabbed); StaticObjectsContainer::instance()->webCursor()->cursorUpdate(true); } + else if (value == "none") { + m_brctl->settings()->setNavigationType(SettingsContainer::NavigationTypeNone); + } } } @@ -1884,7 +1939,7 @@ //------------------------------------------------------------------------------- void WebView::resetZoomLevel(void) { - if( m_widgetextension && m_widgetextension->IsWidgetPublising()) { + if( m_widgetextension ) { return ; } if (m_historyLoad) { @@ -1962,8 +2017,10 @@ { m_minZoomLevel = newMinZoomLevel; if (m_pageZoomHandler->isActive()) { + TRAP_IGNORE( m_pageZoomHandler->hideZoomSliderL(); m_pageZoomHandler->showZoomSliderL(); + ); } else { UpdateZoomArray(); //for non-touch @@ -2097,25 +2154,25 @@ // Double Tap Zooming: it toggles between default, maxiZoomLevel. // Depending on the current zoom level: - // A. If the current is already the max, it zooms to the max + // A. If the current is already the max, it zooms to the max // B. If the current is bigger than/equal to the default zoom level zooms to the default, it zooms to the max - // C. Otherwise it zooms to the default level first. + // C. Otherwise it zooms to the default level first. // For the mobile pages, such as google.com and cnn.com, minimum zoom level equals // to the default zoom level. Zooming is only possible between default and maximum // zoom level, double tap only won't reach logic C // - // For both mobile and non-mobile pages, it creates the same end user double tap - // experiences - + // For both mobile and non-mobile pages, it creates the same end user double tap + // experiences + if (m_currentZoomLevel == m_maxZoomLevel ) { - zoomLevel = KZoomLevelDefaultValue; + zoomLevel = KZoomLevelDefaultValue; } else if (m_currentZoomLevel >= KZoomLevelDefaultValue ) { zoomLevel = m_maxZoomLevel; - } + } else { - zoomLevel = KZoomLevelDefaultValue; - } + zoomLevel = KZoomLevelDefaultValue; + } // move the content WebFrameView* view = mainFrame()->frameView(); @@ -2139,11 +2196,11 @@ } //------------------------------------------------------------------------------- -// WebView::openPluginPlayer +// WebView::openPluginPlayerL // Called when user clicks a plugin which is able to accept user input, // this feature is only used in US build //------------------------------------------------------------------------------- -void WebView::openPluginPlayer(PluginWin* plugin) +void WebView::openPluginPlayerL(PluginWin* plugin) { if (!m_pluginplayer) { PluginSkin* pluginskin = mainFrame()->focusedPlugin(); @@ -2194,6 +2251,8 @@ #endif } + //Widgets dont need memory cache for dead objects. hence set it to 0 + cache()->setCapacities(0, 0, 0); return m_widgetextension; } @@ -2327,7 +2386,7 @@ } //------------------------------------------------------------------------------- -// WebView::notifyFullscreenModeChangeL +// WebView::nootifyFullscreenModeChangeL //------------------------------------------------------------------------------- void WebView::notifyFullscreenModeChangeL(bool mode) { @@ -2389,32 +2448,6 @@ void WebView::setRedirectWithLockedHistory(bool value) { m_redirectWithLockedHistory = value; } -//------------------------------------------------------------------------------- -// WebView::notifyPlugins -// Webview notifies plugins to handle play/pause of .swf files when user switches to menu/another application -//------------------------------------------------------------------------------- -void WebView::notifyPlugins(TBool focus) -{ - Frame* coreFrame =core(mainFrame()); - MWebCoreObjectWidget* view = NULL; - for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame)) { - PassRefPtr objects = frame->document()->objects(); - for (Node* n = objects->firstItem(); n; n = objects->nextItem()) { - view = widget(n); - if (view) { - static_cast(view)->handlePluginForeground(focus); - } - } - - PassRefPtr embeds = frame->document()->embeds(); - for (Node* n = embeds->firstItem(); n; n = embeds->nextItem()) { - view = widget(n); - if (view) { - static_cast(view)->handlePluginForeground(focus); - } - } - } -} void WebView::setFastScrollingMode(bool fastScrolling) @@ -2519,4 +2552,56 @@ StaticObjectsContainer::instance()->webCursor()->setCursorVisible(showCursor); } +void WebView::focusedElementChanged(Element* element) +{ + Frame* frame = element->document()->frame(); + WebFrameView* fv = kit(frame)->frameView(); + if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed || m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) { + if (!element || !element->document() ||!element->renderer()) return; + if (element->hasTagName(textareaTag) || (element->hasTagName(inputTag) && (reinterpret_cast(element))->isTextField())) { + TPoint point = TRect(element->getRect()).iTl; + point = fv->frameCoordsInViewCoords(point); + StaticObjectsContainer::instance()->webCursor()->setPosition(point); + TPointerEvent event; + event.iPosition = StaticObjectsContainer::instance()->webCursor()->position(); + event.iModifiers = 0; + event.iType = TPointerEvent::EMove; + core(mainFrame())->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event)); + + } + else { + int x, y; + element->renderer()->absolutePosition(x, y); + Vector rects; + element->renderer()->absoluteRects(rects, x, y); + TPoint point; + if (rects.size() > 0) { + point = TPoint(rects[0].x(), rects[0].y()); + point = fv->frameCoordsInViewCoords(point); + StaticObjectsContainer::instance()->webCursor()->setPosition(point); + TPointerEvent event; + event.iPosition = StaticObjectsContainer::instance()->webCursor()->position(); + event.iModifiers = 0; + event.iType = TPointerEvent::EMove; + core(mainFrame())->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event)); + } + } + + if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed) { + m_tabbedNavigation->focusedElementChanged(element); + } + // onload event on the first page could happen before the view becomes visible + m_savedCursorPosition = StaticObjectsContainer::instance()->webCursor()->position(); + m_focusedElementType = nodeTypeB(element, frame); + } +} + +void WebView::windowObjectCleared() const +{ + if (m_widgetextension) { + WebView* that = const_cast(this); + that->m_widgetextension->windowObjectCleared(); + } +} + // END OF FILE