plugin_javascript_open_popup.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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) 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/test/plugin/plugin_javascript_open_popup.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/npapi/bindings/npapi_x11.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/test/plugin/plugin_client.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace NPAPIClient { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExecuteJavascriptOpenPopupWithPluginTest:: 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteJavascriptOpenPopupWithPluginTest(NPP id, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPNetscapeFuncs *host_functions) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : PluginTest(id, host_functions), 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_window_test_started_(false) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int16 ExecuteJavascriptOpenPopupWithPluginTest::SetWindow( 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPWindow* window) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window->window == NULL) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPERR_NO_ERROR; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!popup_window_test_started_) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_window_test_started_ = true; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostFunctions()->geturl( 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id(), "popup_window_with_target_plugin.html", "_blank"); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPERR_NO_ERROR; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExecuteJavascriptPopupWindowTargetPluginTest member defines. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExecuteJavascriptPopupWindowTargetPluginTest:: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteJavascriptPopupWindowTargetPluginTest( 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPP id, NPNetscapeFuncs* host_functions) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : PluginTest(id, host_functions), 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_completed_(false) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int16 ExecuteJavascriptPopupWindowTargetPluginTest::SetWindow( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPWindow* window) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window->window == NULL) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPERR_NO_ERROR; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!test_completed_) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CheckWindow(window)) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalTestCompleted(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_completed_ = true; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PluginTest::SetWindow(window); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExecuteJavascriptPopupWindowTargetPluginTest::CheckWindow( 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPWindow* window) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND window_handle = reinterpret_cast<HWND>(window->window); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsWindow(window_handle)) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND parent_window = GetParent(window_handle); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsWindow(parent_window)) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError("Windowed plugin instantiated with NULL parent"); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This code blindly follows the same sorts of verifications done on 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the Windows side. Does it make sense on X? Maybe not really, but 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it can't hurt to do extra validations. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExecuteJavascriptPopupWindowTargetPluginTest::CheckWindow( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPWindow* window) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Window xwindow = reinterpret_cast<Window>(window->window); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Grab a pointer to the extra SetWindow data so we can grab the display out. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPSetWindowCallbackStruct* extra = 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<NPSetWindowCallbackStruct*>(window->ws_info); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xwindow) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Window root, parent; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Window* wins = NULL; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int num_child; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Status status = XQueryTree(extra->display, xwindow, &root, &parent, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &wins, &num_child); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (wins) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XFree(wins); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(status != 0); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!parent || parent == root) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetError("Windowed plugin instantiated with NULL parent"); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExecuteJavascriptPopupWindowTargetPluginTest::CheckWindow( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPWindow* window) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(port) scaffolding--replace with a real test once NPWindow is done. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace NPAPIClient 114