bool WebViewHost::navigate(const TestNavigationEntry& entry, bool reload) { // Get the right target frame for the entry. WebFrame* frame = webView()->mainFrame(); if (!entry.targetFrame().isEmpty()) frame = webView()->findFrameByName(entry.targetFrame()); // TODO(mpcomplete): should we clear the target frame, or should // back/forward navigations maintain the target frame? // A navigation resulting from loading a javascript URL should not be // treated as a browser initiated event. Instead, we want it to look as if // the page initiated any load resulting from JS execution. if (!GURL(entry.URL()).SchemeIs("javascript")) setPendingExtraData(adoptPtr(new TestShellExtraData(entry.pageID()))); // If we are reloading, then WebKit will use the state of the current page. // Otherwise, we give it the state to navigate to. if (reload) { frame->reload(false); } else if (!entry.contentState().isNull()) { ASSERT(entry.pageID() != -1); frame->loadHistoryItem(entry.contentState()); } else { ASSERT(entry.pageID() == -1); frame->loadRequest(WebURLRequest(entry.URL())); } // In case LoadRequest failed before DidCreateDataSource was called. setPendingExtraData(nullptr); // Restore focus to the main frame prior to loading new request. // This makes sure that we don't have a focused iframe. Otherwise, that // iframe would keep focus when the SetFocus called immediately after // LoadRequest, thus making some tests fail (see http://b/issue?id=845337 // for more details). webView()->setFocusedFrame(frame); m_shell->setFocus(webView(), true); return true; }