blob: e924455aac16e84df95f596f5e5069d010a7163c [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromecast/browser/webview/webview_input_method_observer.h"
#include "chromecast/browser/webview/proto/webview.pb.h"
#include "ui/base/ime/input_method.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/base/ime/text_input_type.h"
namespace chromecast {
namespace {
webview::TextInputType ConvertTextInputType(
const ui::TextInputType text_input_type) {
switch (text_input_type) {
case ui::TEXT_INPUT_TYPE_NONE:
return webview::TEXT_INPUT_TYPE_NONE;
break;
case ui::TEXT_INPUT_TYPE_TEXT:
return webview::TEXT_INPUT_TYPE_TEXT;
break;
case ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE:
return webview::TEXT_INPUT_TYPE_CONTENT_EDITABLE;
break;
case ui::TEXT_INPUT_TYPE_PASSWORD:
return webview::TEXT_INPUT_TYPE_PASSWORD;
break;
case ui::TEXT_INPUT_TYPE_SEARCH:
return webview::TEXT_INPUT_TYPE_SEARCH;
break;
case ui::TEXT_INPUT_TYPE_EMAIL:
return webview::TEXT_INPUT_TYPE_EMAIL;
break;
case ui::TEXT_INPUT_TYPE_NUMBER:
return webview::TEXT_INPUT_TYPE_NUMBER;
break;
case ui::TEXT_INPUT_TYPE_TELEPHONE:
return webview::TEXT_INPUT_TYPE_TELEPHONE;
break;
case ui::TEXT_INPUT_TYPE_DATE:
return webview::TEXT_INPUT_TYPE_DATE;
break;
case ui::TEXT_INPUT_TYPE_DATE_TIME:
return webview::TEXT_INPUT_TYPE_DATE_TIME;
break;
case ui::TEXT_INPUT_TYPE_MONTH:
return webview::TEXT_INPUT_TYPE_MONTH;
break;
case ui::TEXT_INPUT_TYPE_TIME:
return webview::TEXT_INPUT_TYPE_TIME;
break;
case ui::TEXT_INPUT_TYPE_URL:
return webview::TEXT_INPUT_TYPE_URL;
break;
case ui::TEXT_INPUT_TYPE_WEEK:
return webview::TEXT_INPUT_TYPE_WEEK;
break;
case ui::TEXT_INPUT_TYPE_TEXT_AREA:
return webview::TEXT_INPUT_TYPE_TEXT_AREA;
break;
case ui::TEXT_INPUT_TYPE_DATE_TIME_FIELD:
return webview::TEXT_INPUT_TYPE_DATE_TIME_FIELD;
break;
case ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL:
return webview::TEXT_INPUT_TYPE_DATE_TIME_LOCAL;
break;
case ui::TEXT_INPUT_TYPE_NULL:
return webview::TEXT_INPUT_TYPE_NULL;
break;
}
LOG(ERROR) << "Unmapped TextInputType: " << text_input_type;
return webview::TEXT_INPUT_TYPE_NULL;
}
} // namespace
void WebviewInputMethodObserver::OnTextInputStateChanged(
const ui::TextInputClient* client) {
if (!client)
return;
std::unique_ptr<chromecast::webview::WebviewResponse> focus_event_response =
std::make_unique<chromecast::webview::WebviewResponse>();
auto* focus_event = focus_event_response->mutable_input_focus_event();
focus_event->set_flags(client->GetTextInputFlags());
focus_event->set_type(ConvertTextInputType(client->GetTextInputType()));
client_->EnqueueSend(std::move(focus_event_response));
}
WebviewInputMethodObserver::WebviewInputMethodObserver(
chromecast::WebContentController::Client* client,
ui::InputMethod* input_method)
: client_(client), input_method_(input_method) {
input_method_->AddObserver(this);
}
WebviewInputMethodObserver::~WebviewInputMethodObserver() {
if (input_method_) {
input_method_->RemoveObserver(this);
}
}
void WebviewInputMethodObserver::OnInputMethodDestroyed(
const ui::InputMethod* input_method) {
input_method_ = nullptr;
}
} // namespace chromecast