From: tkent@chromium.org Date: Wed, 11 Apr 2012 10:06:24 +0000 (+0000) Subject: [V8] Calendar Picker: Add a helper function to expose PagePopupClient::setValueAndClo... X-Git-Tag: 070512121124~7312 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ef15accc9277e95f486522ef15097f71ab2a731e;p=profile%2Fivi%2Fwebkit-efl.git [V8] Calendar Picker: Add a helper function to expose PagePopupClient::setValueAndClosePopup() to JavaScript https://bugs.webkit.org/show_bug.cgi?id=83561 Reviewed by Adam Barth. Add ScriptController::installFunctionsForPagePopup(), which add window.setValueAndClosePopup() for JavaScript code in PagePopup environment, and the function calls WebCore::PagePopupClient::setValueAndClosePopup(). This patch introduces Supplement object to hold a PagePopupClient object. It makes keeping a PagePopupClient easier. * WebCore.gypi: Add DOMWindowPagePopup.{cpp,h} * bindings/v8/ScriptController.cpp: (WebCore::setValueAndClosePopupCallback): (WebCore::ScriptController::installFunctionsForPagePopup): * bindings/v8/ScriptController.h: (ScriptController): Add installFunctionsForPagePopup(). * page/DOMWindowPagePopup.cpp: Added. (WebCore::DOMWindowPagePopup::DOMWindowPagePopup): (WebCore::DOMWindowPagePopup::supplementName): Returns "DOMWindowPagePopup" as a key of this Supplement. (WebCore::DOMWindowPagePopup::setValueAndClosePopup): Gets a DOMWindowPagePopup from the window, then calls PagePopupClient::setValueAndClosePopup(). (WebCore::DOMWindowPagePopup::install): On-demand creation of DOMWindowPagePopup doesn't work because it must have a PagePopupClient object. We need to install DOMWindowPagePopup explicitly. * page/DOMWindowPagePopup.h: Added. git-svn-id: http://svn.webkit.org/repository/webkit/trunk@113846 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 2f4f8ab..de85aa7 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,36 @@ +2012-04-11 Kent Tamura + + [V8] Calendar Picker: Add a helper function to expose PagePopupClient::setValueAndClosePopup() to JavaScript + https://bugs.webkit.org/show_bug.cgi?id=83561 + + Reviewed by Adam Barth. + + Add ScriptController::installFunctionsForPagePopup(), which add + window.setValueAndClosePopup() for JavaScript code in PagePopup + environment, and the function calls + WebCore::PagePopupClient::setValueAndClosePopup(). + + This patch introduces Supplement object to hold a + PagePopupClient object. It makes keeping a PagePopupClient easier. + + * WebCore.gypi: Add DOMWindowPagePopup.{cpp,h} + * bindings/v8/ScriptController.cpp: + (WebCore::setValueAndClosePopupCallback): + (WebCore::ScriptController::installFunctionsForPagePopup): + * bindings/v8/ScriptController.h: + (ScriptController): Add installFunctionsForPagePopup(). + * page/DOMWindowPagePopup.cpp: Added. + (WebCore::DOMWindowPagePopup::DOMWindowPagePopup): + (WebCore::DOMWindowPagePopup::supplementName): + Returns "DOMWindowPagePopup" as a key of this Supplement. + (WebCore::DOMWindowPagePopup::setValueAndClosePopup): + Gets a DOMWindowPagePopup from the window, then calls PagePopupClient::setValueAndClosePopup(). + (WebCore::DOMWindowPagePopup::install): + On-demand creation of DOMWindowPagePopup doesn't work because it + must have a PagePopupClient object. We need to install + DOMWindowPagePopup explicitly. + * page/DOMWindowPagePopup.h: Added. + 2012-04-11 Sadrul Habib Chowdhury [chromium] Add Battery Status API support. diff --git a/Source/WebCore/WebCore.gypi b/Source/WebCore/WebCore.gypi index e4d9202..a22fbac 100644 --- a/Source/WebCore/WebCore.gypi +++ b/Source/WebCore/WebCore.gypi @@ -2951,6 +2951,8 @@ 'page/DOMTimer.cpp', 'page/DOMTimer.h', 'page/DOMWindow.cpp', + 'page/DOMWindowPagePopup.cpp', + 'page/DOMWindowPagePopup.h', 'page/DOMWindowProperty.cpp', 'page/DOMWindowProperty.h', 'page/DragController.cpp', diff --git a/Source/WebCore/bindings/v8/ScriptController.cpp b/Source/WebCore/bindings/v8/ScriptController.cpp index c38425e..9c0165d 100644 --- a/Source/WebCore/bindings/v8/ScriptController.cpp +++ b/Source/WebCore/bindings/v8/ScriptController.cpp @@ -38,6 +38,7 @@ #include "ScriptCallStackFactory.h" #include "ScriptableDocumentParser.h" #include "DOMWindow.h" +#include "DOMWindowPagePopup.h" #include "Event.h" #include "EventListener.h" #include "EventNames.h" @@ -54,6 +55,7 @@ #include "Settings.h" #include "UserGestureIndicator.h" #include "V8Binding.h" +#include "V8BindingMacros.h" #include "V8BindingState.h" #include "V8DOMWindow.h" #include "V8Event.h" @@ -240,6 +242,36 @@ void ScriptController::bindToWindowObject(Frame* frame, const String& key, NPObj global->Set(v8String(key), value); } +#if ENABLE(PAGE_POPUP) +static v8::Handle setValueAndClosePopupCallback(const v8::Arguments& args) +{ + if (args.Length() < 2) + return throwError("Not enough arguments", V8Proxy::TypeError); + DOMWindow* imp = V8DOMWindow::toNative(args.Data()->ToObject()); + EXCEPTION_BLOCK(int, intValue, toInt32(MAYBE_MISSING_PARAMETER(args, 0, DefaultIsUndefined))); + STRING_TO_V8PARAMETER_EXCEPTION_BLOCK(V8Parameter<>, stringValue, MAYBE_MISSING_PARAMETER(args, 1, DefaultIsUndefined)); + DOMWindowPagePopup::setValueAndClosePopup(imp, intValue, stringValue); + // setValueAndClosePopup() deletes the window. Do not access it. + return v8::Undefined(); +} + +void ScriptController::installFunctionsForPagePopup(Frame* frame, PagePopupClient* popupClient) +{ + ASSERT(frame); + ASSERT(popupClient); + v8::HandleScope handleScope; + v8::Handle context = V8Proxy::mainWorldContext(frame); + if (context.IsEmpty()) { + ASSERT_NOT_REACHED(); + return; + } + v8::Context::Scope scope(context); + DOMWindowPagePopup::install(frame->existingDOMWindow(), popupClient); + v8::Local templ = v8::FunctionTemplate::New(setValueAndClosePopupCallback, V8DOMWindow::wrap(frame->existingDOMWindow())); + context->Global()->Set(v8::String::New("setValueAndClosePopup"), v8::Handle(templ->GetFunction())); +} +#endif + void ScriptController::collectGarbage() { v8::HandleScope handleScope; diff --git a/Source/WebCore/bindings/v8/ScriptController.h b/Source/WebCore/bindings/v8/ScriptController.h index 743b12b..7b9e6ba 100644 --- a/Source/WebCore/bindings/v8/ScriptController.h +++ b/Source/WebCore/bindings/v8/ScriptController.h @@ -59,6 +59,7 @@ class DOMWrapperWorld; class Event; class Frame; class HTMLPlugInElement; +class PagePopupClient; class ScriptSourceCode; class Widget; @@ -120,6 +121,9 @@ public: void bindToWindowObject(Frame*, const String& key, NPObject*); PassScriptInstance createScriptInstanceForWidget(Widget*); +#if ENABLE(PAGE_POPUP) + void installFunctionsForPagePopup(Frame*, PagePopupClient*); +#endif // Check if the javascript engine has been initialized. bool haveInterpreter() const; diff --git a/Source/WebCore/page/DOMWindowPagePopup.cpp b/Source/WebCore/page/DOMWindowPagePopup.cpp new file mode 100644 index 0000000..994cd39 --- /dev/null +++ b/Source/WebCore/page/DOMWindowPagePopup.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2012 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "DOMWindowPagePopup.h" + +#if ENABLE(PAGE_POPUP) +#include "DOMWindow.h" +#include "PagePopupClient.h" + +namespace WebCore { + +DOMWindowPagePopup::DOMWindowPagePopup(PagePopupClient* popupClient) + : m_popupClient(popupClient) +{ + ASSERT(popupClient); +} + +const AtomicString& DOMWindowPagePopup::supplementName() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("DOMWindowPagePopup")); + return name; +} + +void DOMWindowPagePopup::setValueAndClosePopup(DOMWindow* window, int intValue, const String& stringValue) +{ + DOMWindowPagePopup* supplement = static_cast(from(window, supplementName())); + ASSERT(supplement); + supplement->m_popupClient->setValueAndClosePopup(intValue, stringValue); + // setValueAndClosePopup() deletes the window and this object. Do not access them. +} + +void DOMWindowPagePopup::install(DOMWindow* window, PagePopupClient* popupClient) +{ + ASSERT(window); + ASSERT(popupClient); + provideTo(window, supplementName(), adoptPtr(new DOMWindowPagePopup(popupClient))); +} + +} +#endif diff --git a/Source/WebCore/page/DOMWindowPagePopup.h b/Source/WebCore/page/DOMWindowPagePopup.h new file mode 100644 index 0000000..51fb85a --- /dev/null +++ b/Source/WebCore/page/DOMWindowPagePopup.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2012 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DOMWindowPagePopup_h +#define DOMWindowPagePopup_h + +#if ENABLE(PAGE_POPUP) +#include "Supplementable.h" + +namespace WebCore { + +class DOMWindow; +class PagePopupClient; + +class DOMWindowPagePopup : public Supplement { +public: + static void setValueAndClosePopup(DOMWindow*, int intValue, const String& stringValue); + static void install(DOMWindow*, PagePopupClient*); + +private: + explicit DOMWindowPagePopup(PagePopupClient*); + static const AtomicString& supplementName(); + + PagePopupClient* m_popupClient; +}; + +} +#endif +#endif