| Index: webkit/glue/webframe_impl.cc
|
| ===================================================================
|
| --- webkit/glue/webframe_impl.cc (revision 19736)
|
| +++ webkit/glue/webframe_impl.cc (working copy)
|
| @@ -196,6 +196,8 @@
|
| using WebCore::ResourceHandle;
|
| using WebCore::ResourceRequest;
|
| using WebCore::VisibleSelection;
|
| +using WebCore::ScriptValue;
|
| +using WebCore::SecurityOrigin;
|
| using WebCore::SharedBuffer;
|
| using WebCore::String;
|
| using WebCore::SubstituteData;
|
| @@ -205,6 +207,7 @@
|
|
|
| using WebKit::WebCanvas;
|
| using WebKit::WebConsoleMessage;
|
| +using WebKit::WebData;
|
| using WebKit::WebDataSource;
|
| using WebKit::WebFindOptions;
|
| using WebKit::WebHistoryItem;
|
| @@ -212,6 +215,7 @@
|
| using WebKit::WebRect;
|
| using WebKit::WebScriptSource;
|
| using WebKit::WebSize;
|
| +using WebKit::WebString;
|
| using WebKit::WebURL;
|
| using WebKit::WebURLError;
|
| using WebKit::WebURLRequest;
|
| @@ -412,8 +416,25 @@
|
| frame_->init();
|
| }
|
|
|
| +void WebFrameImpl::Reload() {
|
| + frame_->loader()->saveDocumentAndScrollState();
|
| +
|
| + StopLoading(); // Make sure existing activity stops.
|
| + frame_->loader()->reload();
|
| +}
|
| +
|
| void WebFrameImpl::LoadRequest(const WebURLRequest& request) {
|
| - InternalLoadRequest(request, SubstituteData(), false);
|
| + const ResourceRequest* resource_request =
|
| + webkit_glue::WebURLRequestToResourceRequest(&request);
|
| + DCHECK(resource_request);
|
| +
|
| + if (resource_request->url().protocolIs("javascript")) {
|
| + LoadJavaScriptURL(resource_request->url());
|
| + return;
|
| + }
|
| +
|
| + StopLoading(); // Make sure existing activity stops.
|
| + frame_->loader()->load(*resource_request, false);
|
| }
|
|
|
| void WebFrameImpl::LoadHistoryItem(const WebHistoryItem& item) {
|
| @@ -421,7 +442,7 @@
|
| webkit_glue::WebHistoryItemToHistoryItem(item);
|
| DCHECK(history_item.get());
|
|
|
| - StopLoading(); // make sure existing activity stops
|
| + StopLoading(); // Make sure existing activity stops.
|
|
|
| // If there is no current_item, which happens when we are navigating in
|
| // session history after a crash, we need to manufacture one otherwise WebKit
|
| @@ -438,80 +459,41 @@
|
| WebCore::FrameLoadTypeIndexedBackForward);
|
| }
|
|
|
| -void WebFrameImpl::InternalLoadRequest(const WebURLRequest& request,
|
| - const SubstituteData& data,
|
| - bool replace) {
|
| - const ResourceRequest* resource_request =
|
| - webkit_glue::WebURLRequestToResourceRequest(&request);
|
| - DCHECK(resource_request);
|
| +void WebFrameImpl::LoadData(const WebData& data,
|
| + const WebString& mime_type,
|
| + const WebString& text_encoding,
|
| + const WebURL& base_url,
|
| + const WebURL& unreachable_url,
|
| + bool replace) {
|
| + SubstituteData subst_data(
|
| + webkit_glue::WebDataToSharedBuffer(data),
|
| + webkit_glue::WebStringToString(mime_type),
|
| + webkit_glue::WebStringToString(text_encoding),
|
| + webkit_glue::WebURLToKURL(unreachable_url));
|
| + DCHECK(subst_data.isValid());
|
|
|
| - // Special-case javascript URLs. Do not interrupt the existing load when
|
| - // asked to load a javascript URL unless the script generates a result. We
|
| - // can't just use FrameLoader::executeIfJavaScriptURL because it doesn't
|
| - // handle redirects properly.
|
| - const KURL& kurl = resource_request->url();
|
| - if (!data.isValid() && kurl.protocol() == "javascript") {
|
| - // Don't attempt to reload javascript URLs.
|
| - if (resource_request->cachePolicy() == ReloadIgnoringCacheData)
|
| - return;
|
| -
|
| - // We can't load a javascript: URL if there is no Document!
|
| - if (!frame_->document())
|
| - return;
|
| -
|
| - // TODO(darin): Is this the best API to use here? It works and seems
|
| - // good, but will it change out from under us?
|
| - String script = decodeURLEscapeSequences(
|
| - kurl.string().substring(sizeof("javascript:")-1));
|
| - WebCore::ScriptValue result = frame_->loader()->executeScript(script, true);
|
| - String scriptResult;
|
| - if (result.getString(scriptResult) &&
|
| - !frame_->loader()->isScheduledLocationChangePending()) {
|
| - // TODO(darin): We need to figure out how to represent this in session
|
| - // history. Hint: don't re-eval script when the user or script
|
| - // navigates back-n-forth (instead store the script result somewhere).
|
| - LoadDocumentData(kurl, scriptResult, String("text/html"), String());
|
| - }
|
| - return;
|
| + StopLoading(); // Make sure existing activity stops.
|
| + frame_->loader()->load(ResourceRequest(webkit_glue::WebURLToKURL(base_url)),
|
| + subst_data, false);
|
| + if (replace) {
|
| + // Do this to force WebKit to treat the load as replacing the currently
|
| + // loaded page.
|
| + frame_->loader()->setReplacing();
|
| }
|
| -
|
| - StopLoading(); // make sure existing activity stops
|
| -
|
| - if (data.isValid()) {
|
| - DCHECK(resource_request);
|
| - frame_->loader()->load(*resource_request, data, false);
|
| - if (replace) {
|
| - // Do this to force WebKit to treat the load as replacing the currently
|
| - // loaded page.
|
| - frame_->loader()->setReplacing();
|
| - }
|
| - } else if (resource_request->cachePolicy() == ReloadIgnoringCacheData) {
|
| - frame_->loader()->reload();
|
| - } else {
|
| - frame_->loader()->load(*resource_request, false);
|
| - }
|
| }
|
|
|
| -void WebFrameImpl::LoadHTMLString(const std::string& html_text,
|
| - const GURL& base_url) {
|
| - LoadAlternateHTMLString(WebURLRequest(base_url), html_text, GURL(), false);
|
| +void WebFrameImpl::LoadHTMLString(const WebData& data,
|
| + const WebURL& base_url,
|
| + const WebURL& unreachable_url,
|
| + bool replace) {
|
| + LoadData(data,
|
| + WebString::fromUTF8("text/html"),
|
| + WebString::fromUTF8("UTF-8"),
|
| + base_url,
|
| + unreachable_url,
|
| + replace);
|
| }
|
|
|
| -void WebFrameImpl::LoadAlternateHTMLString(const WebURLRequest& request,
|
| - const std::string& html_text,
|
| - const GURL& display_url,
|
| - bool replace) {
|
| - int len = static_cast<int>(html_text.size());
|
| - RefPtr<SharedBuffer> buf = SharedBuffer::create(html_text.data(), len);
|
| -
|
| - SubstituteData subst_data(
|
| - buf, String("text/html"), String("UTF-8"),
|
| - webkit_glue::GURLToKURL(display_url));
|
| - DCHECK(subst_data.isValid());
|
| -
|
| - InternalLoadRequest(request, subst_data, replace);
|
| -}
|
| -
|
| GURL WebFrameImpl::GetURL() const {
|
| const WebDataSource* ds = GetDataSource();
|
| if (!ds)
|
| @@ -579,32 +561,6 @@
|
| frame_->page()->backForwardList()->currentItem());
|
| }
|
|
|
| -void WebFrameImpl::LoadDocumentData(const KURL& base_url,
|
| - const String& data,
|
| - const String& mime_type,
|
| - const String& charset) {
|
| - // TODO(darin): This is wrong. We need to re-cast this in terms of a call to
|
| - // one of the FrameLoader::load(...) methods. Else, WebCore will be angry!!
|
| -
|
| - // Requiring a base_url here seems like a good idea for security reasons.
|
| - ASSERT(!base_url.isEmpty());
|
| - ASSERT(!mime_type.isEmpty());
|
| -
|
| - StopLoading();
|
| -
|
| - // Reset any pre-existing scroll offset
|
| - frameview()->setScrollPosition(WebCore::IntPoint());
|
| -
|
| - // Make sure the correct document type is constructed.
|
| - frame_->loader()->setResponseMIMEType(mime_type);
|
| -
|
| - // TODO(darin): Inform the FrameLoader of the charset somehow.
|
| -
|
| - frame_->loader()->begin(base_url);
|
| - frame_->loader()->write(data);
|
| - frame_->loader()->end();
|
| -}
|
| -
|
| static WebDataSource* DataSourceForDocLoader(DocumentLoader* loader) {
|
| return loader ? WebDataSourceImpl::FromLoader(loader) : NULL;
|
| }
|
| @@ -1600,15 +1556,14 @@
|
| const GURL& error_page_url,
|
| bool replace,
|
| const GURL& fake_url) {
|
| - // Load alternate HTML in place of the previous request. We create a copy of
|
| - // the original request so we can replace its URL with a dummy URL. That
|
| - // prevents other web content from the same origin as the failed URL to
|
| - // script the error page.
|
| - WebURLRequest failed_request(request);
|
| - failed_request.setURL(fake_url);
|
| + // Load alternate HTML in place of the previous request. We use a fake_url
|
| + // for the Base URL. That prevents other web content from the same origin
|
| + // as the failed URL to script the error page.
|
|
|
| - LoadAlternateHTMLString(failed_request, std::string(),
|
| - error.unreachableURL, replace);
|
| + LoadHTMLString("", // Empty document
|
| + fake_url,
|
| + error.unreachableURL,
|
| + replace);
|
|
|
| alt_error_page_fetcher_.reset(new AltErrorPageResourceFetcher(
|
| GetWebViewImpl(), error, this, error_page_url));
|
| @@ -1843,3 +1798,32 @@
|
| }
|
| password_listeners_.clear();
|
| }
|
| +
|
| +void WebFrameImpl::LoadJavaScriptURL(const KURL& url) {
|
| + // This is copied from FrameLoader::executeIfJavaScriptURL. Unfortunately,
|
| + // we cannot just use that method since it is private, and it also doesn't
|
| + // quite behave as we require it to for bookmarklets. The key difference is
|
| + // that we need to suppress loading the string result from evaluating the JS
|
| + // URL if executing the JS URL resulted in a location change. We also allow
|
| + // a JS URL to be loaded even if scripts on the page are otherwise disabled.
|
| +
|
| + if (!frame_->document() || !frame_->page())
|
| + return;
|
| +
|
| + String script =
|
| + decodeURLEscapeSequences(url.string().substring(strlen("javascript:")));
|
| + ScriptValue result = frame_->loader()->executeScript(script, true);
|
| +
|
| + String script_result;
|
| + if (!result.getString(script_result))
|
| + return;
|
| +
|
| + SecurityOrigin* security_origin = frame_->document()->securityOrigin();
|
| +
|
| + if (!frame_->loader()->isScheduledLocationChangePending()) {
|
| + frame_->loader()->stopAllLoaders();
|
| + frame_->loader()->begin(frame_->loader()->url(), true, security_origin);
|
| + frame_->loader()->write(script_result);
|
| + frame_->loader()->end();
|
| + }
|
| +}
|
|
|