Reviewed by Darin.
<rdar://problem/
4005575> Arbitrary file disclosure vulnerability due to ability to load local html from remote content
* khtml/ecma/kjs_html.cpp:
(KJS::HTMLDocument::putValue):
* khtml/ecma/kjs_window.cpp:
(Window::put):
(WindowFunc::tryCall):
(Location::put):
(LocationFunc::tryCall):
* khtml/khtml_part.cpp:
(KHTMLPart::begin):
(KHTMLPart::scheduleLocationChange):
(KHTMLPart::slotRedirect):
(KHTMLPart::processObjectRequest):
* khtml/khtml_part.h:
* khtml/khtmlpart_p.h:
* kwq/KWQKHTMLPart.mm:
(KWQKHTMLPart::openURLRequest):
(KWQKHTMLPart::urlSelected):
(KWQKHTMLPart::createPart):
* kwq/KWQKHTMLPartBrowserExtension.mm:
(KHTMLPartBrowserExtension::createNewWindow):
* kwq/WebCoreBridge.h:
* kwq/WebCoreBridge.mm:
(hasCaseInsensitivePrefix):
(-[WebCoreBridge didNotOpenURL:pageCache:]):
(-[WebCoreBridge canLoadURL:fromReferrer:hideReferrer:]):
WebKit:
Reviewed by Darin.
<rdar://problem/
4005575> Arbitrary file disclosure vulnerability due to ability to load local html from remote content
* Plugins.subproj/WebBaseNetscapePluginView.m:
(-[WebBaseNetscapePluginView requestWithURLCString:]):
* Plugins.subproj/WebNetscapePluginEmbeddedView.m:
(-[WebNetscapePluginEmbeddedView didStart]):
* Plugins.subproj/WebNetscapePluginStream.m:
(-[WebNetscapePluginStream initWithRequest:pluginPointer:notifyData:sendNotification:]):
* WebCoreSupport.subproj/WebBridge.m:
(-[WebBridge createWindowWithURL:frameName:]):
(-[WebBridge startLoadingResource:withURL:customHeaders:]):
(-[WebBridge startLoadingResource:withURL:customHeaders:postData:]):
(-[WebBridge syncLoadResourceWithURL:customHeaders:postData:finalURL:responseHeaders:statusCode:]):
(-[WebBridge loadURL:referrer:reload:userGesture:target:triggeringEvent:form:formValues:]):
(-[WebBridge postWithURL:referrer:target:data:contentType:triggeringEvent:form:formValues:]):
(-[WebBridge createChildFrameNamed:withURL:referrer:renderPart:allowsScrolling:marginWidth:marginHeight:]):
(-[WebBridge viewForPluginWithURL:attributeNames:attributeValues:MIMEType:]):
* WebView.subproj/WebFrame.m:
(-[WebFrame _loadURL:referrer:intoChild:]):
* WebView.subproj/WebFramePrivate.h:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8837
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2005-03-06 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Darin.
+
+ <rdar://problem/4005575> Arbitrary file disclosure vulnerability due to ability to load local html from remote content
+
+ * khtml/ecma/kjs_html.cpp:
+ (KJS::HTMLDocument::putValue):
+ * khtml/ecma/kjs_window.cpp:
+ (Window::put):
+ (WindowFunc::tryCall):
+ (Location::put):
+ (LocationFunc::tryCall):
+ * khtml/khtml_part.cpp:
+ (KHTMLPart::begin):
+ (KHTMLPart::scheduleLocationChange):
+ (KHTMLPart::slotRedirect):
+ (KHTMLPart::processObjectRequest):
+ * khtml/khtml_part.h:
+ * khtml/khtmlpart_p.h:
+ * kwq/KWQKHTMLPart.mm:
+ (KWQKHTMLPart::openURLRequest):
+ (KWQKHTMLPart::urlSelected):
+ (KWQKHTMLPart::createPart):
+ * kwq/KWQKHTMLPartBrowserExtension.mm:
+ (KHTMLPartBrowserExtension::createNewWindow):
+ * kwq/WebCoreBridge.h:
+ * kwq/WebCoreBridge.mm:
+ (hasCaseInsensitivePrefix):
+ (-[WebCoreBridge didNotOpenURL:pageCache:]):
+ (-[WebCoreBridge canLoadURL:fromReferrer:hideReferrer:]):
+
2005-03-09 Richard Williamson <rjw@apple.com>
Fixed <rdar://problem/4032938> Safari: text layout for MS P Gothic font is corrupted
#if APPLE_CHANGES
// We want a new history item if this JS was called via a user gesture
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
- part->scheduleLocationChange(str, !userGesture);
+ part->scheduleLocationChange(str, activePart->referrer(), !userGesture);
#else
- part->scheduleLocationChange(str, false/*don't lock history*/);
+ part->scheduleLocationChange(str, activePart->referrer(), false/*don't lock history*/);
#endif
}
break;
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
#if APPLE_CHANGES
// We want a new history item if this JS was called via a user gesture
- m_part->scheduleLocationChange(dstUrl, !userGesture, userGesture);
+ m_part->scheduleLocationChange(dstUrl, p->referrer(), !userGesture, userGesture);
#else
- m_part->scheduleLocationChange(dstUrl, false /*don't lock history*/, userGesture);
+ m_part->scheduleLocationChange(dstUrl, p->referrer(), false /*don't lock history*/, userGesture);
#endif
}
}
// prepare arguments
KURL url;
+ KHTMLPart* activePart = Window::retrieveActive(exec)->m_part;
if (!str.isEmpty())
{
- KHTMLPart* p = Window::retrieveActive(exec)->m_part;
- if ( p )
- url = p->htmlDocument().completeURL(str).string();
+ if (activePart)
+ url = activePart->htmlDocument().completeURL(str).string();
}
KParts::URLArgs uargs;
uargs.frameName = frameName;
if ( uargs.frameName == "_top" )
{
- // FIXME: referrer?
while ( part->parentPart() )
part = part->parentPart();
const Window* window = Window::retrieveWindow(part);
if (!url.url().startsWith("javascript:", false) || (window && window->isSafeScript(exec))) {
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
- part->scheduleLocationChange(url.url(), false/*don't lock history*/, userGesture);
+ part->scheduleLocationChange(url.url(), activePart->referrer(), false/*don't lock history*/, userGesture);
}
return Window::retrieve(part);
}
if ( uargs.frameName == "_parent" )
{
- // FIXME: referrer?
if ( part->parentPart() )
part = part->parentPart();
const Window* window = Window::retrieveWindow(part);
if (!url.url().startsWith("javascript:", false) || (window && window->isSafeScript(exec))) {
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
- part->scheduleLocationChange(url.url(), false/*don't lock history*/, userGesture);
+ part->scheduleLocationChange(url.url(), activePart->referrer(), false/*don't lock history*/, userGesture);
}
return Window::retrieve(part);
}
// request window (new or existing if framename is set)
KParts::ReadOnlyPart *newPart = 0L;
+ uargs.metaData()["referrer"] = activePart->referrer();
emit part->browserExtension()->createNewWindow("", uargs,winargs,newPart);
if (newPart && newPart->inherits("KHTMLPart")) {
KHTMLPart *khtmlpart = static_cast<KHTMLPart*>(newPart);
const Window* window = Window::retrieveWindow(khtmlpart);
if (!url.url().startsWith("javascript:", false) || (window && window->isSafeScript(exec))) {
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
- // FIXME: Need to pass referrer here.
- khtmlpart->scheduleLocationChange(url.url(), false, userGesture);
+ khtmlpart->scheduleLocationChange(url.url(), activePart->referrer(), false, userGesture);
}
}
#else
uargs.serviceType = QString::null;
if (uargs.frameName == "_blank")
uargs.frameName = QString::null;
- if (!url.isEmpty())
- // FIXME: need to pass referrer here
+ if (!url.isEmpty()) {
+ uargs.metaData()["referrer"] = activePart->referrer();
emit khtmlpart->browserExtension()->openURLRequest(url,uargs);
+ }
#endif
return Window::retrieve(khtmlpart); // global object
} else
}
const Window* window = Window::retrieveWindow(m_part);
+ KHTMLPart* activePart = Window::retrieveActive(exec)->part();
if (!url.url().startsWith("javascript:", false) || (window && window->isSafeScript(exec))) {
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
#if APPLE_CHANGES
// We want a new history item if this JS was called via a user gesture
- m_part->scheduleLocationChange(url.url(), !userGesture, userGesture);
+ m_part->scheduleLocationChange(url.url(), activePart->referrer(), !userGesture, userGesture);
#else
- m_part->scheduleLocationChange(url.url(), false /*don't lock history*/, userGesture);
+ m_part->scheduleLocationChange(url.url(), activePart->referrer(), false /*don't lock history*/, userGesture);
#endif
}
}
const Window* window = Window::retrieveWindow(part);
if (!str.startsWith("javascript:", false) || (window && window->isSafeScript(exec))) {
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
- part->scheduleLocationChange(p->htmlDocument().completeURL(str).string(), true /*lock history*/, userGesture);
+ part->scheduleLocationChange(p->htmlDocument().completeURL(str).string(), p->referrer(), true /*lock history*/, userGesture);
}
}
break;
case Location::Reload:
{
const Window* window = Window::retrieveWindow(part);
- if (!part->url().url().startsWith("javascript:", false) || (window && window->isSafeScript(exec))) {
+ KHTMLPart* activePart = Window::retrieveActive(exec)->part();
+ if (!part->url().url().startsWith("javascript:", false) || (window && window->isSafeScript(exec))) {
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
- part->scheduleLocationChange(part->url().url(), true/*lock history*/, userGesture);
+ part->scheduleLocationChange(part->url().url(), activePart->referrer(), true/*lock history*/, userGesture);
}
break;
}
d->m_scheduledRedirection = noRedirectionScheduled;
d->m_delayRedirect = 0;
d->m_redirectURL = QString::null;
+ d->m_redirectReferrer = QString::null;
d->m_redirectLockHistory = true;
d->m_redirectUserGesture = false;
d->m_bHTTPRefresh = false;
ref.setUser(QSTRING_NULL);
ref.setPass(QSTRING_NULL);
ref.setRef(QSTRING_NULL);
- d->m_referrer = ref.protocol().startsWith("http") ? ref.url() : "";
+ d->m_referrer = ref.url();
m_url = url;
KURL baseurl;
d->m_scheduledRedirection = redirectionScheduled;
d->m_delayRedirect = delay;
d->m_redirectURL = url;
+ d->m_redirectReferrer = QString::null;
d->m_redirectLockHistory = doLockHistory;
d->m_redirectUserGesture = false;
}
}
-void KHTMLPart::scheduleLocationChange(const QString &url, bool lockHistory, bool userGesture)
+void KHTMLPart::scheduleLocationChange(const QString &url, const QString &referrer, bool lockHistory, bool userGesture)
{
// Handle a location change of a page with no document as a special case.
// This may happen when a frame changes the location of another frame.
d->m_scheduledRedirection = d->m_doc ? locationChangeScheduled : locationChangeScheduledDuringLoad;
d->m_delayRedirect = 0;
d->m_redirectURL = url;
+ d->m_redirectReferrer = referrer;
d->m_redirectLockHistory = lockHistory;
d->m_redirectUserGesture = userGesture;
d->m_redirectionTimer.stop();
d->m_scheduledRedirection = historyNavigationScheduled;
d->m_delayRedirect = 0;
d->m_redirectURL = QString::null;
+ d->m_redirectReferrer = QString::null;
d->m_scheduledHistoryNavigationSteps = steps;
d->m_redirectionTimer.stop();
if (d->m_bComplete)
}
QString u = d->m_redirectURL;
+
d->m_scheduledRedirection = noRedirectionScheduled;
d->m_delayRedirect = 0;
d->m_redirectURL = QString::null;
args.reload = true;
args.setLockHistory( d->m_redirectLockHistory );
+ if (!d->m_redirectReferrer.isEmpty())
+ args.metaData()["referrer"] = d->m_redirectReferrer;
+ d->m_redirectReferrer = QString::null;
+
urlSelected( u, 0, 0, "_self", args );
}
if ( child->m_part )
{
KHTMLPart *part = static_cast<KHTMLPart *>(&*child->m_part);
- if (part && part->inherits("KHTMLPart"))
- part->openURL(url);
+ if (part && part->inherits("KHTMLPart")) {
+ KParts::URLArgs args;
+ if (!d->m_referrer.isEmpty())
+ args.metaData()["referrer"] = d->m_referrer;
+ KWQ(part)->openURLRequest(url, args);
+ }
}
else
{
* Schedules a location change.
* This is used for JavaScript-triggered location changes.
*/
- void scheduleLocationChange(const QString &url, bool lockHistory = true, bool userGesture = false);
+ void scheduleLocationChange(const QString &url, const QString &referrer, bool lockHistory = true, bool userGesture = false);
bool isScheduledLocationChangePending() const;
/**
RedirectionScheduled m_scheduledRedirection;
double m_delayRedirect;
QString m_redirectURL;
+ QString m_redirectReferrer;
int m_scheduledHistoryNavigationSteps;
#if !APPLE_CHANGES
{
KWQ_BLOCK_EXCEPTIONS;
+ NSString *referrer;
+ QString argsReferrer = args.metaData()["referrer"];
+ if (!argsReferrer.isEmpty()) {
+ referrer = argsReferrer.getNSString();
+ } else {
+ referrer = [_bridge referrer];
+ }
+
[_bridge loadURL:url.getNSURL()
- referrer:[_bridge referrer]
+ referrer:referrer
reload:args.reload
userGesture:true
target:args.frameName.getNSString()
void KWQKHTMLPart::urlSelected(const KURL &url, int button, int state, const URLArgs &args)
{
KWQ_BLOCK_EXCEPTIONS;
+
+ NSString *referrer;
+ QString argsReferrer = args.metaData()["referrer"];
+ if (!argsReferrer.isEmpty()) {
+ referrer = argsReferrer.getNSString();
+ } else {
+ referrer = [_bridge referrer];
+ }
+
[_bridge loadURL:url.getNSURL()
- referrer:[_bridge referrer]
+ referrer:referrer
reload:args.reload
userGesture:true
target:args.frameName.getNSString()
triggeringEvent:_currentEvent
form:nil
formValues:nil];
+
KWQ_UNBLOCK_EXCEPTIONS;
}
}
WebCoreBridge *childBridge = [_bridge createChildFrameNamed:child.m_name.getNSString()
withURL:url.getNSURL()
+ referrer:child.m_args.metaData()["referrer"].getNSString()
renderPart:child.m_frame
allowsScrolling:allowsScrolling
marginWidth:marginWidth
NSString *frameName = urlArgs.frameName.length() == 0 ? nil : urlArgs.frameName.getNSString();
WebCoreBridge *bridge;
-
+
+ NSString *referrer;
+ QString argsReferrer = urlArgs.metaData()["referrer"];
+ if (argsReferrer.length() > 0) {
+ referrer = argsReferrer.getNSString();
+ } else {
+ referrer = [_part->bridge() referrer];
+ }
+
+
if (frameName != nil) {
bridge = [_part->bridge() findFrameNamed:frameName];
if (bridge != nil) {
if (!url.isEmpty()) {
- [bridge loadURL:url.getNSURL() referrer:[_part->bridge() referrer] reload:urlArgs.reload userGesture:true target:nil triggeringEvent:nil form:nil formValues:nil];
+ [bridge loadURL:url.getNSURL() referrer:referrer reload:urlArgs.reload userGesture:true target:nil triggeringEvent:nil form:nil formValues:nil];
}
[bridge focusWindow];
if (partResult) {
- (void)didNotOpenURL:(NSURL *)URL pageCache:(NSDictionary *)pageCache;
+- (BOOL)canLoadURL:(NSURL *)URL fromReferrer:(NSString *)referrer hideReferrer:(BOOL *)hideReferrer;
+
- (void)saveDocumentState;
- (void)restoreDocumentState;
- (void)setIconURL:(NSURL *)URL withType:(NSString *)string;
- (WebCoreBridge *)createChildFrameNamed:(NSString *)frameName withURL:(NSURL *)URL
+ referrer:(NSString *)referrer
renderPart:(KHTMLRenderPart *)renderPart
allowsScrolling:(BOOL)allowsScrolling marginWidth:(int)width marginHeight:(int)height;
return YES;
}
+static BOOL hasCaseInsensitivePrefix(NSString *string, NSString *prefix)
+{
+ return [string rangeOfString:prefix options:(NSCaseInsensitiveSearch | NSAnchoredSearch)].location !=
+ NSNotFound;
+}
+
@implementation WebCoreBridge
static bool initializedObjectCacheSize = FALSE;
[state invalidate];
}
+- (BOOL)canLoadURL:(NSURL *)URL fromReferrer:(NSString *)referrer hideReferrer:(BOOL *)hideReferrer
+{
+ *hideReferrer = !hasCaseInsensitivePrefix(referrer,@"http:") && !hasCaseInsensitivePrefix(referrer, @"https:");
+ BOOL referrerIsFileURL = hasCaseInsensitivePrefix(referrer, @"file:");
+ BOOL URLIsFileURL = [[URL scheme] compare:@"file" options:(NSCaseInsensitiveSearch|NSLiteralSearch)] == NSOrderedSame;
+
+ return referrerIsFileURL || !URLIsFileURL;
+}
+
- (void)saveDocumentState
{
DocumentImpl *doc = _part->xmlDocImpl();
+2005-03-06 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Darin.
+
+ <rdar://problem/4005575> Arbitrary file disclosure vulnerability due to ability to load local html from remote content
+
+ * Plugins.subproj/WebBaseNetscapePluginView.m:
+ (-[WebBaseNetscapePluginView requestWithURLCString:]):
+ * Plugins.subproj/WebNetscapePluginEmbeddedView.m:
+ (-[WebNetscapePluginEmbeddedView didStart]):
+ * Plugins.subproj/WebNetscapePluginStream.m:
+ (-[WebNetscapePluginStream initWithRequest:pluginPointer:notifyData:sendNotification:]):
+ * WebCoreSupport.subproj/WebBridge.m:
+ (-[WebBridge createWindowWithURL:frameName:]):
+ (-[WebBridge startLoadingResource:withURL:customHeaders:]):
+ (-[WebBridge startLoadingResource:withURL:customHeaders:postData:]):
+ (-[WebBridge syncLoadResourceWithURL:customHeaders:postData:finalURL:responseHeaders:statusCode:]):
+ (-[WebBridge loadURL:referrer:reload:userGesture:target:triggeringEvent:form:formValues:]):
+ (-[WebBridge postWithURL:referrer:target:data:contentType:triggeringEvent:form:formValues:]):
+ (-[WebBridge createChildFrameNamed:withURL:referrer:renderPart:allowsScrolling:marginWidth:marginHeight:]):
+ (-[WebBridge viewForPluginWithURL:attributeNames:attributeValues:MIMEType:]):
+ * WebView.subproj/WebFrame.m:
+ (-[WebFrame _loadURL:referrer:intoChild:]):
+ * WebView.subproj/WebFramePrivate.h:
+
2005-03-09 Richard Williamson <rjw@apple.com>
Fixed <rdar://problem/4032938> Safari: text layout for MS P Gothic font is corrupted
return nil;
}
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
- [request setHTTPReferrer:[[[[self dataSource] request] URL] _web_originalDataAsString]];
+ [request setHTTPReferrer:[[[self webFrame] _bridge] referrer]];
return request;
}
#import <WebKit/WebNetscapePluginEmbeddedView.h>
#import <WebKit/WebBaseNetscapePluginViewPrivate.h>
+#import <WebKit/WebBridge.h>
#import <WebKit/WebDataSource.h>
#import <WebKit/WebFrame.h>
+#import <WebKit/WebFramePrivate.h>
#import <WebKit/WebFrameView.h>
#import <WebKit/WebNetscapePluginPackage.h>
#import <WebKit/WebNSViewExtras.h>
// Check for this and don't start a load in this case.
if (URL != nil && ![URL _web_isEmpty]) {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
- [request setHTTPReferrer:[[[[self dataSource] request] URL] _web_originalDataAsString]];
+ [request setHTTPReferrer:[[[self webFrame] _bridge] referrer]];
[self loadRequest:request inTarget:nil withNotifyData:nil sendNotification:NO];
}
}
#import <WebKit/WebNetscapePluginStream.h>
#import <WebKit/WebBaseResourceHandleDelegate.h>
+#import <WebKit/WebBridge.h>
#import <WebKit/WebDataSourcePrivate.h>
#import <WebKit/WebKitErrorsPrivate.h>
#import <WebKit/WebKitLogging.h>
#import <Foundation/NSError_NSURLExtras.h>
#import <Foundation/NSURLConnection.h>
#import <Foundation/NSURLResponsePrivate.h>
-#import <Foundation/NSURLRequest.h>
+#import <Foundation/NSURLRequestPrivate.h>
@interface WebNetscapePluginConnectionDelegate : WebBaseResourceHandleDelegate
{
notifyData:(void *)theNotifyData
sendNotification:(BOOL)flag
{
+ WebBaseNetscapePluginView *view = (WebBaseNetscapePluginView *)thePluginPointer->ndata;
+
+ WebBridge *bridge = [[view webFrame] _bridge];
+ BOOL hideReferrer;
+ if (![bridge canLoadURL:[request URL] fromReferrer:[bridge referrer] hideReferrer:&hideReferrer])
+ return nil;
+
if ([self initWithRequestURL:[theRequest URL]
pluginPointer:thePluginPointer
notifyData:theNotifyData
return nil;
}
- request = [theRequest copy];
+ request = [theRequest mutableCopy];
+ if (hideReferrer) {
+ [(NSMutableURLRequest *)request setHTTPReferrer:nil];
+ }
- WebBaseNetscapePluginView *view = (WebBaseNetscapePluginView *)instance->ndata;
_loader = [[WebNetscapePluginConnectionDelegate alloc] initWithStream:self view:view];
[_loader setDataSource:[view dataSource]];
return nil;
}
+ BOOL hideReferrer;
+ if (![self canLoadURL:URL fromReferrer:[self referrer] hideReferrer:&hideReferrer])
+ return nil;
+
return [WebSubresourceClient startLoadingResource:resourceLoader
withURL:URL
- customHeaders:customHeaders
- referrer:[self referrer]
+ customHeaders:customHeaders
+ referrer:(hideReferrer ? nil : [self referrer])
forDataSource:[self dataSource]];
}
return nil;
}
+ BOOL hideReferrer;
+ if (![self canLoadURL:URL fromReferrer:[self referrer] hideReferrer:&hideReferrer])
+ return nil;
+
return [WebSubresourceClient startLoadingResource:resourceLoader
withURL:URL
customHeaders:customHeaders
postData:postData
- referrer:[self referrer]
+ referrer:(hideReferrer ? nil : [self referrer])
forDataSource:[self dataSource]];
}
- (NSData *)syncLoadResourceWithURL:(NSURL *)URL customHeaders:(NSDictionary *)requestHeaders postData:(NSArray *)postData finalURL:(NSURL **)finalURL responseHeaders:(NSDictionary **)responseHeaderDict statusCode:(int *)statusCode
{
+ BOOL hideReferrer;
+ if (![self canLoadURL:URL fromReferrer:[self referrer] hideReferrer:&hideReferrer])
+ return nil;
+
NSMutableURLRequest *newRequest = [[NSMutableURLRequest alloc] initWithURL:URL];
if (postData) {
// Never use cached data for these requests (xmlhttprequests).
[newRequest setCachePolicy:[[[self dataSource] request] cachePolicy]];
- [newRequest setHTTPReferrer:[self referrer]];
+ if (!hideReferrer)
+ [newRequest setHTTPReferrer:[self referrer]];
WebView *webView = [_frame webView];
[newRequest setMainDocumentURL:[[[[webView mainFrame] dataSource] request] URL]];
- (void)loadURL:(NSURL *)URL referrer:(NSString *)referrer reload:(BOOL)reload userGesture:(BOOL)forUser target:(NSString *)target triggeringEvent:(NSEvent *)event form:(DOMElement *)form formValues:(NSDictionary *)values
{
+ BOOL hideReferrer;
+ if (![self canLoadURL:URL fromReferrer:[self referrer] hideReferrer:&hideReferrer])
+ return;
+
if ([target length] == 0) {
target = nil;
}
loadType = WebFrameLoadTypeInternal;
else
loadType = WebFrameLoadTypeStandard;
- [_frame _loadURL:URL referrer:referrer loadType:loadType target:target triggeringEvent:event form:form formValues:values];
+ [_frame _loadURL:URL referrer:(hideReferrer ? nil : referrer) loadType:loadType target:target triggeringEvent:event form:form formValues:values];
if (targetFrame != nil && _frame != targetFrame) {
[[targetFrame _bridge] focusWindow];
- (void)postWithURL:(NSURL *)URL referrer:(NSString *)referrer target:(NSString *)target data:(NSArray *)postData contentType:(NSString *)contentType triggeringEvent:(NSEvent *)event form:(DOMElement *)form formValues:(NSDictionary *)values
{
+ BOOL hideReferrer;
+ if (![self canLoadURL:URL fromReferrer:[self referrer] hideReferrer:&hideReferrer])
+ return;
+
if ([target length] == 0) {
target = nil;
}
return;
}
- [_frame _postWithURL:URL referrer:referrer target:target data:postData contentType:contentType triggeringEvent:event form:form formValues:values];
+ [_frame _postWithURL:URL referrer:(hideReferrer ? nil : referrer) target:target data:postData contentType:contentType triggeringEvent:event form:form formValues:values];
if (targetFrame != nil && _frame != targetFrame) {
[[targetFrame _bridge] focusWindow];
return [_frame _generateFrameName];
}
-- (WebCoreBridge *)createChildFrameNamed:(NSString *)frameName withURL:(NSURL *)URL
- renderPart:(KHTMLRenderPart *)childRenderPart
- allowsScrolling:(BOOL)allowsScrolling marginWidth:(int)width marginHeight:(int)height
+- (WebCoreBridge *)createChildFrameNamed:(NSString *)frameName
+ withURL:(NSURL *)URL
+ referrer:(NSString *)referrer
+ renderPart:(KHTMLRenderPart *)childRenderPart
+ allowsScrolling:(BOOL)allowsScrolling
+ marginWidth:(int)width
+ marginHeight:(int)height
{
+ BOOL hideReferrer;
+ if (![self canLoadURL:URL fromReferrer:referrer hideReferrer:&hideReferrer])
+ return nil;
+
ASSERT(_frame != nil);
WebFrame *newFrame = [[_frame webView] _createFrameNamed:frameName inParent:_frame allowsScrolling:allowsScrolling];
if (newFrame == nil) {
[[newFrame frameView] _setMarginWidth:width];
[[newFrame frameView] _setMarginHeight:height];
- [_frame _loadURL:URL intoChild:newFrame];
+ [_frame _loadURL:URL referrer:(hideReferrer ? nil : referrer) intoChild:newFrame];
return [newFrame _bridge];
}
attributeValues:(NSArray *)attributeValues
MIMEType:(NSString *)MIMEType
{
+ BOOL hideReferrer;
+ if (![self canLoadURL:URL fromReferrer:[self referrer] hideReferrer:&hideReferrer])
+ return nil;
+
ASSERT([attributeNames count] == [attributeValues count]);
WebBasePluginPackage *pluginPackage = nil;
[formState release];
}
-- (void)_loadURL:(NSURL *)URL intoChild:(WebFrame *)childFrame
+- (void)_loadURL:(NSURL *)URL referrer:(NSString *)referrer intoChild:(WebFrame *)childFrame
{
WebHistoryItem *parentItem = [_private currentItem];
NSArray *childItems = [parentItem children];
if (archive) {
[childFrame loadArchive:archive];
} else {
- // FIXME: is this the right referrer?
- [childFrame _loadURL:URL referrer:[[self _bridge] referrer] loadType:childLoadType target:nil triggeringEvent:nil form:nil formValues:nil];
+ [childFrame _loadURL:URL referrer:referrer loadType:childLoadType target:nil triggeringEvent:nil form:nil formValues:nil];
}
}
- (void)_goToItem:(WebHistoryItem *)item withLoadType:(WebFrameLoadType)type;
- (void)_loadURL:(NSURL *)URL referrer:(NSString *)referrer loadType:(WebFrameLoadType)loadType target:(NSString *)target triggeringEvent:(NSEvent *)event form:(DOMElement *)form formValues:(NSDictionary *)values;
-- (void)_loadURL:(NSURL *)URL intoChild:(WebFrame *)childFrame;
+- (void)_loadURL:(NSURL *)URL referrer:(NSString *)referrer intoChild:(WebFrame *)childFrame;
- (void)_postWithURL:(NSURL *)URL referrer:(NSString *)referrer target:(NSString *)target data:(NSArray *)postData contentType:(NSString *)contentType triggeringEvent:(NSEvent *)event form:(DOMElement *)form formValues:(NSDictionary *)values;
- (void)_loadRequest:(NSURLRequest *)request inFrameNamed:(NSString *)frameName;