15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define STRSAFE_NO_DEPRECATE 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/test/plugin/plugin_windowless_test.h" 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/test/plugin/plugin_client.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NPEvent does not exist on the Mac. 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef NPCocoaEvent WindowlessPluginTestEvent; 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef NPEvent WindowlessPluginTestEvent; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace NPAPIClient { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Remember the first plugin instance for tests involving multiple instances. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowlessPluginTest* g_other_instance = NULL; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OnFinishTest(void* data) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WindowlessPluginTest*>(data)->SignalTestCompleted(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsPaintEvent(WindowlessPluginTestEvent* np_event) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return np_event->event == WM_PAINT; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return np_event->type == NPCocoaEventDrawRect; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsMouseUpEvent(WindowlessPluginTestEvent* np_event) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return np_event->event == WM_LBUTTONUP; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return np_event->type == NPCocoaEventMouseUp; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsWindowActivationEvent(WindowlessPluginTestEvent* np_event) { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return np_event->type == NPCocoaEventWindowFocusChanged && 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) np_event->data.focus.hasFocus; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WindowlessPluginTest::WindowlessPluginTest(NPP id, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NPNetscapeFuncs *host_functions) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PluginTest(id, host_functions), 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint_counter_(0) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!g_other_instance) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_other_instance = this; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WindowlessPluginTest::IsWindowless() const { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError WindowlessPluginTest::New(uint16 mode, int16 argc, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* argn[], const char* argv[], 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPSavedData* saved) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPError error = PluginTest::New(mode, argc, argn, argv, saved); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_name() == "invoke_js_function_on_create") { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteScript( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPAPIClient::PluginClient::HostFunctions(), g_other_instance->id(), 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PluginCreated();", NULL); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int16 WindowlessPluginTest::HandleEvent(void* event) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPNetscapeFuncs* browser = NPAPIClient::PluginClient::HostFunctions(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPBool supports_windowless = 0; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPError result = browser->getvalue(id(), NPNVSupportsWindowless, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &supports_windowless); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((result != NPERR_NO_ERROR) || (!supports_windowless)) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError("Failed to read NPNVSupportsWindowless value"); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PluginTest::HandleEvent(event); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WindowlessPluginTestEvent* np_event = 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reinterpret_cast<WindowlessPluginTestEvent*>(event); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsPaintEvent(np_event)) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint_counter_++; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC paint_dc = reinterpret_cast<HDC>(np_event->wParam); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (paint_dc == NULL) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError("Invalid Window DC passed to HandleEvent for WM_PAINT"); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPERR_GENERIC_ERROR; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRGN clipping_region = CreateRectRgn(0, 0, 0, 0); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetClipRgn(paint_dc, clipping_region)) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError("No clipping region set in window DC"); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteObject(clipping_region); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPERR_GENERIC_ERROR; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteObject(clipping_region); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_name() == "execute_script_delete_in_paint") { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteScriptDeleteInPaint(browser); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (test_name() == "multiple_instances_sync_calls") { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultipleInstanceSyncCalls(browser); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (test_name() == "resize_during_paint") { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (paint_counter_ == 1) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // So that we get another paint later. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->invalidaterect(id(), NULL); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (paint_counter_ == 2) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do this in the second paint since that's asynchronous. The first 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // paint will always be synchronous (since the renderer process doesn't 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have a cache of the plugin yet). If we try calling NPN_Evaluate while 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit is painting, it will assert since style recalc is happening 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // during painting. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteScriptResizeInPaint(browser); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // So that we can exit the test after the message loop is unrolled. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->pluginthreadasynccall(id(), OnFinishTest, this); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IsWindowActivationEvent(np_event) && 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_name() == "convert_point") { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertPoint(browser); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IsMouseUpEvent(np_event) && 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_name() == "execute_script_delete_in_mouse_up") { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteScript(browser, id(), "DeletePluginWithinScript();", NULL); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IsMouseUpEvent(np_event) && 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_name() == "delete_frame_test") { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteScript( 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser, id(), 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "parent.document.getElementById('frame').outerHTML = ''", NULL); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this test failed, then we'd have crashed by now. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PluginTest::HandleEvent(event); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError WindowlessPluginTest::ExecuteScript(NPNetscapeFuncs* browser, NPP id, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& script, NPVariant* result) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string script_url = "javascript:"; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) script_url += script; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t script_length = script_url.length(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (script_length != static_cast<uint32_t>(script_length)) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPERR_GENERIC_ERROR; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPString script_string = { script_url.c_str(), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<uint32_t>(script_length) }; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPObject *window_obj = NULL; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->getvalue(id, NPNVWindowNPObject, &window_obj); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPVariant unused_result; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = &unused_result; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser->evaluate(id, window_obj, &script_string, result); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowlessPluginTest::ExecuteScriptDeleteInPaint( 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPNetscapeFuncs* browser) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NPUTF8* urlString = "javascript:DeletePluginWithinScript()"; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NPUTF8* targetString = NULL; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->geturl(id(), urlString, targetString); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowlessPluginTest::ExecuteScriptResizeInPaint( 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPNetscapeFuncs* browser) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteScript(browser, id(), "ResizePluginWithinScript();", NULL); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowlessPluginTest::MultipleInstanceSyncCalls(NPNetscapeFuncs* browser) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this == g_other_instance) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(g_other_instance); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteScript(browser, g_other_instance->id(), "TestCallback();", NULL); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string StringForPoint(int x, int y) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string point_string("("); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) point_string.append(base::IntToString(x)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) point_string.append(", "); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) point_string.append(base::IntToString(y)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) point_string.append(")"); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return point_string; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowlessPluginTest::ConvertPoint(NPNetscapeFuncs* browser) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First, just sanity-test that round trips work. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPCoordinateSpace spaces[] = { NPCoordinateSpacePlugin, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPCoordinateSpaceWindow, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPCoordinateSpaceFlippedWindow, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPCoordinateSpaceScreen, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPCoordinateSpaceFlippedScreen }; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < arraysize(spaces); ++i) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int j = 0; j < arraysize(spaces); ++j) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double x, y, round_trip_x, round_trip_y; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(browser->convertpoint(id(), 0, 0, spaces[i], &x, &y, spaces[j])) || 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(browser->convertpoint(id(), x, y, spaces[j], &round_trip_x, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &round_trip_y, spaces[i]))) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError("Conversion failed"); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i != j && x == 0 && y == 0) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError("Converting a coordinate should change it"); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (round_trip_x != 0 || round_trip_y != 0) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError("Round-trip conversion should return the original point"); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, more extensive testing on a single point. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double screen_x, screen_y; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->convertpoint(id(), 0, 0, NPCoordinateSpacePlugin, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &screen_x, &screen_y, NPCoordinateSpaceScreen); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double flipped_screen_x, flipped_screen_y; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->convertpoint(id(), 0, 0, NPCoordinateSpacePlugin, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &flipped_screen_x, &flipped_screen_y, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPCoordinateSpaceFlippedScreen); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double window_x, window_y; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->convertpoint(id(), 0, 0, NPCoordinateSpacePlugin, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &window_x, &window_y, NPCoordinateSpaceWindow); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double flipped_window_x, flipped_window_y; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->convertpoint(id(), 0, 0, NPCoordinateSpacePlugin, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &flipped_window_x, &flipped_window_y, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPCoordinateSpaceFlippedWindow); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CGRect main_display_bounds = CGDisplayBounds(CGMainDisplayID()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that all the coordinates are right. The constants below are based on 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window frame set in the UI test and the content offset in the test 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // html. Y-coordinates are not checked exactly so that the test is robust 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // against toolbar changes, info and bookmark bar visibility, etc. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kWindowHeight = 400; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kWindowXOrigin = 50; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kWindowYOrigin = 50; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kPluginXContentOffset = 50; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kPluginYContentOffset = 50; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kChromeYTolerance = 200; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error_string; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (screen_x != flipped_screen_x) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string = "Flipping screen coordinates shouldn't change x"; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (flipped_screen_y != main_display_bounds.size.height - screen_y) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string = "Flipped screen coordinates should be flipped vertically"; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (screen_x != kWindowXOrigin + kPluginXContentOffset) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string = "Screen x location is wrong"; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (flipped_screen_y < kWindowYOrigin + kPluginYContentOffset || 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flipped_screen_y > kWindowYOrigin + kPluginYContentOffset + 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kChromeYTolerance) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string = "Screen y location is wrong"; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (window_x != flipped_window_x) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string = "Flipping window coordinates shouldn't change x"; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (flipped_window_y != kWindowHeight - window_y) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string = "Flipped window coordinates should be flipped vertically"; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (window_x != kPluginXContentOffset) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string = "Window x location is wrong"; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (flipped_window_y < kPluginYContentOffset || 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flipped_window_y > kPluginYContentOffset + kChromeYTolerance) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string = "Window y location is wrong"; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!error_string.empty()) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string.append(" - "); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string.append(StringForPoint(screen_x, screen_y)); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string.append(" - "); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string.append(StringForPoint(flipped_screen_x, flipped_screen_y)); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string.append(" - "); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string.append(StringForPoint(window_x, window_y)); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string.append(" - "); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string.append(StringForPoint(flipped_window_x, flipped_window_y)); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError(error_string); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError("Unimplemented"); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace NPAPIClient 316