Commit 90ba778d authored by abarth@webkit.org's avatar abarth@webkit.org

2010-12-31 Adam Barth <abarth@webkit.org>

        Reviewed by Eric Seidel.

        Move V8 to WebCore Location implementation
        https://bugs.webkit.org/show_bug.cgi?id=51768

        * bindings/generic/BindingFrame.h:
        * bindings/generic/BindingLocation.h:
        * bindings/v8/V8Binding.h:
        * bindings/v8/V8DOMWindowShell.cpp:
        (WebCore::V8DOMWindowShell::setLocation):
        * bindings/v8/V8Utilities.cpp:
        * bindings/v8/V8Utilities.h:
        * bindings/v8/custom/V8LocationCustom.cpp:
        (WebCore::V8Location::hashAccessorSetter):
        (WebCore::V8Location::hostAccessorSetter):
        (WebCore::V8Location::hostnameAccessorSetter):
        (WebCore::V8Location::hrefAccessorSetter):
        (WebCore::V8Location::pathnameAccessorSetter):
        (WebCore::V8Location::portAccessorSetter):
        (WebCore::V8Location::protocolAccessorSetter):
        (WebCore::V8Location::searchAccessorSetter):
        (WebCore::V8Location::reloadCallback):
        (WebCore::V8Location::replaceCallback):
        (WebCore::V8Location::assignCallback):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@74833 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 50a5de37
2010-12-31 Adam Barth <abarth@webkit.org>
Reviewed by Eric Seidel.
Move V8 to WebCore Location implementation
https://bugs.webkit.org/show_bug.cgi?id=51768
* bindings/generic/BindingFrame.h:
* bindings/generic/BindingLocation.h:
* bindings/v8/V8Binding.h:
* bindings/v8/V8DOMWindowShell.cpp:
(WebCore::V8DOMWindowShell::setLocation):
* bindings/v8/V8Utilities.cpp:
* bindings/v8/V8Utilities.h:
* bindings/v8/custom/V8LocationCustom.cpp:
(WebCore::V8Location::hashAccessorSetter):
(WebCore::V8Location::hostAccessorSetter):
(WebCore::V8Location::hostnameAccessorSetter):
(WebCore::V8Location::hrefAccessorSetter):
(WebCore::V8Location::pathnameAccessorSetter):
(WebCore::V8Location::portAccessorSetter):
(WebCore::V8Location::protocolAccessorSetter):
(WebCore::V8Location::searchAccessorSetter):
(WebCore::V8Location::reloadCallback):
(WebCore::V8Location::replaceCallback):
(WebCore::V8Location::assignCallback):
2010-12-31 Yi Shen <yi.4.shen@nokia.com>
Reviewed by Eric Seidel.
......
......@@ -31,28 +31,6 @@
#ifndef BindingFrame_h
#define BindingFrame_h
#include "Frame.h"
#include "GenericBinding.h"
namespace WebCore {
template <class Binding>
class BindingFrame {
public:
static void navigateIfAllowed(State<Binding>*, Frame*, const KURL&, bool lockHistory, bool lockBackForwardList);
};
template <class Binding>
void BindingFrame<Binding>::navigateIfAllowed(State<Binding>* state, Frame* frame, const KURL& url, bool lockHistory, bool lockBackForwardList)
{
Frame* activeFrame = state->activeFrame();
if (!activeFrame)
return;
if (!protocolIsJavaScript(url) || state->allowsAccessFromFrame(frame))
frame->navigationScheduler()->scheduleLocationChange(activeFrame->document()->securityOrigin(),
url.string(), activeFrame->loader()->outgoingReferrer(), lockHistory, lockBackForwardList);
}
} // namespace WebCore
// FIXME: Remove this file.
#endif // BindingFrame_h
......@@ -31,35 +31,6 @@
#ifndef BindingLocation_h
#define BindingLocation_h
#include "BindingSecurity.h"
#include "GenericBinding.h"
#include "Location.h"
namespace WebCore {
template <class Binding>
class BindingLocation {
public:
static void replace(State<Binding>*, Location*, const String& url);
};
template <class Binding>
void BindingLocation<Binding>::replace(State<Binding>* state, Location* location, const String& url)
{
Frame* frame = location->frame();
if (!frame)
return;
KURL fullURL = completeURL(state, url);
if (fullURL.isNull())
return;
if (!BindingSecurity<Binding>::shouldAllowNavigation(state, frame))
return;
Binding::Frame::navigateIfAllowed(state, frame, fullURL, true, true);
}
} // namespace WebCore
// FIXME: Remove this file.
#endif // BindingLocation_h
......@@ -31,8 +31,6 @@
#ifndef V8Binding_h
#define V8Binding_h
#include "BindingFrame.h"
#include "BindingLocation.h"
#include "BindingSecurity.h"
#include "MathExtras.h"
#include "PlatformString.h"
......@@ -45,17 +43,9 @@ namespace WebCore {
class EventListener;
class EventTarget;
class V8BindingDOMWindow;
// Instantiate binding template classes for V8.
// FIXME: Remove V8Binding.
class V8Binding {
public:
typedef v8::Handle<v8::Value> Value;
typedef V8BindingDOMWindow DOMWindow;
typedef BindingFrame<V8Binding> Frame;
typedef BindingLocation<V8Binding> Location;
static Value emptyScriptValue() { return v8::Local<v8::Value>(); }
};
typedef BindingSecurity<V8Binding> V8BindingSecurity;
......
......@@ -578,20 +578,10 @@ v8::Local<v8::Object> V8DOMWindowShell::createWrapperFromCacheSlowCase(WrapperTy
return notHandledByInterceptor();
}
void V8DOMWindowShell::setLocation(DOMWindow* window, const String& relativeURL)
void V8DOMWindowShell::setLocation(DOMWindow* window, const String& locationString)
{
Frame* frame = window->frame();
if (!frame)
return;
KURL url = completeURL(relativeURL);
if (url.isNull())
return;
if (!shouldAllowNavigation(frame))
return;
navigateIfAllowed(frame, url, false, false);
State<V8Binding>* state = V8BindingState::Only();
window->setLocation(locationString, state->activeWindow(), state->firstWindow());
}
} // WebCore
......@@ -114,11 +114,6 @@ KURL completeURL(const String& relativeURL)
return completeURL(V8BindingState::Only(), relativeURL);
}
void navigateIfAllowed(Frame* frame, const KURL& url, bool lockHistory, bool lockBackForwardList)
{
return V8Binding::Frame::navigateIfAllowed(V8BindingState::Only(), frame, url, lockHistory, lockBackForwardList);
}
ScriptExecutionContext* getScriptExecutionContext()
{
#if ENABLE(WORKERS)
......
......@@ -52,7 +52,6 @@ namespace WebCore {
bool processingUserGesture();
bool shouldAllowNavigation(Frame*);
KURL completeURL(const String& relativeURL);
void navigateIfAllowed(Frame*, const KURL&, bool lockHistory, bool lockBackForwardList);
ScriptExecutionContext* getScriptExecutionContext();
......
......@@ -48,170 +48,103 @@
namespace WebCore {
// Notes about V8/JSC porting of this file.
// This class is not very JS-engine specific. If we can move a couple of
// methods to the scriptController, we should be able to unify the code
// between JSC and V8:
// toCallingFrame() - in JSC, this needs an ExecState.
// isSafeScript()
// Since JSC and V8 have different mechanisms for getting at the calling frame,
// we're just making all these custom for now. The functionality is simple
// and mirrors JSLocationCustom.cpp.
void V8Location::hashAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
{
INC_STATS("DOM.Location.hash._set");
v8::Handle<v8::Object> holder = info.Holder();
Location* imp = V8Location::toNative(holder);
String hash = toWebCoreString(value);
Frame* frame = imp->frame();
if (!frame)
return;
Location* impl = V8Location::toNative(info.Holder());
State<V8Binding>* state = V8BindingState::Only();
KURL url = frame->loader()->url();
String oldRef = url.fragmentIdentifier();
if (hash.startsWith("#"))
hash = hash.substring(1);
// Note that by parsing the URL and *then* comparing fragments, we are
// comparing fragments post-canonicalization, and so this handles the
// cases where fragment identifiers are ignored or invalid.
url.setFragmentIdentifier(hash);
String newRef = url.fragmentIdentifier();
if (oldRef == newRef || (oldRef.isNull() && newRef.isEmpty()))
return;
// FIXME: Handle exceptions correctly.
String hash = toWebCoreString(value);
navigateIfAllowed(frame, url, false, false);
impl->setHash(hash, state->activeWindow(), state->firstWindow());
}
void V8Location::hostAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
{
INC_STATS("DOM.Location.host._set");
v8::Handle<v8::Object> holder = info.Holder();
Location* imp = V8Location::toNative(holder);
String host = toWebCoreString(value);
Frame* frame = imp->frame();
if (!frame)
return;
Location* impl = V8Location::toNative(info.Holder());
State<V8Binding>* state = V8BindingState::Only();
KURL url = frame->loader()->url();
String newHost = host.left(host.find(":"));
String newPort = host.substring(host.find(":") + 1);
url.setHost(newHost);
url.setPort(newPort.toUInt());
// FIXME: Handle exceptions correctly.
String host = toWebCoreString(value);
navigateIfAllowed(frame, url, false, false);
impl->setHost(host, state->activeWindow(), state->firstWindow());
}
void V8Location::hostnameAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
{
INC_STATS("DOM.Location.hostname._set");
v8::Handle<v8::Object> holder = info.Holder();
Location* imp = V8Location::toNative(holder);
String hostname = toWebCoreString(value);
Location* impl = V8Location::toNative(info.Holder());
State<V8Binding>* state = V8BindingState::Only();
Frame* frame = imp->frame();
if (!frame)
return;
KURL url = frame->loader()->url();
url.setHost(hostname);
// FIXME: Handle exceptions correctly.
String hostname = toWebCoreString(value);
navigateIfAllowed(frame, url, false, false);
impl->setHostname(hostname, state->activeWindow(), state->firstWindow());
}
void V8Location::hrefAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
{
INC_STATS("DOM.Location.href._set");
v8::Handle<v8::Object> holder = info.Holder();
Location* imp = V8Location::toNative(holder);
Location* impl = V8Location::toNative(info.Holder());
State<V8Binding>* state = V8BindingState::Only();
Frame* frame = imp->frame();
if (!frame)
return;
// FIXME: Handle exceptions correctly.
String href = toWebCoreString(value);
KURL url = completeURL(toWebCoreString(value));
if (url.isNull())
return;
if (!shouldAllowNavigation(frame))
return;
navigateIfAllowed(frame, url, false, false);
impl->setHref(href, state->activeWindow(), state->firstWindow());
}
void V8Location::pathnameAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
{
INC_STATS("DOM.Location.pathname._set");
v8::Handle<v8::Object> holder = info.Holder();
Location* imp = V8Location::toNative(holder);
String pathname = toWebCoreString(value);
Frame* frame = imp->frame();
if (!frame)
return;
Location* impl = V8Location::toNative(info.Holder());
State<V8Binding>* state = V8BindingState::Only();
KURL url = frame->loader()->url();
url.setPath(pathname);
// FIXME: Handle exceptions correctly.
String pathname = toWebCoreString(value);
navigateIfAllowed(frame, url, false, false);
impl->setPathname(pathname, state->activeWindow(), state->firstWindow());
}
void V8Location::portAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
{
INC_STATS("DOM.Location.port._set");
v8::Handle<v8::Object> holder = info.Holder();
Location* imp = V8Location::toNative(holder);
String port = toWebCoreString(value);
Frame* frame = imp->frame();
if (!frame)
return;
Location* impl = V8Location::toNative(info.Holder());
State<V8Binding>* state = V8BindingState::Only();
KURL url = frame->loader()->url();
url.setPort(port.toUInt());
// FIXME: Handle exceptions correctly.
String port = toWebCoreString(value);
navigateIfAllowed(frame, url, false, false);
impl->setPort(port, state->activeWindow(), state->firstWindow());
}
void V8Location::protocolAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
{
INC_STATS("DOM.Location.protocol._set");
v8::Handle<v8::Object> holder = info.Holder();
Location* imp = V8Location::toNative(holder);
String protocol = toWebCoreString(value);
Location* impl = V8Location::toNative(info.Holder());
State<V8Binding>* state = V8BindingState::Only();
Frame* frame = imp->frame();
if (!frame)
return;
KURL url = frame->loader()->url();
if (!url.setProtocol(protocol)) {
throwError("Can't set protocol", V8Proxy::SyntaxError);
return;
}
// FIXME: Handle exceptions correctly.
String protocol = toWebCoreString(value);
navigateIfAllowed(frame, url, false, false);
ExceptionCode ec = 0;
impl->setProtocol(protocol, state->activeWindow(), state->firstWindow(), ec);
if (UNLIKELY(ec))
V8Proxy::setDOMException(ec);
}
void V8Location::searchAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
{
INC_STATS("DOM.Location.search._set");
v8::Handle<v8::Object> holder = info.Holder();
Location* imp = V8Location::toNative(holder);
String query = toWebCoreString(value);
Frame* frame = imp->frame();
if (!frame)
return;
Location* impl = V8Location::toNative(info.Holder());
State<V8Binding>* state = V8BindingState::Only();
KURL url = frame->loader()->url();
url.setQuery(query);
// FIXME: Handle exceptions correctly.
String search = toWebCoreString(value);
navigateIfAllowed(frame, url, false, false);
impl->setSearch(search, state->activeWindow(), state->firstWindow());
}
v8::Handle<v8::Value> V8Location::reloadAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
......@@ -271,48 +204,37 @@ v8::Handle<v8::Value> V8Location::assignAccessorGetter(v8::Local<v8::String> nam
v8::Handle<v8::Value> V8Location::reloadCallback(const v8::Arguments& args)
{
// FIXME: we ignore the "forceget" parameter.
INC_STATS("DOM.Location.reload");
v8::Handle<v8::Object> holder = args.Holder();
Location* imp = V8Location::toNative(holder);
Frame* frame = imp->frame();
if (!frame || !ScriptController::isSafeScript(frame))
return v8::Undefined();
Location* impl = V8Location::toNative(args.Holder());
State<V8Binding>* state = V8BindingState::Only();
if (!protocolIsJavaScript(frame->loader()->url()))
frame->navigationScheduler()->scheduleRefresh();
impl->reload(state->activeWindow());
return v8::Undefined();
}
v8::Handle<v8::Value> V8Location::replaceCallback(const v8::Arguments& args)
{
INC_STATS("DOM.Location.replace");
v8::Handle<v8::Object> holder = args.Holder();
Location* imp = V8Location::toNative(holder);
V8Binding::Location::replace(V8BindingState::Only(), imp, toWebCoreString(args[0]));
Location* impl = V8Location::toNative(args.Holder());
State<V8Binding>* state = V8BindingState::Only();
// FIXME: Handle exceptions correctly.
String urlString = toWebCoreString(args[0]);
impl->replace(urlString, state->activeWindow(), state->firstWindow());
return v8::Undefined();
}
v8::Handle<v8::Value> V8Location::assignCallback(const v8::Arguments& args)
{
INC_STATS("DOM.Location.assign");
v8::Handle<v8::Object> holder = args.Holder();
Location* imp = V8Location::toNative(holder);
Frame* frame = imp->frame();
if (!frame)
return v8::Undefined();
Location* impl = V8Location::toNative(args.Holder());
State<V8Binding>* state = V8BindingState::Only();
KURL url = completeURL(toWebCoreString(args[0]));
if (url.isNull())
return v8::Undefined();
if (!shouldAllowNavigation(frame))
return v8::Undefined();
// FIXME: Handle exceptions correctly.
String urlString = toWebCoreString(args[0]);
navigateIfAllowed(frame, url, false, false);
impl->assign(urlString, state->activeWindow(), state->firstWindow());
return v8::Undefined();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment