Index: chrome/test/chromedriver/commands.cc |
diff --git a/chrome/test/chromedriver/commands.cc b/chrome/test/chromedriver/commands.cc |
index e943038159c15ffd94a28e05fed37bc483c21579..f01dd8265e8316a29181daaba8c9be4eb022241e 100644 |
--- a/chrome/test/chromedriver/commands.cc |
+++ b/chrome/test/chromedriver/commands.cc |
@@ -103,5 +103,54 @@ Status ExecuteExecuteScript( |
return Status(kUnknownError, "'args' must be a list"); |
return session->chrome->CallFunction( |
- "function(){" + script + "}", *args, value); |
+ session->frame, "function(){" + script + "}", *args, value); |
+} |
+ |
+Status ExecuteSwitchToFrame( |
+ Session* session, |
+ const base::DictionaryValue& params, |
+ scoped_ptr<base::Value>* value) { |
+ const base::Value* id; |
+ if (!params.Get("id", &id)) |
+ return Status(kUnknownError, "missing 'id'"); |
+ |
+ if (id->IsType(base::Value::TYPE_NULL)) { |
+ session->frame = ""; |
+ return Status(kOk); |
+ } |
+ |
+ std::string script; |
+ if (id->IsType(base::Value::TYPE_STRING)) { |
+ script = |
+ "function(arg) {" |
+ " var xpath = '(/html/body//iframe|/html/frameset/frame)';" |
+ " var sub = function(s) { return s.replace(/\\$/g, arg); };" |
+ " xpath += sub('[@name=\"$\" or @id=\"$\"]');" |
+ " return document.evaluate(xpath, document, null, " |
craigdh
2012/12/20 20:03:38
Constructing these xpaths in C++ would reduce the
kkania
2013/01/08 18:30:11
I've gone and ahead and switched to C++ since it m
|
+ " XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" |
+ "}"; |
+ } else if (id->IsType(base::Value::TYPE_INTEGER)) { |
+ script = |
+ "function(index) {" |
+ " var xpathIndex = '[' + (index + 1) + ']';" |
+ " var xpath = '(/html/body//iframe|/html/frameset/frame)' + " |
+ " xpathIndex;" |
+ " return document.evaluate(xpath, document, null, " |
+ " XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" |
+ "}"; |
+ } else if (id->IsType(base::Value::TYPE_DICTIONARY)) { |
+ // TODO(kkania): Implement. |
+ return Status(kUnknownError, "frame switching by element not implemented"); |
+ } else { |
+ return Status(kUnknownError, "invalid 'id'"); |
+ } |
+ base::ListValue args; |
+ args.Append(id->DeepCopy()); |
+ std::string frame; |
+ Status status = session->chrome->GetFrameByFunction( |
+ session->frame, script, args, &frame); |
+ if (status.IsError()) |
+ return status; |
+ session->frame = frame; |
+ return Status(kOk); |
} |