[V8] Calendar Picker: Add a helper function to expose PagePopupClient::setValueAndClo...
authortkent@chromium.org <tkent@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Apr 2012 10:06:24 +0000 (10:06 +0000)
committertkent@chromium.org <tkent@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Apr 2012 10:06:24 +0000 (10:06 +0000)
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<DOMWindow> 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<DOMWindow>.
(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

Source/WebCore/ChangeLog
Source/WebCore/WebCore.gypi
Source/WebCore/bindings/v8/ScriptController.cpp
Source/WebCore/bindings/v8/ScriptController.h
Source/WebCore/page/DOMWindowPagePopup.cpp [new file with mode: 0644]
Source/WebCore/page/DOMWindowPagePopup.h [new file with mode: 0644]

index 2f4f8ab..de85aa7 100644 (file)
@@ -1,3 +1,36 @@
+2012-04-11  Kent Tamura  <tkent@chromium.org>
+
+        [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<DOMWindow> 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<DOMWindow>.
+        (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  <sadrul@chromium.org>
 
         [chromium] Add Battery Status API support.
index e4d9202..a22fbac 100644 (file)
             'page/DOMTimer.cpp',
             'page/DOMTimer.h',
             'page/DOMWindow.cpp',
+            'page/DOMWindowPagePopup.cpp',
+            'page/DOMWindowPagePopup.h',
             'page/DOMWindowProperty.cpp',
             'page/DOMWindowProperty.h',
             'page/DragController.cpp',
index c38425e..9c0165d 100644 (file)
@@ -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<v8::Value> 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<v8::Context> context = V8Proxy::mainWorldContext(frame);
+    if (context.IsEmpty()) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+    v8::Context::Scope scope(context);
+    DOMWindowPagePopup::install(frame->existingDOMWindow(), popupClient);
+    v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(setValueAndClosePopupCallback, V8DOMWindow::wrap(frame->existingDOMWindow()));
+    context->Global()->Set(v8::String::New("setValueAndClosePopup"), v8::Handle<v8::Function>(templ->GetFunction()));
+}
+#endif
+
 void ScriptController::collectGarbage()
 {
     v8::HandleScope handleScope;
index 743b12b..7b9e6ba 100644 (file)
@@ -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 (file)
index 0000000..994cd39
--- /dev/null
@@ -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<DOMWindowPagePopup*>(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 (file)
index 0000000..51fb85a
--- /dev/null
@@ -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<DOMWindow> {
+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