void EditorClientEA::setInputMethodState(bool active) { WebCore::Node* pNode = NULL; Frame* frame = m_page->d->page->focusController()->focusedOrMainFrame(); if (frame && frame->document() && frame->document()->focusedNode()) { pNode = frame->document()->focusedNode(); } // Note by Arpit Baldeva: If on console(true by default on consoles/can be enabled on PC through emulation), // we detect if the node was focused due to the user input or through javascript. // If the node was focused by user input(such as click), we present the editor(emulated keyboard on consoles, debug log on PC). // If the node was focused by javascript, we make the cursor jump to the node. In addition, we blur <input>/<textarea> element // so that the user click can bring up the emulated keyboard. EA::WebKit::View* pView = m_page->view(); #if defined(EA_PLATFORM_CONSOLE) bool onConsole = true; #elif defined(EA_PLATFORM_WINDOWS) bool onConsole = pView->IsEmulatingConsoleOnPC(); #elif defined(EA_PLATFORM_OSX) bool onConsole = false; #endif if(onConsole && !pView->AllowJSTextInputStateNotificationOnConsole()) { if(!m_page->handle()->mouseCausedEventActive) { pView->MoveMouseCursorToNode(pNode); if (pNode && pNode->isHTMLElement()) { if(pNode->hasTagName(WebCore::HTMLNames::inputTag) || pNode->hasTagName(WebCore::HTMLNames::textareaTag)) { HTMLElement* pElement = static_cast<HTMLElement*> (pNode); pElement->blur(); } } return; } } // CSidhall 1/22/09 Added notify user app of text input state for possible virtual keyboard... // We can't fully trust the enabled flag because the input field might be a password in which case we still // want to activate the keyboard input. So we do our own checking and also get extra info... //Note by Arpit Baldeva: We are interested in the <input> and <textarea> elements. The problem is that we can't rely on the shouldUseInputMethod() of node to reliably detect an //editable node since it does not include password(as noted above). Webkit trunk has some cryptic comment explaining why that is the right thing to do. So we do as follows. // We could add a new method to the class hierarchy to achieve following but want to minimize the changes inside core layer. bool inputActive = active; bool searchActive = false; bool passwordActive = false; EA::WebKit::KeyboardType kbType = EA::WebKit::kDefaultKeyBoard; EA::WebKit::InputType inputType = EA::WebKit::kInputTypeNone; if( pNode && pNode->isHTMLElement()) { if(pNode->hasTagName(WebCore::HTMLNames::inputTag) ) { HTMLInputElement* pInputElement = static_cast<HTMLInputElement*> (pNode); inputActive = pInputElement->isTextField(); // This check makes sure that we are not firing this event with inputActive set to true in case of HTML like <input type="button" value="Click me" onclick="msg()"> //+ Deprecated searchActive = pInputElement->isSearchField(); passwordActive = pInputElement->isPasswordField(); //- //New HTML5 input types (text field related) if(pInputElement->isEmailField()) inputType = EA::WebKit::kInputTypeEmail; else if (pInputElement->isNumberField()) inputType = EA::WebKit::kInputTypeNumber; else if(pInputElement->isSearchField()) inputType = EA::WebKit::kInputTypeSearch; else if(pInputElement->isTelephoneField()) inputType = EA::WebKit::kInputTypeTelephone; else if(pInputElement->isURLField()) inputType = EA::WebKit::kInputTypeUrl; else if(pInputElement->isPasswordField()) inputType = EA::WebKit::kInputTypePassword; } /* //Note by Arpit Baldeva: This will always come back as true but provided the commented out code here for the sack of clarity else if(pNode->hasTagName(WebCore::HTMLNames::textareaTag)) { inputActive = enabled; } */ HTMLElement* pElement = static_cast<HTMLElement*> (pNode); if(pElement->hasClass()) { const WebCore::SpaceSplitString& classNames = pElement->classNames(); for(int i = 0; i < EA::WebKit::kCountKeyBoardTypes; ++i) { if(classNames.contains(sKeyBoardClassMap[i].mKeyboardClass)) { kbType = sKeyBoardClassMap[i].mKeyboardType; break; } } } // Update - 12/20/2010. Since we have the password information available from the HTML, we use it // if the keyboard is not overridden. if(passwordActive && (kbType == EA::WebKit::kDefaultKeyBoard)) { kbType = EA::WebKit::kPasswordKeyBoard; } } // Check if should disable the caret. if (pView->IsCaretDisabledOnConsole() && frame && frame->selection()) frame->selection()->setCaretVisible(false); using namespace EA::WebKit; if(EAWebKitClient* const pClient = GetEAWebKitClient(pView)) { // Store the current settings EA::WebKit::TextInputStateInfo textInfo; textInfo.mpView = pView; textInfo.mpUserData = pView->GetUserData(); textInfo.mIsActivated = inputActive; textInfo.mIsPasswordField = passwordActive; textInfo.mIsSearchField = searchActive; textInfo.mKeyboardType = kbType; textInfo.mInputType = inputType; pClient->TextInputState(textInfo); } }