OLD | NEW |
| (Empty) |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "content/test/plugin/plugin_windowed_test.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "content/test/plugin/plugin_client.h" | |
9 | |
10 namespace NPAPIClient { | |
11 | |
12 WindowedPluginTest::WindowedPluginTest(NPP id, NPNetscapeFuncs *host_functions) | |
13 : PluginTest(id, host_functions), | |
14 window_(NULL), done_(false) { | |
15 } | |
16 | |
17 WindowedPluginTest::~WindowedPluginTest() { | |
18 if (window_) | |
19 DestroyWindow(window_); | |
20 } | |
21 | |
22 NPError WindowedPluginTest::SetWindow(NPWindow* pNPWindow) { | |
23 if (pNPWindow->window == NULL) | |
24 return NPERR_NO_ERROR; | |
25 | |
26 if (test_name() == "create_instance_in_paint" && test_id() == "2") { | |
27 SignalTestCompleted(); | |
28 return NPERR_NO_ERROR; | |
29 } | |
30 | |
31 if (window_) | |
32 return NPERR_NO_ERROR; | |
33 | |
34 HWND parent = reinterpret_cast<HWND>(pNPWindow->window); | |
35 if (!::IsWindow(parent)) { | |
36 SetError("Invalid arguments passed in"); | |
37 return NPERR_INVALID_PARAM; | |
38 } | |
39 | |
40 if ((test_name() == "create_instance_in_paint" && test_id() == "1") || | |
41 test_name() == "alert_in_window_message" || | |
42 test_name() == "set_title_in_paint" || | |
43 test_name() == "set_title_in_set_window_and_paint") { | |
44 static ATOM window_class = 0; | |
45 if (!window_class) { | |
46 WNDCLASSEX wcex; | |
47 wcex.cbSize = sizeof(WNDCLASSEX); | |
48 wcex.style = CS_DBLCLKS; | |
49 wcex.lpfnWndProc = &NPAPIClient::WindowedPluginTest::WindowProc; | |
50 wcex.cbClsExtra = 0; | |
51 wcex.cbWndExtra = 0; | |
52 wcex.hInstance = GetModuleHandle(NULL); | |
53 wcex.hIcon = 0; | |
54 wcex.hCursor = 0; | |
55 wcex.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW+1); | |
56 wcex.lpszMenuName = 0; | |
57 wcex.lpszClassName = L"CreateInstanceInPaintTestWindowClass"; | |
58 wcex.hIconSm = 0; | |
59 window_class = RegisterClassEx(&wcex); | |
60 } | |
61 | |
62 window_ = CreateWindowEx( | |
63 WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR, | |
64 MAKEINTATOM(window_class), 0, | |
65 WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE , | |
66 0, 0, 100, 100, parent, 0, GetModuleHandle(NULL), 0); | |
67 DCHECK(window_); | |
68 // TODO: this propery leaks. | |
69 ::SetProp(window_, L"Plugin_Instance", this); | |
70 } | |
71 | |
72 if (test_name() == "set_title_in_set_window_and_paint") | |
73 CallJSFunction(this, "PluginCreated"); | |
74 | |
75 return NPERR_NO_ERROR; | |
76 } | |
77 | |
78 NPError WindowedPluginTest::Destroy() { | |
79 if (test_name() != "ensure_scripting_works_in_destroy") | |
80 return NPERR_NO_ERROR; | |
81 | |
82 // Bug 23706: ensure that scripting works with no asserts. | |
83 NPObject *window_obj = NULL; | |
84 HostFunctions()->getvalue(id(), NPNVWindowNPObject,&window_obj); | |
85 | |
86 if (!window_obj) { | |
87 SetError("Failed to get NPObject for plugin instance"); | |
88 } else { | |
89 std::string script = "javascript:GetMagicNumber()"; | |
90 NPString script_string; | |
91 script_string.UTF8Characters = script.c_str(); | |
92 script_string.UTF8Length = | |
93 static_cast<unsigned int>(script.length()); | |
94 | |
95 NPVariant result_var; | |
96 bool result = HostFunctions()->evaluate( | |
97 id(), window_obj, &script_string, &result_var); | |
98 if (!result || | |
99 result_var.type != NPVariantType_Double || | |
100 result_var.value.doubleValue != 42.0) { | |
101 SetError("Failed to script during NPP_Destroy"); | |
102 } | |
103 } | |
104 | |
105 SignalTestCompleted(); | |
106 return NPERR_NO_ERROR; | |
107 } | |
108 | |
109 void WindowedPluginTest::CallJSFunction( | |
110 WindowedPluginTest* this_ptr, const char* function) { | |
111 NPIdentifier function_id = this_ptr->HostFunctions()->getstringidentifier( | |
112 function); | |
113 | |
114 NPObject *window_obj = NULL; | |
115 this_ptr->HostFunctions()->getvalue( | |
116 this_ptr->id(), NPNVWindowNPObject, &window_obj); | |
117 | |
118 NPVariant rv; | |
119 this_ptr->HostFunctions()->invoke( | |
120 this_ptr->id(), window_obj, function_id, NULL, 0, &rv); | |
121 } | |
122 | |
123 LRESULT CALLBACK WindowedPluginTest::WindowProc( | |
124 HWND window, UINT message, WPARAM wparam, LPARAM lparam) { | |
125 WindowedPluginTest* this_ptr = | |
126 reinterpret_cast<WindowedPluginTest*> | |
127 (::GetProp(window, L"Plugin_Instance")); | |
128 | |
129 if (message == WM_PAINT) { | |
130 PAINTSTRUCT ps; | |
131 HDC hdc = BeginPaint(window, &ps); | |
132 HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0)); | |
133 HGDIOBJ orig = SelectObject(hdc, brush); | |
134 RECT r; | |
135 GetClientRect(window, &r); | |
136 Rectangle(hdc, 0, 0, r.right, r.bottom); | |
137 SelectObject(hdc, orig); // restore | |
138 DeleteObject(brush); | |
139 EndPaint(window, &ps); | |
140 } | |
141 | |
142 if (this_ptr && !this_ptr->done_) { | |
143 if (this_ptr->test_name() == "create_instance_in_paint" && | |
144 message == WM_PAINT) { | |
145 this_ptr->done_ = true; | |
146 CallJSFunction(this_ptr, "CreateNewInstance"); | |
147 } else if (this_ptr->test_name() == "alert_in_window_message" && | |
148 message == WM_PAINT) { | |
149 this_ptr->done_ = true; | |
150 // We call this function twice as we want to display two alerts | |
151 // and verify that we don't hang the browser. | |
152 CallJSFunction(this_ptr, "CallAlert"); | |
153 CallJSFunction(this_ptr, "CallAlert"); | |
154 } else if (this_ptr->test_name() == "set_title_in_paint" && | |
155 message == WM_PAINT) { | |
156 this_ptr->done_ = true; | |
157 CallJSFunction(this_ptr, "SetTitle"); | |
158 } else if (this_ptr->test_name() == "set_title_in_set_window_and_paint" && | |
159 message == WM_PAINT) { | |
160 this_ptr->done_ = true; | |
161 CallJSFunction(this_ptr, "PluginShown"); | |
162 } | |
163 | |
164 if (this_ptr->done_) { | |
165 ::RemoveProp(window, L"Plugin_Instance"); | |
166 } | |
167 } | |
168 | |
169 return DefWindowProc(window, message, wparam, lparam); | |
170 } | |
171 | |
172 } // namespace NPAPIClient | |
OLD | NEW |