OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/linked_ptr.h" | 10 #include "base/memory/linked_ptr.h" |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 // process. The failure also happens if we output nothing here. | 144 // process. The failure also happens if we output nothing here. |
145 // We need to investigate the reason for this failure and fix it. | 145 // We need to investigate the reason for this failure and fix it. |
146 // In the meantime this temporary hack of drawing an empty | 146 // In the meantime this temporary hack of drawing an empty |
147 // rectangle in the DC gets us by. | 147 // rectangle in the DC gets us by. |
148 Rectangle(dc, 0, 0, 0, 0); | 148 Rectangle(dc, 0, 0, 0, 0); |
149 } | 149 } |
150 #endif // defined(OS_WIN) | 150 #endif // defined(OS_WIN) |
151 | 151 |
152 namespace { | 152 namespace { |
153 | 153 |
| 154 // Check PP_TextInput_Type and ui::TextInputType are kept in sync. |
| 155 COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_NONE) == \ |
| 156 int(PP_TEXTINPUT_TYPE_NONE), mismatching_enums); |
| 157 COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_TEXT) == \ |
| 158 int(PP_TEXTINPUT_TYPE_TEXT), mismatching_enums); |
| 159 COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_PASSWORD) == \ |
| 160 int(PP_TEXTINPUT_TYPE_PASSWORD), mismatching_enums); |
| 161 COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_SEARCH) == \ |
| 162 int(PP_TEXTINPUT_TYPE_SEARCH), mismatching_enums); |
| 163 COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_EMAIL) == \ |
| 164 int(PP_TEXTINPUT_TYPE_EMAIL), mismatching_enums); |
| 165 COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_NUMBER) == \ |
| 166 int(PP_TEXTINPUT_TYPE_NUMBER), mismatching_enums); |
| 167 COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_TELEPHONE) == \ |
| 168 int(PP_TEXTINPUT_TYPE_TELEPHONE), mismatching_enums); |
| 169 COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_URL) == \ |
| 170 int(PP_TEXTINPUT_TYPE_URL), mismatching_enums); |
| 171 |
154 // The default text input type is to regard the plugin always accept text input. | 172 // The default text input type is to regard the plugin always accept text input. |
155 // This is for allowing users to use input methods even on completely-IME- | 173 // This is for allowing users to use input methods even on completely-IME- |
156 // unaware plugins (e.g., PPAPI Flash or PDF plugin for M16). | 174 // unaware plugins (e.g., PPAPI Flash or PDF plugin for M16). |
157 // Plugins need to explicitly opt out the text input mode if they know | 175 // Plugins need to explicitly opt out the text input mode if they know |
158 // that they don't accept texts. | 176 // that they don't accept texts. |
159 const ui::TextInputType kPluginDefaultTextInputType = ui::TEXT_INPUT_TYPE_TEXT; | 177 const ui::TextInputType kPluginDefaultTextInputType = ui::TEXT_INPUT_TYPE_TEXT; |
160 | 178 |
161 #define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, np_name) \ | 179 #define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, np_name) \ |
162 COMPILE_ASSERT(static_cast<int>(WebCursorInfo::webkit_name) \ | 180 COMPILE_ASSERT(static_cast<int>(WebCursorInfo::webkit_name) \ |
163 == static_cast<int>(np_name), \ | 181 == static_cast<int>(np_name), \ |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 bool PluginInstance::HandleCompositionEnd(const string16& text) { | 602 bool PluginInstance::HandleCompositionEnd(const string16& text) { |
585 return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_COMPOSITION_END, | 603 return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_COMPOSITION_END, |
586 text); | 604 text); |
587 } | 605 } |
588 | 606 |
589 bool PluginInstance::HandleTextInput(const string16& text) { | 607 bool PluginInstance::HandleTextInput(const string16& text) { |
590 return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_TEXT, | 608 return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_TEXT, |
591 text); | 609 text); |
592 } | 610 } |
593 | 611 |
594 void PluginInstance::UpdateCaretPosition(const gfx::Rect& caret, | |
595 const gfx::Rect& bounding_box) { | |
596 text_input_caret_ = caret; | |
597 text_input_caret_bounds_ = bounding_box; | |
598 text_input_caret_set_ = true; | |
599 delegate()->PluginCaretPositionChanged(this); | |
600 } | |
601 | |
602 void PluginInstance::SetTextInputType(ui::TextInputType type) { | |
603 text_input_type_ = type; | |
604 delegate()->PluginTextInputTypeChanged(this); | |
605 } | |
606 | |
607 void PluginInstance::SelectionChanged() { | |
608 // TODO(kinaba): currently the browser always calls RequestSurroundingText. | |
609 // It can be optimized so that it won't call it back until the information | |
610 // is really needed. | |
611 | |
612 // Avoid calling in nested context or else this will reenter the plugin. This | |
613 // uses a weak pointer rather than exploiting the fact that this class is | |
614 // refcounted because we don't actually want this operation to affect the | |
615 // lifetime of the instance. | |
616 MessageLoop::current()->PostTask(FROM_HERE, | |
617 base::Bind(&PluginInstance::RequestSurroundingText, | |
618 AsWeakPtr(), | |
619 static_cast<size_t>(kExtraCharsForTextInput))); | |
620 } | |
621 | |
622 void PluginInstance::UpdateSurroundingText(const std::string& text, | |
623 size_t caret, size_t anchor) { | |
624 surrounding_text_ = text; | |
625 selection_caret_ = caret; | |
626 selection_anchor_ = anchor; | |
627 delegate()->PluginSelectionChanged(this); | |
628 } | |
629 | |
630 void PluginInstance::GetSurroundingText(string16* text, | 612 void PluginInstance::GetSurroundingText(string16* text, |
631 ui::Range* range) const { | 613 ui::Range* range) const { |
632 std::vector<size_t> offsets; | 614 std::vector<size_t> offsets; |
633 offsets.push_back(selection_anchor_); | 615 offsets.push_back(selection_anchor_); |
634 offsets.push_back(selection_caret_); | 616 offsets.push_back(selection_caret_); |
635 *text = UTF8ToUTF16AndAdjustOffsets(surrounding_text_, &offsets); | 617 *text = UTF8ToUTF16AndAdjustOffsets(surrounding_text_, &offsets); |
636 range->set_start(offsets[0] == string16::npos ? text->size() : offsets[0]); | 618 range->set_start(offsets[0] == string16::npos ? text->size() : offsets[0]); |
637 range->set_end(offsets[1] == string16::npos ? text->size() : offsets[1]); | 619 range->set_end(offsets[1] == string16::npos ? text->size() : offsets[1]); |
638 } | 620 } |
639 | 621 |
(...skipping 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1905 return PP_OK_COMPLETIONPENDING; | 1887 return PP_OK_COMPLETIONPENDING; |
1906 } else { | 1888 } else { |
1907 return PP_ERROR_FAILED; | 1889 return PP_ERROR_FAILED; |
1908 } | 1890 } |
1909 } | 1891 } |
1910 | 1892 |
1911 void PluginInstance::UnlockMouse(PP_Instance instance) { | 1893 void PluginInstance::UnlockMouse(PP_Instance instance) { |
1912 delegate()->UnlockMouse(this); | 1894 delegate()->UnlockMouse(this); |
1913 } | 1895 } |
1914 | 1896 |
| 1897 void PluginInstance::SetTextInputType(PP_Instance instance, |
| 1898 PP_TextInput_Type type) { |
| 1899 int itype = type; |
| 1900 if (itype < 0 || itype > ui::TEXT_INPUT_TYPE_URL) |
| 1901 itype = ui::TEXT_INPUT_TYPE_NONE; |
| 1902 text_input_type_ = static_cast<ui::TextInputType>(itype); |
| 1903 delegate()->PluginTextInputTypeChanged(this); |
| 1904 } |
| 1905 |
| 1906 void PluginInstance::UpdateCaretPosition(PP_Instance instance, |
| 1907 const PP_Rect& caret, |
| 1908 const PP_Rect& bounding_box) { |
| 1909 text_input_caret_ = PP_ToGfxRect(caret); |
| 1910 text_input_caret_bounds_ = PP_ToGfxRect(bounding_box); |
| 1911 text_input_caret_set_ = true; |
| 1912 delegate()->PluginCaretPositionChanged(this); |
| 1913 } |
| 1914 |
| 1915 void PluginInstance::CancelCompositionText(PP_Instance instance) { |
| 1916 delegate()->PluginRequestedCancelComposition(this); |
| 1917 } |
| 1918 |
| 1919 void PluginInstance::SelectionChanged(PP_Instance instance) { |
| 1920 // TODO(kinaba): currently the browser always calls RequestSurroundingText. |
| 1921 // It can be optimized so that it won't call it back until the information |
| 1922 // is really needed. |
| 1923 |
| 1924 // Avoid calling in nested context or else this will reenter the plugin. This |
| 1925 // uses a weak pointer rather than exploiting the fact that this class is |
| 1926 // refcounted because we don't actually want this operation to affect the |
| 1927 // lifetime of the instance. |
| 1928 MessageLoop::current()->PostTask(FROM_HERE, |
| 1929 base::Bind(&PluginInstance::RequestSurroundingText, |
| 1930 AsWeakPtr(), |
| 1931 static_cast<size_t>(kExtraCharsForTextInput))); |
| 1932 } |
| 1933 |
| 1934 void PluginInstance::UpdateSurroundingText(PP_Instance instance, |
| 1935 const char* text, |
| 1936 uint32_t caret, |
| 1937 uint32_t anchor) { |
| 1938 surrounding_text_ = text; |
| 1939 selection_caret_ = caret; |
| 1940 selection_anchor_ = anchor; |
| 1941 delegate()->PluginSelectionChanged(this); |
| 1942 } |
| 1943 |
1915 PP_Var PluginInstance::ResolveRelativeToDocument( | 1944 PP_Var PluginInstance::ResolveRelativeToDocument( |
1916 PP_Instance instance, | 1945 PP_Instance instance, |
1917 PP_Var relative, | 1946 PP_Var relative, |
1918 PP_URLComponents_Dev* components) { | 1947 PP_URLComponents_Dev* components) { |
1919 StringVar* relative_string = StringVar::FromPPVar(relative); | 1948 StringVar* relative_string = StringVar::FromPPVar(relative); |
1920 if (!relative_string) | 1949 if (!relative_string) |
1921 return PP_MakeNull(); | 1950 return PP_MakeNull(); |
1922 | 1951 |
1923 WebElement plugin_element = container()->element(); | 1952 WebElement plugin_element = container()->element(); |
1924 GURL document_url = plugin_element.document().baseURL(); | 1953 GURL document_url = plugin_element.document().baseURL(); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2033 screen_size_for_fullscreen_ = gfx::Size(); | 2062 screen_size_for_fullscreen_ = gfx::Size(); |
2034 WebElement element = container_->element(); | 2063 WebElement element = container_->element(); |
2035 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); | 2064 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); |
2036 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); | 2065 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); |
2037 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); | 2066 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); |
2038 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); | 2067 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); |
2039 } | 2068 } |
2040 | 2069 |
2041 } // namespace ppapi | 2070 } // namespace ppapi |
2042 } // namespace webkit | 2071 } // namespace webkit |
OLD | NEW |