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
+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.
'page/DOMTimer.cpp',
'page/DOMTimer.h',
'page/DOMWindow.cpp',
+ 'page/DOMWindowPagePopup.cpp',
+ 'page/DOMWindowPagePopup.h',
'page/DOMWindowProperty.cpp',
'page/DOMWindowProperty.h',
'page/DragController.cpp',
#include "ScriptCallStackFactory.h"
#include "ScriptableDocumentParser.h"
#include "DOMWindow.h"
+#include "DOMWindowPagePopup.h"
#include "Event.h"
#include "EventListener.h"
#include "EventNames.h"
#include "Settings.h"
#include "UserGestureIndicator.h"
#include "V8Binding.h"
+#include "V8BindingMacros.h"
#include "V8BindingState.h"
#include "V8DOMWindow.h"
#include "V8Event.h"
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;
class Event;
class Frame;
class HTMLPlugInElement;
+class PagePopupClient;
class ScriptSourceCode;
class Widget;
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;
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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