summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/js/JSLocationCustom.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bindings/js/JSLocationCustom.cpp')
-rw-r--r--WebCore/bindings/js/JSLocationCustom.cpp359
1 files changed, 0 insertions, 359 deletions
diff --git a/WebCore/bindings/js/JSLocationCustom.cpp b/WebCore/bindings/js/JSLocationCustom.cpp
deleted file mode 100644
index b00249f..0000000
--- a/WebCore/bindings/js/JSLocationCustom.cpp
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Copyright (C) 2000 Harri Porten (porten@kde.org)
- * Copyright (C) 2006 Jon Shier (jshier@iastate.edu)
- * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reseved.
- * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
- * USA
- */
-
-#include "config.h"
-#include "JSLocationCustom.h"
-
-#include "DOMWindow.h"
-#include "ExceptionCode.h"
-#include "Frame.h"
-#include "FrameLoader.h"
-#include "JSBinding.h"
-#include "JSBindingState.h"
-#include "JSDOMBinding.h"
-#include "JSDOMWindowCustom.h"
-#include "KURL.h"
-#include "Location.h"
-#include "ScriptController.h"
-#include <runtime/JSFunction.h>
-#include <runtime/PrototypeFunction.h>
-
-using namespace JSC;
-
-namespace WebCore {
-
-static JSValue nonCachingStaticReplaceFunctionGetter(ExecState* exec, JSValue, const Identifier& propertyName)
-{
- return new (exec) NativeFunctionWrapper(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->prototypeFunctionStructure(), 1, propertyName, jsLocationPrototypeFunctionReplace);
-}
-
-static JSValue nonCachingStaticReloadFunctionGetter(ExecState* exec, JSValue, const Identifier& propertyName)
-{
- return new (exec) NativeFunctionWrapper(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->prototypeFunctionStructure(), 0, propertyName, jsLocationPrototypeFunctionReload);
-}
-
-static JSValue nonCachingStaticAssignFunctionGetter(ExecState* exec, JSValue, const Identifier& propertyName)
-{
- return new (exec) NativeFunctionWrapper(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->prototypeFunctionStructure(), 1, propertyName, jsLocationPrototypeFunctionAssign);
-}
-
-bool JSLocation::getOwnPropertySlotDelegate(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
-{
- Frame* frame = impl()->frame();
- if (!frame) {
- slot.setUndefined();
- return true;
- }
-
- // When accessing Location cross-domain, functions are always the native built-in ones.
- // See JSDOMWindow::getOwnPropertySlotDelegate for additional details.
-
- // Our custom code is only needed to implement the Window cross-domain scheme, so if access is
- // allowed, return false so the normal lookup will take place.
- String message;
- if (allowsAccessFromFrame(exec, frame, message))
- return false;
-
- // Check for the few functions that we allow, even when called cross-domain.
- const HashEntry* entry = JSLocationPrototype::s_info.propHashTable(exec)->entry(exec, propertyName);
- if (entry && (entry->attributes() & Function)) {
- if (entry->function() == jsLocationPrototypeFunctionReplace) {
- slot.setCustom(this, nonCachingStaticReplaceFunctionGetter);
- return true;
- } else if (entry->function() == jsLocationPrototypeFunctionReload) {
- slot.setCustom(this, nonCachingStaticReloadFunctionGetter);
- return true;
- } else if (entry->function() == jsLocationPrototypeFunctionAssign) {
- slot.setCustom(this, nonCachingStaticAssignFunctionGetter);
- return true;
- }
- }
-
- // FIXME: Other implementers of the Window cross-domain scheme (Window, History) allow toString,
- // but for now we have decided not to, partly because it seems silly to return "[Object Location]" in
- // such cases when normally the string form of Location would be the URL.
-
- printErrorMessageForFrame(frame, message);
- slot.setUndefined();
- return true;
-}
-
-bool JSLocation::getOwnPropertyDescriptorDelegate(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
-{
- Frame* frame = impl()->frame();
- if (!frame) {
- descriptor.setUndefined();
- return true;
- }
-
- // throw out all cross domain access
- if (!allowsAccessFromFrame(exec, frame))
- return true;
-
- // Check for the few functions that we allow, even when called cross-domain.
- const HashEntry* entry = JSLocationPrototype::s_info.propHashTable(exec)->entry(exec, propertyName);
- PropertySlot slot;
- if (entry && (entry->attributes() & Function)) {
- if (entry->function() == jsLocationPrototypeFunctionReplace) {
- slot.setCustom(this, nonCachingStaticReplaceFunctionGetter);
- descriptor.setDescriptor(slot.getValue(exec, propertyName), entry->attributes());
- return true;
- } else if (entry->function() == jsLocationPrototypeFunctionReload) {
- slot.setCustom(this, nonCachingStaticReloadFunctionGetter);
- descriptor.setDescriptor(slot.getValue(exec, propertyName), entry->attributes());
- return true;
- } else if (entry->function() == jsLocationPrototypeFunctionAssign) {
- slot.setCustom(this, nonCachingStaticAssignFunctionGetter);
- descriptor.setDescriptor(slot.getValue(exec, propertyName), entry->attributes());
- return true;
- }
- }
-
- // FIXME: Other implementers of the Window cross-domain scheme (Window, History) allow toString,
- // but for now we have decided not to, partly because it seems silly to return "[Object Location]" in
- // such cases when normally the string form of Location would be the URL.
-
- descriptor.setUndefined();
- return true;
-}
-
-bool JSLocation::putDelegate(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
-{
- Frame* frame = impl()->frame();
- if (!frame)
- return true;
-
- if (propertyName == exec->propertyNames().toString || propertyName == exec->propertyNames().valueOf)
- return true;
-
- bool sameDomainAccess = allowsAccessFromFrame(exec, frame);
-
- const HashEntry* entry = JSLocation::s_info.propHashTable(exec)->entry(exec, propertyName);
- if (!entry) {
- if (sameDomainAccess)
- JSObject::put(exec, propertyName, value, slot);
- return true;
- }
-
- // Cross-domain access to the location is allowed when assigning the whole location,
- // but not when assigning the individual pieces, since that might inadvertently
- // disclose other parts of the original location.
- if (entry->propertyPutter() != setJSLocationHref && !sameDomainAccess)
- return true;
-
- return false;
-}
-
-bool JSLocation::deleteProperty(ExecState* exec, const Identifier& propertyName)
-{
- // Only allow deleting by frames in the same origin.
- if (!allowsAccessFromFrame(exec, impl()->frame()))
- return false;
- return Base::deleteProperty(exec, propertyName);
-}
-
-void JSLocation::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode)
-{
- // Only allow the location object to enumerated by frames in the same origin.
- if (!allowsAccessFromFrame(exec, impl()->frame()))
- return;
- Base::getOwnPropertyNames(exec, propertyNames, mode);
-}
-
-void JSLocation::defineGetter(ExecState* exec, const Identifier& propertyName, JSObject* getterFunction, unsigned attributes)
-{
- if (propertyName == exec->propertyNames().toString || propertyName == exec->propertyNames().valueOf)
- return;
- Base::defineGetter(exec, propertyName, getterFunction, attributes);
-}
-
-static void navigateIfAllowed(ExecState* exec, Frame* frame, const KURL& url, bool lockHistory, bool lockBackForwardList)
-{
- JSBindingState state(exec);
- JSBinding::Frame::navigateIfAllowed(&state, frame, url, lockHistory, lockBackForwardList);
-}
-
-void JSLocation::setHref(ExecState* exec, JSValue value)
-{
- Frame* frame = impl()->frame();
- ASSERT(frame);
-
- KURL url = completeURL(exec, ustringToString(value.toString(exec)));
- if (url.isNull())
- return;
-
- if (!shouldAllowNavigation(exec, frame))
- return;
-
- navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false);
-}
-
-void JSLocation::setProtocol(ExecState* exec, JSValue value)
-{
- Frame* frame = impl()->frame();
- ASSERT(frame);
-
- KURL url = frame->loader()->url();
- if (!url.setProtocol(ustringToString(value.toString(exec)))) {
- setDOMException(exec, SYNTAX_ERR);
- return;
- }
-
- navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false);
-}
-
-void JSLocation::setHost(ExecState* exec, JSValue value)
-{
- Frame* frame = impl()->frame();
- ASSERT(frame);
-
- KURL url = frame->loader()->url();
- url.setHostAndPort(ustringToString(value.toString(exec)));
-
- navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false);
-}
-
-void JSLocation::setHostname(ExecState* exec, JSValue value)
-{
- Frame* frame = impl()->frame();
- ASSERT(frame);
-
- KURL url = frame->loader()->url();
- url.setHost(ustringToString(value.toString(exec)));
-
- navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false);
-}
-
-void JSLocation::setPort(ExecState* exec, JSValue value)
-{
- Frame* frame = impl()->frame();
- ASSERT(frame);
-
- KURL url = frame->loader()->url();
- // FIXME: Could make this a little less ugly if String provided a toUnsignedShort function.
- const UString& portString = value.toString(exec);
- int port = charactersToInt(portString.characters(), portString.length());
- if (port < 0 || port > 0xFFFF)
- url.removePort();
- else
- url.setPort(port);
-
- navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false);
-}
-
-void JSLocation::setPathname(ExecState* exec, JSValue value)
-{
- Frame* frame = impl()->frame();
- ASSERT(frame);
-
- KURL url = frame->loader()->url();
- url.setPath(ustringToString(value.toString(exec)));
-
- navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false);
-}
-
-void JSLocation::setSearch(ExecState* exec, JSValue value)
-{
- Frame* frame = impl()->frame();
- ASSERT(frame);
-
- KURL url = frame->loader()->url();
- url.setQuery(ustringToString(value.toString(exec)));
-
- navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false);
-}
-
-void JSLocation::setHash(ExecState* exec, JSValue value)
-{
- Frame* frame = impl()->frame();
- ASSERT(frame);
-
- KURL url = frame->loader()->url();
- String oldFragmentIdentifier = url.fragmentIdentifier();
- String str = ustringToString(value.toString(exec));
- if (str.startsWith("#"))
- str = str.substring(1);
- if (equalIgnoringNullity(oldFragmentIdentifier, str))
- return;
- url.setFragmentIdentifier(str);
-
- navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false);
-}
-
-JSValue JSLocation::replace(ExecState* exec)
-{
- JSBindingState state(exec);
- JSBinding::Location::replace(&state, impl(), ustringToString(exec->argument(0).toString(exec)));
- return jsUndefined();
-}
-
-JSValue JSLocation::reload(ExecState* exec)
-{
- Frame* frame = impl()->frame();
- if (!frame || !allowsAccessFromFrame(exec, frame))
- return jsUndefined();
-
- if (!protocolIsJavaScript(frame->loader()->url()))
- frame->navigationScheduler()->scheduleRefresh();
- return jsUndefined();
-}
-
-JSValue JSLocation::assign(ExecState* exec)
-{
- Frame* frame = impl()->frame();
- if (!frame)
- return jsUndefined();
-
- KURL url = completeURL(exec, ustringToString(exec->argument(0).toString(exec)));
- if (url.isNull())
- return jsUndefined();
-
- if (!shouldAllowNavigation(exec, frame))
- return jsUndefined();
-
- // We want a new history item if this JS was called via a user gesture
- navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false);
- return jsUndefined();
-}
-
-JSValue JSLocation::toString(ExecState* exec)
-{
- Frame* frame = impl()->frame();
- if (!frame || !allowsAccessFromFrame(exec, frame))
- return jsUndefined();
-
- return jsString(exec, impl()->toString());
-}
-
-bool JSLocationPrototype::putDelegate(ExecState* exec, const Identifier& propertyName, JSValue, PutPropertySlot&)
-{
- return (propertyName == exec->propertyNames().toString || propertyName == exec->propertyNames().valueOf);
-}
-
-void JSLocationPrototype::defineGetter(ExecState* exec, const Identifier& propertyName, JSObject* getterFunction, unsigned attributes)
-{
- if (propertyName == exec->propertyNames().toString || propertyName == exec->propertyNames().valueOf)
- return;
- Base::defineGetter(exec, propertyName, getterFunction, attributes);
-}
-
-} // namespace WebCore