15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 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_create_instance_in_paint.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/test/plugin/plugin_client.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace NPAPIClient {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CreateInstanceInPaintTest::CreateInstanceInPaintTest(
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NPP id, NPNetscapeFuncs *host_functions)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : PluginTest(id, host_functions),
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_(NULL), created_(false) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError CreateInstanceInPaintTest::SetWindow(NPWindow* pNPWindow) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pNPWindow->window == NULL)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NPERR_NO_ERROR;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test_id() == "1") {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!window_) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static ATOM window_class = 0;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!window_class) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WNDCLASSEX wcex;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.cbSize         = sizeof(WNDCLASSEX);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.style          = CS_DBLCLKS;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.lpfnWndProc    =
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &NPAPIClient::CreateInstanceInPaintTest::WindowProc;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.cbClsExtra     = 0;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.cbWndExtra     = 0;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.hInstance      = GetModuleHandle(NULL);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.hIcon          = 0;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.hCursor        = 0;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.hbrBackground  = reinterpret_cast<HBRUSH>(COLOR_WINDOW+1);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.lpszMenuName   = 0;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.lpszClassName  = L"CreateInstanceInPaintTestWindowClass";
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcex.hIconSm        = 0;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_class = RegisterClassEx(&wcex);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HWND parent = reinterpret_cast<HWND>(pNPWindow->window);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_ = CreateWindowEx(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          MAKEINTATOM(window_class), 0,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE ,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, 0, 100, 100, parent, 0, GetModuleHandle(NULL), 0);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(window_);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO: this property leaks.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::SetProp(window_, L"Plugin_Instance", this);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (test_id() == "2") {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SignalTestCompleted();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_NO_ERROR;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LRESULT CALLBACK CreateInstanceInPaintTest::WindowProc(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HWND window, UINT message, WPARAM wparam, LPARAM lparam) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message == WM_PAINT) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateInstanceInPaintTest* this_instance =
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reinterpret_cast<CreateInstanceInPaintTest*>
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (::GetProp(window, L"Plugin_Instance"));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (this_instance->test_id() == "1" && !this_instance->created_) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::RemoveProp(window, L"Plugin_Instance");
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this_instance->created_ = true;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this_instance->HostFunctions()->geturlnotify(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this_instance->id(), "javascript:CreateNewInstance()", NULL,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reinterpret_cast<void*>(1));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DefWindowProc(window, message, wparam, lparam);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace NPAPIClient
80