webengine/osswebengine/WebKit/s60/webview/WebView.cpp
changeset 11 c8a366e56285
parent 10 a359256acfc6
child 15 60c5402cb945
equal deleted inserted replaced
10:a359256acfc6 11:c8a366e56285
    96 #include "PlatformFontCache.h"
    96 #include "PlatformFontCache.h"
    97 #include "WebPageFullScreenHandler.h"
    97 #include "WebPageFullScreenHandler.h"
    98 #include "eikon.hrh"
    98 #include "eikon.hrh"
    99 #include "WebScrollbarDrawer.h"
    99 #include "WebScrollbarDrawer.h"
   100 #include "EventNames.h"
   100 #include "EventNames.h"
       
   101 #include "Editor.h"
   101 
   102 
   102 using namespace WebCore;
   103 using namespace WebCore;
   103 using namespace EventNames;
   104 using namespace EventNames;
   104 
   105 
   105 const int KRepaintDelayLoading = 500*1000; // dont do repaints more often than this during loading (0.5s)
   106 const int KRepaintDelayLoading = 500*1000; // dont do repaints more often than this during loading (0.5s)
   580             f->view()->layout();
   581             f->view()->layout();
   581             f = f->tree()->traverseNext();
   582             f = f->tree()->traverseNext();
   582         }
   583         }
   583         layoutPending = false;
   584         layoutPending = false;
   584     }
   585     }
   585     
   586 
   586     if ( !layoutPending || !isLoading()) {
   587     if ( !layoutPending || !isLoading()) {
   587         bool needsDraw = false;
   588         bool needsDraw = false;
   588         m_repaints.Tidy();
   589         m_repaints.Tidy();
   589         for (int i=0; i<m_repaints.Count(); ++i) {
   590         for (int i=0; i<m_repaints.Count(); ++i) {
   590             TRect r = m_repaints[i];
   591             TRect r = m_repaints[i];
   860     // exit input on up/down key
   861     // exit input on up/down key
   861     // EXCEPT on touch-enabled devices. We'll just consume in that case
   862     // EXCEPT on touch-enabled devices. We'll just consume in that case
   862     if ( !consumed && isNaviKey(keyevent) ) {
   863     if ( !consumed && isNaviKey(keyevent) ) {
   863         if (m_webfeptexteditor->validateTextFormat() ) {
   864         if (m_webfeptexteditor->validateTextFormat() ) {
   864             setFocusNone();
   865             setFocusNone();
   865         } 
   866         }
   866         else {
   867         else {
   867             consumed = true;
   868             consumed = true;
   868         }
   869         }
   869     }
   870     }
   870     
   871 
   871     return consumed;
   872     return consumed;
   872 }
   873 }
   873 
   874 
   874 
   875 
   875 bool WebView::handleEventKeyDown(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
   876 bool WebView::handleEventKeyDown(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
   877     m_currentEventKey = keyevent;
   878     m_currentEventKey = keyevent;
   878     m_currentEventCode = eventcode;
   879     m_currentEventCode = eventcode;
   879     return false; // not consumed
   880     return false; // not consumed
   880 }
   881 }
   881 
   882 
       
   883 
       
   884 void WebView::sendMouseEventToEngineIfNeeded(TPointerEvent::TType eventType, TPoint pos, Frame* frame)
       
   885 {
       
   886     if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeTabbed &&
       
   887         (m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsCursorShowMode) == TBrCtlDefs::ENoCursor))
       
   888         {
       
   889         return;
       
   890         }
       
   891 
       
   892 	sendMouseEventToEngine(eventType, pos, frame);
       
   893 }
   882 
   894 
   883 void WebView::sendMouseEventToEngine(TPointerEvent::TType eventType, TPoint pos, Frame* frame)
   895 void WebView::sendMouseEventToEngine(TPointerEvent::TType eventType, TPoint pos, Frame* frame)
   884 {
   896 {
   885     TPointerEvent event;
   897     TPointerEvent event;
   886     event.iPosition = pos;
   898     event.iPosition = pos;
   887     event.iModifiers = 0;
   899     event.iModifiers = 0;
   888     event.iType = eventType;
   900     event.iType = eventType;
   889     
   901 
   890     switch (eventType) {
   902     switch (eventType) {
   891         case TPointerEvent::EButton1Down:
   903         case TPointerEvent::EButton1Down:
   892         {
   904         {
   893             frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event));
   905             frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event));
   894             break;
   906             break;
   895         }
   907         }
   896     
   908 
   897         case TPointerEvent::EButton1Up: 
   909         case TPointerEvent::EButton1Up:
   898         {
   910         {
   899             frame->eventHandler()->handleMouseReleaseEvent(PlatformMouseEvent(event));
   911             frame->eventHandler()->handleMouseReleaseEvent(PlatformMouseEvent(event));
   900             break;
   912             break;
   901         }
   913         }
   902         
   914 
   903         case TPointerEvent::EMove:
   915         case TPointerEvent::EMove:
   904         {
   916         {
   905             frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event)); 
   917             frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event));
   906             break;
   918             break;
   907         }
   919         }
   908     };
   920     };
   909 }
   921 }
   910 
   922 
   917             page()->focusController()->setFocusedNode(n, frame);
   929             page()->focusController()->setFocusedNode(n, frame);
   918         }
   930         }
   919     }
   931     }
   920 }
   932 }
   921 
   933 
   922 bool WebView::needDeactivateEditable(const TKeyEvent& keyevent, TEventCode eventcode)
   934 bool WebView::needDeactivateEditable(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
   923 {
   935 {
   924     bool upOrDown = ((keyevent.iCode == EKeyDevice3) ||
   936     bool upOrDown = ((keyevent.iCode == EKeyUpArrow) ||
   925                     (keyevent.iCode == EKeyUpArrow) ||
       
   926                     (keyevent.iCode == EStdKeyUpArrow) ||
   937                     (keyevent.iCode == EStdKeyUpArrow) ||
   927                     (keyevent.iCode == EKeyRightUpArrow) ||
   938                     (keyevent.iCode == EKeyRightUpArrow) ||
   928                     (keyevent.iCode == EKeyDownArrow) ||
   939                     (keyevent.iCode == EKeyDownArrow) ||
   929                     (keyevent.iCode == EStdKeyDownArrow) ||
   940                     (keyevent.iCode == EStdKeyDownArrow) ||
   930                     (keyevent.iCode == EKeyLeftDownArrow));
   941                     (keyevent.iCode == EKeyLeftDownArrow));
       
   942     bool shouldEndEditing = frame->editor()->client()->shouldEndEditing(NULL);
   931     bool inEditState  = (m_isEditable && (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox));
   943     bool inEditState  = (m_isEditable && (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox));
   932     bool isSelectBoxActive = (m_focusedElementType == TBrCtlDefs::EElementSelectBox);
   944     bool isSelectBoxActive = (m_focusedElementType == TBrCtlDefs::EElementSelectBox);
   933     bool deactivateInputBox = (inEditState && upOrDown);
   945     bool deactivateInputBox = (inEditState && upOrDown && m_webfeptexteditor->validateTextFormat());
   934     bool deactivateSelectBox = (isSelectBoxActive && isNaviKey(keyevent));
   946     bool deactivateSelectBox = (isSelectBoxActive && isNaviKey(keyevent));
   935 
   947 
   936     return deactivateInputBox || deactivateSelectBox; 
   948     bool deactivateEditable = (m_isEditable && shouldEndEditing && m_webfeptexteditor->validateTextFormat());
       
   949     return deactivateEditable || deactivateSelectBox; 
   937 }
   950 }
   938 
   951 
   939 
   952 
   940 bool WebView::deactivateEditable()
   953 bool WebView::deactivateEditable()
   941 {
   954 {
       
   955     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
       
   956     Frame* frame = page()->focusController()->focusedOrMainFrame();
       
   957     SelectionController* sc = frame->selectionController();
       
   958     TRect rect = sc->caretRect().Rect();
       
   959     TPoint pos = kit(frame)->frameView()->frameCoordsInViewCoords(rect.iBr);
       
   960     cursor->setPosition(pos);
   942     setFocusNone();
   961     setFocusNone();
   943     m_prevEditMode = true;
   962     m_prevEditMode = true;
   944     setEditable( EFalse );
   963     setEditable( EFalse );
   945     return true;
   964     return true;
   946 }
   965 }
   947 
   966 
   948 bool WebView::handleEventKeyL(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
   967 bool WebView::handleEventKeyL(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
   949 {
   968 {
   950     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
       
   951     bool consumed = false;
   969     bool consumed = false;
   952     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
   970     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
   953     bool navigationNone = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone); 
   971     bool navigationNone = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone);
   954     TKeyEvent oldKeyEvent(m_currentEventKey);
   972     TKeyEvent oldKeyEvent(m_currentEventKey);
   955     oldKeyEvent.iCode = keyevent.iCode; 
   973     oldKeyEvent.iCode = keyevent.iCode;
   956     TEventCode oldKeyCode = m_currentEventCode;
   974     TEventCode oldKeyCode = m_currentEventCode;
   957     bool downEventConsumed = false;
       
   958     m_currentEventKey = keyevent;
   975     m_currentEventKey = keyevent;
   959     m_currentEventCode = eventcode;
   976     m_currentEventCode = eventcode;
   960 
   977 
   961     if (navigationNone) {
   978     if (navigationNone) {
   962         consumed = handleInputElement(keyevent, eventcode, frame);
   979         if (oldKeyCode == EEventKeyDown) {
   963         if (!consumed)
   980             consumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
   964             consumed = sendKeyEventToEngine(keyevent, eventcode, frame);
   981         }
   965     }
   982     }
   966     else {
   983     else {
   967         if (needDeactivateEditable(keyevent, eventcode)) {
   984         if (keyevent.iCode == EKeyDevice3) { //selection key (MSK)
   968             consumed = deactivateEditable();
       
   969             handleKeyNavigation(keyevent, eventcode, frame);
       
   970         }
       
   971         else if (keyevent.iCode == EKeyDevice3) {
       
   972             sendMouseEventToEngine(TPointerEvent::EButton1Down,
       
   973                                    cursor->position(), frame);
       
   974                 // mimic ccb's behavior of onFocus
   985                 // mimic ccb's behavior of onFocus
   975             setFocusedNode(frame);
   986            consumed = handleMSK(keyevent, oldKeyCode, frame);
   976             if (oldKeyCode == EEventKeyDown && 
   987 
   977                 (m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox)){
       
   978                 sendKeyEventToEngine(oldKeyEvent, EEventKeyDown, frame);
       
   979             }
       
   980            
       
   981            // Toolbar is activated on long key press only if the element
   988            // Toolbar is activated on long key press only if the element
   982            // type is EElementNone during EEventKeyDown and EEventKey.
   989            // type is EElementNone during EEventKeyDown and EEventKey.
   983            // This prevents toolbar from popping up in DHTML pages. Also,
   990            // This prevents toolbar from popping up in DHTML pages. Also,
   984            // toolbar is activated when the user is not in fast scroll
   991            // toolbar is activated when the user is not in fast scroll
   985            // mode, or in page overview mode, or on wml page.
   992            // mode, or in page overview mode, or on wml page.
   986            if ( ( m_focusedElementType == TBrCtlDefs::EElementNone ||
   993         }
   987                   m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) &&
       
   988                   keyevent.iRepeats && !m_brctl->wmlMode() ) {
       
   989                launchToolBarL();
       
   990            }
       
   991            consumed = true;
       
   992         } 
       
   993         else if (isNaviKey(keyevent)) {
   994         else if (isNaviKey(keyevent)) {
   994             consumed = handleNaviKeyEvent(oldKeyEvent, oldKeyCode, frame);
   995             consumed = handleNaviKeyEvent(keyevent, oldKeyCode, frame);
   995         } // if (m_brctl->settings()->getNavigationType()
   996         } // if (m_brctl->settings()->getNavigationType()
   996         else { // Not an arrow key..
   997         else { // Not an arrow key..
   997                  // activate hovered input element by just start typing
   998                  // activate hovered input element by just start typing
   998             consumed = !m_isEditable && handleInputElement(keyevent, eventcode, frame);
   999             consumed = !m_isEditable && handleInputElement(keyevent, eventcode, frame);
   999         }
  1000         }
  1002         }
  1003         }
  1003     }
  1004     }
  1004     return consumed;
  1005     return consumed;
  1005 }
  1006 }
  1006 
  1007 
  1007 bool WebView::handleNaviKeyEvent(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)  
  1008 bool WebView::handleMSK(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
       
  1009 {
       
  1010     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
       
  1011     bool prevEditableState = m_isEditable;
       
  1012     if (m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox ) {
       
  1013         sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down,
       
  1014                                cursor->position(), frame);
       
  1015     }
       
  1016     setFocusedNode(frame);
       
  1017     bool textAreaJustActivated = (!prevEditableState && m_isEditable &&
       
  1018                                   m_focusedElementType == TBrCtlDefs::EElementTextAreaBox);
       
  1019     if (eventcode == EEventKeyDown && 
       
  1020         m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox &&
       
  1021         !textAreaJustActivated) {
       
  1022         sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
       
  1023     }
       
  1024      if ((m_focusedElementType == TBrCtlDefs::EElementNone ||
       
  1025           m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) &&
       
  1026           keyevent.iRepeats && !m_brctl->wmlMode() ) {
       
  1027          launchToolBarL();
       
  1028      }
       
  1029      return true;
       
  1030 }
       
  1031 bool WebView::handleNaviKeyEvent(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
  1008 {
  1032 {
  1009     bool downEventConsumed = false;
  1033     bool downEventConsumed = false;
  1010     bool consumed = false;
  1034     bool consumed = false;
  1011     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
  1035     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
  1012     /*
  1036     /*
  1013      * For each platform keyDown event EventHandler::keEvent() generates 
  1037      * For each platform keyDown event EventHandler::keEvent() generates
  1014      * keydown and keypress.
  1038      * keydown and keypress.
  1015      * For keypress event we need a char code and since we don't 
  1039      * For keypress event we need a char code and since we don't
  1016      * have it at the time of EEventKeyDown we pospond it until EEventKey 
  1040      * have it at the time of EEventKeyDown we pospond it until EEventKey
  1017      * and send it here.
  1041      * and send it here.
  1018      */
  1042      */
  1019     if (eventcode == EEventKeyDown){
  1043     if (eventcode == EEventKeyDown){
  1020         downEventConsumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
  1044         downEventConsumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
  1021     }
  1045     }
  1022 
  1046 
  1023     if (m_isEditable && !downEventConsumed && m_webfeptexteditor->validateTextFormat()) {
  1047     if (!downEventConsumed && needDeactivateEditable(keyevent, eventcode, frame)) {
  1024         setFocusNone();
  1048         deactivateEditable();
  1025     }
  1049     }
  1026 
  1050 
  1027     if (tabbedNavigation) {
  1051     if (tabbedNavigation) {
  1028         consumed = downEventConsumed || handleTabbedNavigation(m_currentEventKey, m_currentEventCode);
  1052         consumed = downEventConsumed || handleTabbedNavigation(m_currentEventKey, m_currentEventCode);
  1029     }
  1053     }
  1030     else {  
  1054     else {
  1031         consumed = (!m_isEditable &&  //avoid showing the cursor when we are in the input box 
  1055         consumed = (!m_isEditable &&  //avoid showing the cursor when we are in the input box
  1032                     handleKeyNavigation(keyevent, eventcode, frame)) ||
  1056                     handleKeyNavigation(keyevent, eventcode, frame)) ||
  1033                     downEventConsumed;
  1057                     downEventConsumed;
  1034     }
  1058     }
  1035     return consumed;
  1059     return consumed;
  1036 }
  1060 }
  1038 
  1062 
  1039 bool WebView::handleInputElement(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
  1063 bool WebView::handleInputElement(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
  1040 {
  1064 {
  1041     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
  1065     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
  1042     bool sendMousedEvent = false;
  1066     bool sendMousedEvent = false;
  1043     if (m_focusedElementType == TBrCtlDefs::EElementInputBox || 
  1067     if (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
  1044         m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) {
  1068         m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) {
  1045         sendMousedEvent = true;
  1069         sendMousedEvent = true;
  1046     }
  1070     }
  1047     else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox ||
  1071     else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox ||
  1048         m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) {
  1072         m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) {
  1049         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone || 
  1073         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone ||
  1050             keyevent.iCode == EKeyDevice3) {
  1074             keyevent.iCode == EKeyDevice3) {
  1051             sendMousedEvent = true;
  1075             sendMousedEvent = true;
  1052         }
  1076         }
  1053     }
  1077     }
  1054     if (sendMousedEvent) {
  1078     if (sendMousedEvent) {
  1055         sendMouseEventToEngine(TPointerEvent::EButton1Down, cursor->position(), frame);
  1079         sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down, cursor->position(), frame);
  1056         sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame);
  1080         sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame);
  1057 
  1081 
  1058         if (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
  1082         if (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
  1059             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox || 
  1083             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox ||
  1060             m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox) {
  1084             m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox) {
  1061             if (!m_fepTimer) {
  1085             if (!m_fepTimer) {
  1062                 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired);
  1086                 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired);
  1063             }
  1087             }
  1064 
  1088 
  1086     }
  1110     }
  1087 
  1111 
  1088     if(!pageView()) {
  1112     if(!pageView()) {
  1089        m_savedPosition = mainFrame()->frameView()->contentPos();
  1113        m_savedPosition = mainFrame()->frameView()->contentPos();
  1090     }
  1114     }
  1091 
  1115     // simple scrolling if no cursor mode
  1092     cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll);
  1116     if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeTabbed &&
       
  1117             (m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsCursorShowMode) == TBrCtlDefs::ENoCursor)){
       
  1118         setFocusNone();
       
  1119         cursor->simpleScroll(keyevent.iCode, m_scrollingSpeed);
       
  1120     }
       
  1121     else{
       
  1122         cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll);
       
  1123     }
  1093     updateScrollbars();
  1124     updateScrollbars();
  1094     if (!fastscroll) {
  1125     if (!fastscroll) {
  1095         m_fastScrollTimer->Start(KCursorInitialDelay,KCursorUpdateFrquency,TCallBack(&scrollTimerCb,this));
  1126         m_fastScrollTimer->Start(KCursorInitialDelay,KCursorUpdateFrquency,TCallBack(&scrollTimerCb,this));
  1096         m_scrollingStartTime.HomeTime();
  1127         m_scrollingStartTime.HomeTime();
  1097     }
  1128     }
  1098 
  1129 
  1099     // and minimap comes on
  1130     // and minimap comes on
  1100     consumed = handleMinimapNavigation();
  1131     consumed = handleMinimapNavigation();
  1101 
  1132 
  1102     if (!fastscroll) {
  1133     if (!fastscroll) {
  1103         sendMouseEventToEngine(TPointerEvent::EMove, cursor->position(), frame);
  1134         sendMouseEventToEngineIfNeeded(TPointerEvent::EMove, cursor->position(), frame);
  1104     }
  1135     }
  1105     
  1136 
  1106     consumed = true;
  1137     consumed = true;
  1107     return consumed;
  1138     return consumed;
  1108 }
  1139 }
  1109 
  1140 
  1110 
  1141 
  1111 bool WebView::handleMinimapNavigation()
  1142 bool WebView::handleMinimapNavigation()
  1112 {
  1143 {
  1113     int scrollingTime = millisecondsScrolled();
  1144     int scrollingTime = millisecondsScrolled();
  1114     if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled && 
  1145     if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled &&
  1115           m_pageScaler && !isSmallPage() &&
  1146           m_pageScaler && !isSmallPage() &&
  1116           m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsPageOverview) &&
  1147           m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsPageOverview) &&
  1117          (scrollingTime > KPanningPageScalerStart || m_pageScaler->Visible())) {
  1148          (scrollingTime > KPanningPageScalerStart || m_pageScaler->Visible())) {
  1118         m_pageScaler->SetVisibleUntil(KScalerVisibilityTime);
  1149         m_pageScaler->SetVisibleUntil(KScalerVisibilityTime);
  1119     }
  1150     }
  1180 bool WebView::handleEventKeyUp(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
  1211 bool WebView::handleEventKeyUp(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
  1181 {
  1212 {
  1182     bool consumed = false;
  1213     bool consumed = false;
  1183     TInt delay = 2 * KCursorInitialDelay;
  1214     TInt delay = 2 * KCursorInitialDelay;
  1184     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
  1215     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
  1185     
  1216 
  1186     m_fastScrollTimer->Cancel();
  1217     m_fastScrollTimer->Cancel();
  1187     m_scrollingSpeed = KNormalScrollRange*100/scalingFactor();
  1218     m_scrollingSpeed = KNormalScrollRange*100/scalingFactor();
  1188 
  1219 
  1189     if (viewIsFastScrolling()) {
  1220     if (viewIsFastScrolling()) {
  1190         setViewIsFastScrolling(false);
  1221         setViewIsFastScrolling(false);
  1191         sendMouseEventToEngine(TPointerEvent::EMove, cursor->position(), frame);
  1222         sendMouseEventToEngineIfNeeded(TPointerEvent::EMove, cursor->position(), frame);
  1192         toggleRepaintTimer(true);
  1223         toggleRepaintTimer(true);
  1193         if (!inPageViewMode()) {
  1224         if (!inPageViewMode()) {
  1194             delay = 0;
  1225             delay = 0;
  1195         }
  1226         }
  1196     }
  1227     }
  1200     TEventCode eventCodeUp = eventcode;
  1231     TEventCode eventCodeUp = eventcode;
  1201     TEventCode eventCodeDown = EEventKeyDown;
  1232     TEventCode eventCodeDown = EEventKeyDown;
  1202     //If we adjusted iCode we have to reset it to 0 after we
  1233     //If we adjusted iCode we have to reset it to 0 after we
  1203     //create PlatformKeyEventSymbian when we send the key event.
  1234     //create PlatformKeyEventSymbian when we send the key event.
  1204     //Otherwise the character will be drawn twice - by fep editor and by
  1235     //Otherwise the character will be drawn twice - by fep editor and by
  1205     //WebEditorClient. These two custom eventcodes serves as indicator that 
  1236     //WebEditorClient. These two custom eventcodes serves as indicator that
  1206     //PlatformKeyEventSymbian::m_symbianEvent.iCode nee to be reset to 0.
  1237     //PlatformKeyEventSymbian::m_symbianEvent.iCode nee to be reset to 0.
  1207     if (correctedKeyEvent.iCode != m_currentEventKey.iCode) {
  1238     if (correctedKeyEvent.iCode != m_currentEventKey.iCode) {
  1208         eventCodeDown = (TEventCode)(EEventUser + 1);
  1239         eventCodeDown = (TEventCode)(EEventUser + 1);
  1209         eventCodeUp = (TEventCode)(EEventUser + 2);    
  1240         eventCodeUp = (TEventCode)(EEventUser + 2);
  1210     }
  1241     }
  1211     
  1242 
  1212     if ( (keyevent.iScanCode == EStdKeyDevice3) ||
  1243     if ( (keyevent.iScanCode == EStdKeyDevice3) ||
  1213        (keyevent.iScanCode == EStdKeyEnter) ) {
  1244        (keyevent.iScanCode == EStdKeyEnter) ) {
  1214        // pass it to webcore
  1245        // pass it to webcore
  1215 
  1246 
  1216         if (( m_focusedElementType == TBrCtlDefs::EElementInputBox ||
  1247         if (( m_focusedElementType == TBrCtlDefs::EElementInputBox ||
  1217             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) && 
  1248             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) &&
  1218             m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed ) {
  1249             m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed ) {
  1219             if (!m_prevEditMode) {
  1250             if (!m_prevEditMode) {
  1220                 setEditable(true);
  1251                 setEditable(true);
  1221             }
  1252             }
  1222             else {
  1253             else {
  1223                 m_prevEditMode = false;
  1254                 m_prevEditMode = false;
  1224             }
  1255             }
  1225         }
  1256         }
  1226         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) {
  1257         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) {
  1227             if (!sendKeyEventToEngine(correctedKeyEvent, eventcode, frame)) {
  1258             if (!sendKeyEventToEngine(correctedKeyEvent, eventcode, frame)) {
  1228                 sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame);
  1259                 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame);
  1229             }
  1260             }
  1230             consumed = true;
  1261             consumed = true;
  1231         }
  1262         }
  1232     }
  1263     }
  1233 
  1264 
  1245 
  1276 
  1246 TUint WebView::correctKeyCode()
  1277 TUint WebView::correctKeyCode()
  1247 {
  1278 {
  1248     TUint code = m_currentEventKey.iCode;
  1279     TUint code = m_currentEventKey.iCode;
  1249     // if fep editor was invoked then it consume TKeyEvent and as
  1280     // if fep editor was invoked then it consume TKeyEvent and as
  1250     // result we have KeyEvent.iCode == 0. So we assume here that 
  1281     // result we have KeyEvent.iCode == 0. So we assume here that
  1251     // if element is editable and no iCode in KeyEvent then fep editor
  1282     // if element is editable and no iCode in KeyEvent then fep editor
  1252     // already put the right character into the input area and we can get 
  1283     // already put the right character into the input area and we can get
  1253     // the correct iCode from the last entered char. 
  1284     // the correct iCode from the last entered char.
  1254     if (m_isEditable && !m_currentEventKey.iCode && m_webfeptexteditor) {
  1285     if (m_isEditable && !m_currentEventKey.iCode && m_webfeptexteditor) {
  1255         TInt len = m_webfeptexteditor->DocumentLengthForFep();
  1286         TInt len = m_webfeptexteditor->DocumentLengthForFep();
  1256         if (len > 0) {
  1287         if (len > 0) {
  1257             TBuf<2> data;
  1288             TBuf<2> data;
  1258             m_webfeptexteditor->GetEditorContentForFep(data, len - 1, 1);
  1289             m_webfeptexteditor->GetEditorContentForFep(data, len - 1, 1);
  1259             if (data.Length() > 0) {
  1290             if (data.Length() > 0) {
  1260                 code = data[0];
  1291                 code = data[0];
  1261             }
  1292             }
  1262         }
  1293         }
  1263     }
  1294     }
  1264     
  1295 
  1265     return code;
  1296     return code;
  1266 }
  1297 }
  1267 
  1298 
  1268 bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent,
  1299 bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent,
  1269                                    TEventCode eventcode, Frame* frame)
  1300                                    TEventCode eventcode, Frame* frame)
  1270 {
  1301 {
  1271     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
  1302     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
  1272     Node* targetNode = frame->document()->focusedNode();
  1303     Node* targetNode = frame->document()->focusedNode();
  1273     bool hasOnKeyDown = false;
  1304     if (!m_isEditable) {
  1274     bool hasOnKeyUp = false;
  1305 
  1275     bool hasOnKeyPress = false;    
  1306 
  1276     
  1307 
  1277     for (Node* n = targetNode; n; n = n->parentNode()) {
       
  1278         EventTargetNode* tnode = static_cast<EventTargetNode*>(n);
       
  1279         hasOnKeyDown = tnode->getHTMLEventListener(keydownEvent);
       
  1280         hasOnKeyUp = tnode->getHTMLEventListener(keyupEvent);
       
  1281         hasOnKeyPress = tnode->getHTMLEventListener(keypressEvent);
       
  1282         if (hasOnKeyDown || hasOnKeyUp || hasOnKeyPress) {
       
  1283             break;
       
  1284         }
       
  1285     }
       
  1286     
       
  1287     
       
  1288     if (!m_isEditable && !(hasOnKeyDown || hasOnKeyUp || hasOnKeyPress)) {
       
  1289         frame->document()->setFocusedNode(NULL);
  1308         frame->document()->setFocusedNode(NULL);
  1290     }
  1309     }
  1291     bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode));
  1310     bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode));
  1292     frame->document()->setFocusedNode(targetNode);
  1311     frame->document()->setFocusedNode(targetNode);
  1293 
  1312 
  1294     if (!consumed && eventcode == EEventKey &&
  1313     if (!consumed && eventcode == EEventKey &&
  1295         (m_brctl->capabilities() & TBrCtlDefs::ECapabilityAccessKeys)) {
  1314         (m_brctl->capabilities() & TBrCtlDefs::ECapabilityAccessKeys)) {
  1296         TKeyEvent ke = keyevent;
  1315         TKeyEvent ke = keyevent;
  1297         TChar c(ke.iCode);
  1316         TChar c(ke.iCode);
  1298         // Not consumed by WebCore, is alphanumeric and does not have any modifier
  1317         // Not consumed by WebCore, is alphanumeric and does not have any modifier
  1299         if (c.IsAlphaDigit() && 
  1318         if (c.IsAlphaDigit() &&
  1300             !(ke.iModifiers & (EModifierCtrl | EModifierAlt | EModifierShift))) {
  1319             !(ke.iModifiers & (EModifierCtrl | EModifierAlt | EModifierShift))) {
  1301             ke.iModifiers = EModifierCtrl;
  1320             ke.iModifiers = EModifierCtrl;
  1302             frame->eventHandler()->keyEvent(PlatformKeyboardEvent(ke,EEventKeyDown));
  1321             frame->eventHandler()->keyEvent(PlatformKeyboardEvent(ke,EEventKeyDown));
  1303             consumed = true;
  1322             consumed = true;
  1304         }
  1323         }
  1564 
  1583 
  1565     Node* focusedNode = NULL;
  1584     Node* focusedNode = NULL;
  1566     Frame* focusedFrame = page()->focusController()->focusedFrame();
  1585     Frame* focusedFrame = page()->focusController()->focusedFrame();
  1567 
  1586 
  1568     if (editable && focusedFrame) {
  1587     if (editable && focusedFrame) {
       
  1588         if (!AknLayoutUtils::PenEnabled())
       
  1589             notifyFullscreenModeChangeL(EFalse);
  1569         m_webfeptexteditor->UpdateEditingMode();
  1590         m_webfeptexteditor->UpdateEditingMode();
  1570         focusedNode = focusedFrame->document()->focusedNode();
  1591         focusedNode = focusedFrame->document()->focusedNode();
  1571     }
  1592     }
  1572     else {
  1593     else {
       
  1594         if (!AknLayoutUtils::PenEnabled())
       
  1595             notifyFullscreenModeChangeL(ETrue);
  1573         m_webfeptexteditor->CancelEditingMode();
  1596         m_webfeptexteditor->CancelEditingMode();
  1574     }
  1597     }
  1575 
  1598 
  1576     WebCursor* c = StaticObjectsContainer::instance()->webCursor();
  1599     WebCursor* c = StaticObjectsContainer::instance()->webCursor();
  1577     //
  1600     //
  1615         m_webFormFill->updatePopupView();
  1638         m_webFormFill->updatePopupView();
  1616     }
  1639     }
  1617     if (m_pageFullScreenHandler) {
  1640     if (m_pageFullScreenHandler) {
  1618         m_pageFullScreenHandler->SizeChanged();
  1641         m_pageFullScreenHandler->SizeChanged();
  1619     }
  1642     }
  1620     
  1643 
  1621     if (m_pageScrollHandler) {
  1644     if (m_pageScrollHandler) {
  1622         m_pageScrollHandler->scrollbarDrawer()->redrawScrollbar();
  1645         m_pageScrollHandler->scrollbarDrawer()->redrawScrollbar();
  1623     }
  1646     }
  1624     
  1647 
       
  1648     if (m_toolbar && m_toolbarinterface) {
       
  1649         m_toolbar->AnimateToolBarClosing(EFalse);
       
  1650         closeToolBarL();
       
  1651         launchToolBarL();
       
  1652     }
       
  1653 
  1625 }
  1654 }
  1626 
  1655 
  1627 TSize WebView::maxBidiSize() const
  1656 TSize WebView::maxBidiSize() const
  1628 {
  1657 {
  1629     return TSize((Rect().Size().iWidth-20),(Rect().Size().iHeight-20));
  1658     return TSize((Rect().Size().iWidth-20),(Rect().Size().iHeight-20));
  1667             r = mainFrame()->frameView()->toDocCoords(r);
  1696             r = mainFrame()->frameView()->toDocCoords(r);
  1668             if (mainFrame()->frameView()->isScaled())
  1697             if (mainFrame()->frameView()->isScaled())
  1669                 r.Grow(1, 1);
  1698                 r.Grow(1, 1);
  1670             m_repaints.AddRect(r);
  1699             m_repaints.AddRect(r);
  1671         }
  1700         }
  1672         
  1701 
  1673         region.Close();
  1702         region.Close();
  1674     }
  1703     }
  1675     else {
  1704     else {
  1676         TRect r(to, bufSize);
  1705         TRect r(to, bufSize);
  1677         r = mainFrame()->frameView()->toDocCoords(r);
  1706         r = mainFrame()->frameView()->toDocCoords(r);
  2278 {
  2307 {
  2279     int zoomLevel = KZoomLevelDefaultValue;
  2308     int zoomLevel = KZoomLevelDefaultValue;
  2280 
  2309 
  2281   // Double Tap Zooming: it toggles between default, maxiZoomLevel.
  2310   // Double Tap Zooming: it toggles between default, maxiZoomLevel.
  2282   // Depending on the current zoom level:
  2311   // Depending on the current zoom level:
  2283   //   A. If the current is already the max, it zooms to the max 
  2312   //   A. If the current is already the max, it zooms to the max
  2284   //   B. If the current is bigger than/equal to the default zoom level zooms to the default, it zooms to the max
  2313   //   B. If the current is bigger than/equal to the default zoom level zooms to the default, it zooms to the max
  2285   //   C. Otherwise it zooms to the default level first. 
  2314   //   C. Otherwise it zooms to the default level first.
  2286   // For the mobile pages, such as google.com and cnn.com, minimum zoom level equals
  2315   // For the mobile pages, such as google.com and cnn.com, minimum zoom level equals
  2287   // to the default zoom level. Zooming is only possible between default and maximum
  2316   // to the default zoom level. Zooming is only possible between default and maximum
  2288   // zoom level, double tap only won't reach logic C
  2317   // zoom level, double tap only won't reach logic C
  2289   //
  2318   //
  2290   // For both mobile and non-mobile pages, it creates the same end user double tap 
  2319   // For both mobile and non-mobile pages, it creates the same end user double tap
  2291   // experiences 
  2320   // experiences
  2292   
  2321 
  2293     if (m_currentZoomLevel == m_maxZoomLevel ) {
  2322     if (m_currentZoomLevel == m_maxZoomLevel ) {
  2294         zoomLevel = KZoomLevelDefaultValue;    	
  2323         zoomLevel = KZoomLevelDefaultValue;
  2295     }
  2324     }
  2296     else if (m_currentZoomLevel >= KZoomLevelDefaultValue ) {
  2325     else if (m_currentZoomLevel >= KZoomLevelDefaultValue ) {
  2297         zoomLevel = m_maxZoomLevel;
  2326         zoomLevel = m_maxZoomLevel;
  2298     }	
  2327     }
  2299     else {
  2328     else {
  2300         zoomLevel = KZoomLevelDefaultValue;    	
  2329         zoomLevel = KZoomLevelDefaultValue;
  2301     } 
  2330     }
  2302 
  2331 
  2303     // move the content
  2332     // move the content
  2304     WebFrameView* view = mainFrame()->frameView();
  2333     WebFrameView* view = mainFrame()->frameView();
  2305     if (!view) return;
  2334     if (!view) return;
  2306     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
  2335     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
  2690             StaticObjectsContainer::instance()->webCursor()->setPosition(point);
  2719             StaticObjectsContainer::instance()->webCursor()->setPosition(point);
  2691             TPointerEvent event;
  2720             TPointerEvent event;
  2692             event.iPosition = StaticObjectsContainer::instance()->webCursor()->position();
  2721             event.iPosition = StaticObjectsContainer::instance()->webCursor()->position();
  2693             event.iModifiers = 0;
  2722             event.iModifiers = 0;
  2694             event.iType = TPointerEvent::EMove;
  2723             event.iType = TPointerEvent::EMove;
  2695             core(mainFrame())->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event));            
  2724             core(mainFrame())->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event));
  2696             
  2725 
  2697         }
  2726         }
  2698         else {
  2727         else {
  2699             int x, y;
  2728             int x, y;
  2700             element->renderer()->absolutePosition(x, y);
  2729             element->renderer()->absolutePosition(x, y);
  2701             Vector<IntRect> rects;
  2730             Vector<IntRect> rects;
  2707                 StaticObjectsContainer::instance()->webCursor()->setPosition(point);
  2736                 StaticObjectsContainer::instance()->webCursor()->setPosition(point);
  2708                 TPointerEvent event;
  2737                 TPointerEvent event;
  2709                 event.iPosition = StaticObjectsContainer::instance()->webCursor()->position();
  2738                 event.iPosition = StaticObjectsContainer::instance()->webCursor()->position();
  2710                 event.iModifiers = 0;
  2739                 event.iModifiers = 0;
  2711                 event.iType = TPointerEvent::EMove;
  2740                 event.iType = TPointerEvent::EMove;
  2712                 core(mainFrame())->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event));            
  2741                 core(mainFrame())->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event));
  2713             }
  2742             }
  2714         }
  2743         }
  2715 
  2744 
  2716         if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed) { 
  2745         if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed) {
  2717             m_tabbedNavigation->focusedElementChanged(element);
  2746             m_tabbedNavigation->focusedElementChanged(element);
  2718         }
  2747         }
  2719         // onload event on the first page could happen before the view becomes visible
  2748         // onload event on the first page could happen before the view becomes visible
  2720         m_savedCursorPosition = StaticObjectsContainer::instance()->webCursor()->position();
  2749         m_savedCursorPosition = StaticObjectsContainer::instance()->webCursor()->position();
  2721         m_focusedElementType = nodeTypeB(element, frame);
  2750         m_focusedElementType = nodeTypeB(element, frame);