webengine/osswebengine/WebKit/s60/webview/WebView.cpp
changeset 15 60c5402cb945
parent 11 c8a366e56285
child 25 0ed94ceaa377
equal deleted inserted replaced
11:c8a366e56285 15:60c5402cb945
   141     return kit(forward
   141     return kit(forward
   142         ? coreFrame->tree()->traverseNextWithWrap(wrapFlag)
   142         ? coreFrame->tree()->traverseNextWithWrap(wrapFlag)
   143         : coreFrame->tree()->traversePreviousWithWrap(wrapFlag));
   143         : coreFrame->tree()->traversePreviousWithWrap(wrapFlag));
   144 }
   144 }
   145 
   145 
   146 
   146 #define IS_UP_KEY(keyevent) ((keyevent.iCode == EKeyUpArrow) || (keyevent.iCode == EStdKeyUpArrow))
       
   147 #define IS_DOWN_KEY(keyevent) ((keyevent.iCode == EStdKeyDevice12) || (keyevent.iCode == EKeyDownArrow) || (keyevent.iCode == EStdKeyDownArrow))
       
   148 #define IS_RIGHT_KEY(keyevent) ((keyevent.iCode == EStdKeyDevice11) || (keyevent.iCode == EKeyRightArrow) || (keyevent.iCode == EStdKeyRightArrow))
       
   149 #define IS_LEFT_KEY(keyevent) ((keyevent.iCode == EStdKeyDevice13) || (keyevent.iCode == EKeyLeftArrow) || (keyevent.iCode == EStdKeyLeftArrow))
   147 
   150 
   148 // -----------------------------------------------------------------------------
   151 // -----------------------------------------------------------------------------
   149 // WebView::NewL
   152 // WebView::NewL
   150 // Public Class Method
   153 // Public Class Method
   151 // Two-phased constructor.
   154 // Two-phased constructor.
   194 , m_viewIsScrolling(false)
   197 , m_viewIsScrolling(false)
   195 , m_ptrbuffer(0)
   198 , m_ptrbuffer(0)
   196 , m_showCursor(false)
   199 , m_showCursor(false)
   197 , m_allowRepaints(true)
   200 , m_allowRepaints(true)
   198 , m_prevEditMode(false)
   201 , m_prevEditMode(false)
       
   202 , m_firedEvent(0)
   199 {
   203 {
   200 }
   204 }
   201 
   205 
   202 WebView::~WebView()
   206 WebView::~WebView()
   203 {
   207 {
       
   208     StaticObjectsContainer::instance()->webCursor()->stopTransparencyTimer();
       
   209 
   204     // the zoom handler is a client of WebView (also owned by
   210     // the zoom handler is a client of WebView (also owned by
   205     // WebView--a circular dependency) so it must be deleted before
   211     // WebView--a circular dependency) so it must be deleted before
   206     // the WebView object is destroyed because in its destructor it
   212     // the WebView object is destroyed because in its destructor it
   207     // operates on the WebView object
   213     // operates on the WebView object
   208     delete m_pageZoomHandler;
   214     delete m_pageZoomHandler;
   780     }
   786     }
   781     else {
   787     else {
   782         m_focusedElementType = TBrCtlDefs::EElementNone;
   788         m_focusedElementType = TBrCtlDefs::EElementNone;
   783     }
   789     }
   784     m_brctl->updateDefaultSoftkeys();
   790     m_brctl->updateDefaultSoftkeys();
       
   791     page()->chrome()->client()->setElementVisibilityChanged(false);
   785 }
   792 }
   786 
   793 
   787 void WebView::updatePageScaler()
   794 void WebView::updatePageScaler()
   788 {
   795 {
   789     if (m_brctl->capabilities() & TBrCtlDefs::ECapabilityGraphicalPage) {
   796     if (m_brctl->capabilities() & TBrCtlDefs::ECapabilityGraphicalPage) {
   896 {
   903 {
   897     TPointerEvent event;
   904     TPointerEvent event;
   898     event.iPosition = pos;
   905     event.iPosition = pos;
   899     event.iModifiers = 0;
   906     event.iModifiers = 0;
   900     event.iType = eventType;
   907     event.iType = eventType;
   901 
   908     
       
   909     setMouseEventFired();
   902     switch (eventType) {
   910     switch (eventType) {
   903         case TPointerEvent::EButton1Down:
   911         case TPointerEvent::EButton1Down:
   904         {
   912         {
   905             frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event));
   913             frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event));
   906             break;
   914             break;
   916         {
   924         {
   917             frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event));
   925             frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event));
   918             break;
   926             break;
   919         }
   927         }
   920     };
   928     };
       
   929     clearMouseEventFired();
   921 }
   930 }
   922 
   931 
   923 
   932 
   924 void WebView::setFocusedNode(Frame* frame)
   933 void WebView::setFocusedNode(Frame* frame)
   925 {
   934 {
   929             page()->focusController()->setFocusedNode(n, frame);
   938             page()->focusController()->setFocusedNode(n, frame);
   930         }
   939         }
   931     }
   940     }
   932 }
   941 }
   933 
   942 
   934 bool WebView::needDeactivateEditable(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
   943 bool WebView::needDeactivateEditable(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame, bool consumed)
   935 {
   944 {
   936     bool upOrDown = ((keyevent.iCode == EKeyUpArrow) ||
   945     /*
   937                     (keyevent.iCode == EStdKeyUpArrow) ||
   946      * Here we are making an assumption that if element visibility has been changed
   938                     (keyevent.iCode == EKeyRightUpArrow) ||
   947      * than JavaScript used the key event. If this the the case or consumed is tru and
   939                     (keyevent.iCode == EKeyDownArrow) ||
   948      * keys are Up or Down we don't want to deactivate an editable element.
   940                     (keyevent.iCode == EStdKeyDownArrow) ||
   949      * Google suggest is examples if such case.
   941                     (keyevent.iCode == EKeyLeftDownArrow));
   950      */
   942     bool shouldEndEditing = frame->editor()->client()->shouldEndEditing(NULL);
   951     bool upOrDownConsumed = (consumed ||    //JavaScript consumed event or
   943     bool inEditState  = (m_isEditable && (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox));
   952                                (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox && // style of input box     
   944     bool isSelectBoxActive = (m_focusedElementType == TBrCtlDefs::EElementSelectBox);
   953                                 page()->chrome()->client()->elementVisibilityChanged())) &&      // changed
   945     bool deactivateInputBox = (inEditState && upOrDown && m_webfeptexteditor->validateTextFormat());
   954                              (IS_UP_KEY(keyevent) || IS_DOWN_KEY(keyevent));
   946     bool deactivateSelectBox = (isSelectBoxActive && isNaviKey(keyevent));
   955     bool shouldEndEditing = frame->editor()->client()->shouldEndEditing(NULL) && !upOrDownConsumed;
   947 
       
   948     bool deactivateEditable = (m_isEditable && shouldEndEditing && m_webfeptexteditor->validateTextFormat());
   956     bool deactivateEditable = (m_isEditable && shouldEndEditing && m_webfeptexteditor->validateTextFormat());
   949     return deactivateEditable || deactivateSelectBox; 
   957     return deactivateEditable; 
   950 }
   958 }
   951 
   959 
   952 
   960 
   953 bool WebView::deactivateEditable()
   961 bool WebView::deactivateEditable()
   954 {
   962 {
   979         if (oldKeyCode == EEventKeyDown) {
   987         if (oldKeyCode == EEventKeyDown) {
   980             consumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
   988             consumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
   981         }
   989         }
   982     }
   990     }
   983     else {
   991     else {
   984         if (keyevent.iCode == EKeyDevice3) { //selection key (MSK)
   992         if (keyevent.iCode == EKeyDevice3) { // selection key (MSK)
   985                 // mimic ccb's behavior of onFocus
       
   986            consumed = handleMSK(keyevent, oldKeyCode, frame);
   993            consumed = handleMSK(keyevent, oldKeyCode, frame);
   987 
       
   988            // Toolbar is activated on long key press only if the element
       
   989            // type is EElementNone during EEventKeyDown and EEventKey.
       
   990            // This prevents toolbar from popping up in DHTML pages. Also,
       
   991            // toolbar is activated when the user is not in fast scroll
       
   992            // mode, or in page overview mode, or on wml page.
       
   993         }
   994         }
   994         else if (isNaviKey(keyevent)) {
   995         else if (isNaviKey(keyevent)) {
   995             consumed = handleNaviKeyEvent(keyevent, oldKeyCode, frame);
   996             consumed = handleNaviKeyEvent(keyevent, oldKeyCode, frame);
   996         } // if (m_brctl->settings()->getNavigationType()
   997         } 
   997         else { // Not an arrow key..
   998         else { // Not an arrow key..
   998                  // activate hovered input element by just start typing
   999                  // activate hovered input element by just start typing
   999             consumed = !m_isEditable && handleInputElement(keyevent, eventcode, frame);
  1000             consumed = !m_isEditable && handleInputElement(keyevent, eventcode, frame);
  1000         }
  1001         }
  1001         if (!consumed && !(tabbedNavigation && isNaviKey(keyevent))) {
  1002         if (!consumed && !(tabbedNavigation && isNaviKey(keyevent))) {
  1003         }
  1004         }
  1004     }
  1005     }
  1005     return consumed;
  1006     return consumed;
  1006 }
  1007 }
  1007 
  1008 
       
  1009 
  1008 bool WebView::handleMSK(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
  1010 bool WebView::handleMSK(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
  1009 {
  1011 {
  1010     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
  1012     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
  1011     bool prevEditableState = m_isEditable;
  1013     bool prevEditableState = m_isEditable;
  1012     if (m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox ) {
  1014     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
  1013         sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down,
  1015     Node* focusedNode = frame->document()->focusedNode();
  1014                                cursor->position(), frame);
  1016     bool multiSelectInTabbed =  (m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) &&  // multiselect element
  1015     }
  1017                                      tabbedNavigation;                                               // in tabbed mode.
  1016     setFocusedNode(frame);
  1018         /*
       
  1019          * Avoiding resetting cursor position to top left corner of Select Box 
       
  1020          * See comment in handleInputElement
       
  1021          */                            
       
  1022         if (!multiSelectInTabbed) {
       
  1023             setFocusNone();
       
  1024         }
       
  1025          
       
  1026     sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down,
       
  1027                                    cursor->position(), frame);    
       
  1028     if (!tabbedNavigation) {
       
  1029         setFocusedNode(frame); //TODO: Do we need it here?
       
  1030     }
       
  1031     else {
       
  1032         /*
       
  1033          * Restore focused by tabbed navigation node since mouse event
       
  1034          * handler might set it to NULL.  
       
  1035          */
       
  1036         page()->focusController()->setFocusedNode(focusedNode, frame);
       
  1037     }
       
  1038     
       
  1039     /*
       
  1040      * MSK key event on editable will be interpreted as Enter.
       
  1041      * We don't want to send Enter key in case of activated
       
  1042      * input box. Also if the text area has been just activated
       
  1043      * we also don't want to send Enter since it will cause extra
       
  1044      * line feed.
       
  1045      */   
  1017     bool textAreaJustActivated = (!prevEditableState && m_isEditable &&
  1046     bool textAreaJustActivated = (!prevEditableState && m_isEditable &&
  1018                                   m_focusedElementType == TBrCtlDefs::EElementTextAreaBox);
  1047                                   m_focusedElementType == TBrCtlDefs::EElementTextAreaBox);
       
  1048     
  1019     if (eventcode == EEventKeyDown && 
  1049     if (eventcode == EEventKeyDown && 
  1020         m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox &&
  1050         m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox &&
  1021         !textAreaJustActivated) {
  1051         !textAreaJustActivated) {
       
  1052         
  1022         sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
  1053         sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
  1023     }
  1054     }
       
  1055 
       
  1056     /* 
       
  1057      * Toolbar is activated on long key press only if the element
       
  1058      * type is EElementNone during EEventKeyDown and EEventKey.
       
  1059      * This prevents toolbar from popping up in DHTML pages. Also,
       
  1060      * toolbar is activated when the user is not in fast scroll
       
  1061      * mode, or in page overview mode, or on wml page.
       
  1062      */
  1024      if ((m_focusedElementType == TBrCtlDefs::EElementNone ||
  1063      if ((m_focusedElementType == TBrCtlDefs::EElementNone ||
  1025           m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) &&
  1064           m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) &&
  1026           keyevent.iRepeats && !m_brctl->wmlMode() ) {
  1065           keyevent.iRepeats && !m_brctl->wmlMode() ) {
  1027          launchToolBarL();
  1066          launchToolBarL();
  1028      }
  1067      }
       
  1068     
  1029      return true;
  1069      return true;
  1030 }
  1070 }
  1031 bool WebView::handleNaviKeyEvent(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
  1071 
       
  1072 bool WebView::handleNaviKeyEvent(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)  
  1032 {
  1073 {
  1033     bool downEventConsumed = false;
  1074     bool downEventConsumed = false;
  1034     bool consumed = false;
  1075     bool consumed = false;
  1035     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
  1076     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
  1036     /*
  1077     /*
  1037      * For each platform keyDown event EventHandler::keEvent() generates
  1078      * For each platform keyDown event EventHandler::keEvent() generates 
  1038      * keydown and keypress.
  1079      * keydown and keypress.
  1039      * For keypress event we need a char code and since we don't
  1080      * For keypress event we need a char code and since we don't 
  1040      * have it at the time of EEventKeyDown we pospond it until EEventKey
  1081      * have it at the time of EEventKeyDown we pospond it until EEventKey 
  1041      * and send it here.
  1082      * and send it here.
  1042      */
  1083      */
  1043     if (eventcode == EEventKeyDown){
  1084     if (eventcode == EEventKeyDown){
  1044         downEventConsumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
  1085         downEventConsumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
  1045     }
  1086     }
  1046 
  1087     /*
  1047     if (!downEventConsumed && needDeactivateEditable(keyevent, eventcode, frame)) {
  1088      * downEventConsumed will be true if JavaScript consumes key event
       
  1089      * If we are not in the widget mode we want to deactivate input box
       
  1090      * regardless of whether event was consumed by JavaScript or not.
       
  1091      * Othrerwise we have a risk to be trapped inside input box.
       
  1092      */
       
  1093     bool widgetDownEventConsumed = downEventConsumed && (m_widgetextension != NULL);
       
  1094   
       
  1095     if (!widgetDownEventConsumed && needDeactivateEditable(keyevent, eventcode, frame, downEventConsumed)) {
  1048         deactivateEditable();
  1096         deactivateEditable();
  1049     }
  1097     }
  1050 
  1098 
  1051     if (tabbedNavigation) {
  1099     if (tabbedNavigation) {
  1052         consumed = downEventConsumed || handleTabbedNavigation(m_currentEventKey, m_currentEventCode);
  1100         consumed = downEventConsumed || handleTabbedNavigation(m_currentEventKey, m_currentEventCode);
  1053     }
  1101     }
  1054     else {
  1102     else {  
  1055         consumed = (!m_isEditable &&  //avoid showing the cursor when we are in the input box
  1103         consumed = (!m_isEditable &&  //avoid showing the cursor when we are in the input box 
  1056                     handleKeyNavigation(keyevent, eventcode, frame)) ||
  1104                     handleKeyNavigation(keyevent, eventcode, frame)) ||
  1057                     downEventConsumed;
  1105                     downEventConsumed;
  1058     }
  1106     }
  1059     return consumed;
  1107     return consumed;
  1060 }
  1108 }
  1061 
  1109 
  1062 
       
  1063 bool WebView::handleInputElement(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
  1110 bool WebView::handleInputElement(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
  1064 {
  1111 {
  1065     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
  1112     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
       
  1113     TBrCtlDefs::TBrCtlElementType elTypeBeforeMouseEvent = m_focusedElementType;
       
  1114     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
       
  1115     bool navigationNone = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone); 
       
  1116     bool prevEditableState = m_isEditable;
       
  1117     bool enterOnMultiSelectInTabbed = tabbedNavigation && (keyevent.iCode == EKeyEnter) &&           // EnterKey in case of
       
  1118                                       (m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox);  // multiselect eelement in tabbed mode.
       
  1119     
       
  1120     
  1066     bool sendMousedEvent = false;
  1121     bool sendMousedEvent = false;
  1067     if (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
  1122     if (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
  1068         m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) {
  1123         m_focusedElementType == TBrCtlDefs::EElementTextAreaBox ||
       
  1124         (tabbedNavigation && 
       
  1125          (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox))) {
  1069         sendMousedEvent = true;
  1126         sendMousedEvent = true;
  1070     }
  1127     }
  1071     else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox ||
  1128     else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox ||
  1072         m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) {
  1129         m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) {
  1073         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone ||
  1130         if (!navigationNone || keyevent.iCode == EKeyDevice3) {
  1074             keyevent.iCode == EKeyDevice3) {
       
  1075             sendMousedEvent = true;
  1131             sendMousedEvent = true;
  1076         }
  1132         }
  1077     }
  1133     }
       
  1134     
       
  1135     if (m_focusedElementType == TBrCtlDefs::EElementTextAreaBox || 
       
  1136         m_focusedElementType == TBrCtlDefs::EElementInputBox ||
       
  1137         m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox) {
       
  1138         page()->chrome()->client()->setElementVisibilityChanged(false);
       
  1139     }
       
  1140         
  1078     if (sendMousedEvent) {
  1141     if (sendMousedEvent) {
       
  1142         /*
       
  1143          * Sending mouse event to WebCore will trigger FocusController->setFocusedNode() to be called.
       
  1144          * It will do anything only if focused node has been changed. Among other thing it will 
       
  1145          * trigger the setEditable() call, which we need. The exception is the case when 
       
  1146          * we have tabbed navigation and EnterKey was hit in MultiSelect Box. 
       
  1147          * In this case we just want to select item in the select element.  
       
  1148          * HTMLSelectElement::listBoxDefaultEventHandler() will call focus() which will
       
  1149          * set the focused node, which is already set anyway, but this will cause the 
       
  1150          * reseting cursor position to the top left corner of the select box.  
       
  1151          * To avoid thos we put the check here before we reset the foocusedNode.  
       
  1152          */   
       
  1153         if (!enterOnMultiSelectInTabbed) { 
       
  1154             frame->document()->setFocusedNode(NULL);
       
  1155         }
       
  1156         
       
  1157         /*
       
  1158          * Tweek the m_isEditable flag, so setEditable will do something
       
  1159          * usefull when it's called from FocusController->setFocusedNode()
       
  1160          */
       
  1161         if (m_isEditable && tabbedNavigation) {
       
  1162             m_isEditable = false;
       
  1163         }
       
  1164         
  1079         sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down, cursor->position(), frame);
  1165         sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down, cursor->position(), frame);
  1080         sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame);
  1166         sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame);
  1081 
  1167         
  1082         if (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
  1168         /*
  1083             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox ||
  1169          * If enter key was pressed to activate an input box we don't want to 
  1084             m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox) {
  1170          * send it to WebCore since it may cause immediate form submission.
       
  1171          * Same for MultiSelect Box in tabbed mode. 
       
  1172          */
       
  1173         bool inputBoxJustActivated = (!prevEditableState &&  m_isEditable && 
       
  1174                                       (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox||
       
  1175                                        m_focusedElementType == TBrCtlDefs::EElementTextAreaBox));
       
  1176         bool inputBoxJustActivatedByEnter = inputBoxJustActivated && (keyevent.iCode == EKeyEnter);
       
  1177         if (!inputBoxJustActivatedByEnter &&
       
  1178             !enterOnMultiSelectInTabbed &&
       
  1179             (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
       
  1180              m_focusedElementType == TBrCtlDefs::EElementTextAreaBox || 
       
  1181              m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox)) {
       
  1182 
  1085             if (!m_fepTimer) {
  1183             if (!m_fepTimer) {
  1086                 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired);
  1184                 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired);
  1087             }
  1185             }
  1088 
  1186 
  1089             m_fepTimer->startOneShot(0.2f);
  1187             m_fepTimer->startOneShot(0.2f);
  1090             setEditable(true);
  1188             if (!m_isEditable) {
  1091         }
  1189                 setEditable(true);
       
  1190             }
       
  1191         }
       
  1192                
  1092         m_keyevent = keyevent;
  1193         m_keyevent = keyevent;
  1093         m_eventcode = eventcode;
  1194         m_eventcode = eventcode;
  1094         return true;
  1195         return true;
  1095     }
  1196     }
  1096     return false; // not input element
  1197     return false; // not input element
  1120     }
  1221     }
  1121     else{
  1222     else{
  1122         cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll);
  1223         cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll);
  1123     }
  1224     }
  1124     updateScrollbars();
  1225     updateScrollbars();
       
  1226     /*
       
  1227      * In order to Enter key activate a link the link node has to be focused.
       
  1228      * When WebCursor is finding next node to snap it stores it, so here we can
       
  1229      * set it to focused.  
       
  1230      */
       
  1231     if (m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsEnterKeyMode) == 
       
  1232                                   TBrCtlDefs::EEnterKeyCanActivateLink) {
       
  1233         setFocusedNodeUnderCursor(frame);
       
  1234     }
       
  1235 
  1125     if (!fastscroll) {
  1236     if (!fastscroll) {
  1126         m_fastScrollTimer->Start(KCursorInitialDelay,KCursorUpdateFrquency,TCallBack(&scrollTimerCb,this));
  1237         m_fastScrollTimer->Start(KCursorInitialDelay,KCursorUpdateFrquency,TCallBack(&scrollTimerCb,this));
  1127         m_scrollingStartTime.HomeTime();
  1238         m_scrollingStartTime.HomeTime();
  1128     }
  1239     }
  1129 
  1240 
  1136 
  1247 
  1137     consumed = true;
  1248     consumed = true;
  1138     return consumed;
  1249     return consumed;
  1139 }
  1250 }
  1140 
  1251 
       
  1252 void WebView::setFocusedNodeUnderCursor(Frame* frame)
       
  1253 {
       
  1254     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
       
  1255     // focus the node we snapped to 
       
  1256     if (m_focusedElementType != TBrCtlDefs::EElementNone) {
       
  1257         frame->document()->setFocusedNode(cursor->getElementUnderCursor());
       
  1258     }
       
  1259     // or reset if there is none
       
  1260     else if (frame->document()->focusedNode() != NULL) {
       
  1261         frame->document()->setFocusedNode(NULL);
       
  1262     }
       
  1263 }
  1141 
  1264 
  1142 bool WebView::handleMinimapNavigation()
  1265 bool WebView::handleMinimapNavigation()
  1143 {
  1266 {
  1144     int scrollingTime = millisecondsScrolled();
  1267     int scrollingTime = millisecondsScrolled();
  1145     if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled &&
  1268     if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled &&
  1253             else {
  1376             else {
  1254                 m_prevEditMode = false;
  1377                 m_prevEditMode = false;
  1255             }
  1378             }
  1256         }
  1379         }
  1257         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) {
  1380         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) {
  1258             if (!sendKeyEventToEngine(correctedKeyEvent, eventcode, frame)) {
  1381             if (!sendKeyEventToEngine(correctedKeyEvent, eventcode, frame)) {        
  1259                 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame);
  1382                 if (keyevent.iScanCode == EStdKeyDevice3) { //MSK
       
  1383                     sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame);
       
  1384                 }
  1260             }
  1385             }
  1261             consumed = true;
  1386             consumed = true;
  1262         }
  1387         }
  1263     }
  1388     }
  1264 
  1389 
  1299 bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent,
  1424 bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent,
  1300                                    TEventCode eventcode, Frame* frame)
  1425                                    TEventCode eventcode, Frame* frame)
  1301 {
  1426 {
  1302     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
  1427     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
  1303     Node* targetNode = frame->document()->focusedNode();
  1428     Node* targetNode = frame->document()->focusedNode();
  1304     if (!m_isEditable) {
  1429     /* 
  1305 
  1430      * we dont want to send key event for navi key to the elements 
  1306 
  1431      * like select element since it has default key event handling, 
  1307 
  1432      * which will prevent user to leave the element.  
       
  1433      */
       
  1434     if (!m_isEditable && isNaviKey(keyevent)) {
  1308         frame->document()->setFocusedNode(NULL);
  1435         frame->document()->setFocusedNode(NULL);
  1309     }
  1436     }
  1310     bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode));
  1437     bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode));
  1311     frame->document()->setFocusedNode(targetNode);
  1438     frame->document()->setFocusedNode(targetNode);
  1312 
  1439